prototype.create properties creating with direct typing (@type)
(better) support for @depercation and @protected
diff --git a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java
index 13673e2..1f0c063 100644
--- a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java
+++ b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java
@@ -617,7 +617,7 @@
if (valueMember != null) {
newMembers.add(new RRecordMember(member
.getName(), valueMember
- .getType(), valueMember
+ .getType(), member
.getSource()));
}
valueMember = ((IRRecordType) member
@@ -633,6 +633,8 @@
.getName(), valueType,
valueMember.getSource()));
}
+ } else {
+ newMembers.add(member);
}
}
if (newMembers.size() > 0) {
@@ -1453,6 +1455,8 @@
getTypeChecker());
jsdocSupport.parseDeprecation(source, tags,
reporter);
+ jsdocSupport.parseAccessModifiers(source, tags,
+ reporter);
}
}
} else {
diff --git a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java
index 04d7dbc..da6297d 100644
--- a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java
+++ b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java
@@ -1391,6 +1391,15 @@
}
}
+ private void reportDeprecatedRecordMember(ASTNode node,
+ IValueReference reference, IRRecordMember method) {
+ IRType type = JavaScriptValidations.typeOf(reference.getParent());
+ final String msg = NLS.bind(ValidationMessages.DeprecatedProperty,
+ method.getName(), type != null ? type.getName() : null);
+ reporter.reportProblem(JavaScriptProblems.DEPRECATED_PROPERTY, msg,
+ node.sourceStart(), node.sourceEnd());
+ }
+
private void reportMethodParameterError(ASTNode methodNode,
IValueReference[] arguments, IRMethod method) {
if (method.getDeclaringType() != null) {
@@ -2003,6 +2012,9 @@
else if (member instanceof IRMethod)
reportDeprecatedMethod(propName, result,
(IRMethod) member);
+ else if (member instanceof IRRecordMember)
+ reportDeprecatedRecordMember(propName, result,
+ (IRRecordMember) member);
}
} else if (!member.isVisible()) {
final IRProperty parentProperty = ValueReferenceUtil
@@ -2043,7 +2055,7 @@
// result.getName(), type.getName()), propName
// .sourceStart(), propName.sourceEnd());
} else if (member.getVisibility() != Visibility.PUBLIC) {
- validateAccessibility(propName, member);
+ validateAccessibility(propName, result, member);
}
} else if ((!exists && !result.exists())
&& !isDynamicArrayAccess(result)) {
diff --git a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java
index 7943781..c47997f 100644
--- a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java
+++ b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java
@@ -1140,5 +1140,79 @@
// assertFalse(names.contains("protectedMethod"));
}
+
+
+ public void testPrototypeChainWithPropetiesWithTypeDeclaration() {
+ final StringList code = new StringList();
+ code.add("function BaseEntity() {}");
+ code.add("/**");
+ code.add(" * @extends {BaseEntity}");
+ code.add(" */");
+ code.add("function ExtendedEntity() {}");
+ code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype, {");
+ code.add("/**");
+ code.add(" * @type {String}");
+ code.add(" */");
+ code.add("foo: {configurable: false,get: function() { return 10 },set: function(value){ },value: null},");
+ code.add("bar:{ writable:true, configurable:true, value: 'hello' }});");
+ code.add("function test() {");
+ code.add(" var x = new ExtendedEntity();");
+ code.add(" x.");
+ code.add("}");
+
+ final IModuleSource module = new TestModule(code.toString());
+ final List<CompletionProposal> results = new ArrayList<CompletionProposal>();
+ final ICompletionEngine completionEngine = createEngine(results,
+ JSCompletionEngine.OPTION_KEYWORDS);
+ completionEngine.complete(module, lastPositionInFile("x.", module), 0);
+ assertEquals(9, results.size());
+
+ HashSet<String> names = new HashSet<String>(16);
+ for (CompletionProposal cp : results) {
+ names.add(cp.getName());
+ }
+
+ assertTrue(names.contains("foo"));
+ assertTrue(names.contains("bar"));
+ }
+
+ public void testPrototypeChainWithPropetiesWithTypeDeclarationProtected() {
+ if (notYetImplemented(this)) return;
+ final StringList code = new StringList();
+ code.add("function BaseEntity() {}");
+ code.add("/**");
+ code.add(" * @extends {BaseEntity}");
+ code.add(" */");
+ code.add("function ExtendedEntity() {}");
+ code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype, {");
+ code.add("/**");
+ code.add(" * @type {String}");
+ code.add(" * @protected");
+ code.add(" */");
+ code.add("foo: {configurable: false,get: function() { return 10 },set: function(value){ },value: null},");
+ code.add("/**");
+ code.add(" * @protected");
+ code.add(" */");
+ code.add("bar:{ writable:true, configurable:true, value: 'hello' }});");
+ code.add("function test() {");
+ code.add(" var x = new ExtendedEntity();");
+ code.add(" x.;");
+ code.add("}");
+
+ final IModuleSource module = new TestModule(code.toString());
+ final List<CompletionProposal> results = new ArrayList<CompletionProposal>();
+ final ICompletionEngine completionEngine = createEngine(results,
+ JSCompletionEngine.OPTION_KEYWORDS);
+ completionEngine.complete(module, lastPositionInFile("x.", module), 0);
+ assertEquals(9, results.size());
+
+ HashSet<String> names = new HashSet<String>(16);
+ for (CompletionProposal cp : results) {
+ names.add(cp.getName());
+ }
+
+ assertFalse(names.contains("foo"));
+ assertFalse(names.contains("bar"));
+ }
}
diff --git a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/CodeValidatorValidationTests.java b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/CodeValidatorValidationTests.java
index 063726c..7577fd2 100644
--- a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/CodeValidatorValidationTests.java
+++ b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/CodeValidatorValidationTests.java
@@ -1,5 +1,7 @@
package org.eclipse.dltk.javascript.core.tests.validation;
+import static org.eclipse.dltk.core.tests.TestSupport.notYetImplemented;
+
import java.util.Set;
import org.eclipse.dltk.compiler.problem.IProblemIdentifier;
@@ -263,4 +265,55 @@
assertEquals(problemIds.toString(), 0, problemIds.size());
}
+ public void testPrototypeChainWithPropetiesWithTypeDeclarationDeprected() {
+ final StringList code = new StringList();
+ code.add("function BaseEntity() {}");
+ code.add("/**");
+ code.add(" * @extends {BaseEntity}");
+ code.add(" */");
+ code.add("function ExtendedEntity() {}");
+ code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype, {");
+ code.add("/**");
+ code.add(" * @type {String}");
+ code.add(" * @deprecated");
+ code.add(" */");
+ code.add("foo: {configurable: false,get: function() { return 10 },set: function(value){ },value: null},");
+ code.add("bar:{ writable:true, configurable:true, value: 'hello' }});");
+ code.add("function test() {");
+ code.add(" var x = new ExtendedEntity();");
+ code.add(" x.foo;");
+ code.add("}");
+ final Set<IProblemIdentifier> problemIds = extractIds(validate(code
+ .toString()));
+ assertEquals(problemIds.toString(), 1, problemIds.size());
+ assertTrue(problemIds.toString(),
+ problemIds.contains(JavaScriptProblems.DEPRECATED_PROPERTY));
+ }
+
+ public void testPrototypeChainWithPropetiesDeprected() {
+ final StringList code = new StringList();
+ code.add("function BaseEntity() {}");
+ code.add("/**");
+ code.add(" * @extends {BaseEntity}");
+ code.add(" */");
+ code.add("function ExtendedEntity() {}");
+ code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype, {");
+ code.add("/**");
+ code.add(" * @type {String}");
+ code.add(" */");
+ code.add("foo: {configurable: false,get: function() { return 10 },set: function(value){ },value: null},");
+ code.add("/**");
+ code.add(" * @deprecated");
+ code.add(" */");
+ code.add("bar:{ writable:true, configurable:true, value: 'hello' }});");
+ code.add("function test() {");
+ code.add(" var x = new ExtendedEntity();");
+ code.add(" x.bar;");
+ code.add("}");
+ final Set<IProblemIdentifier> problemIds = extractIds(validate(code
+ .toString()));
+ assertEquals(problemIds.toString(), 1, problemIds.size());
+ assertTrue(problemIds.toString(),
+ problemIds.contains(JavaScriptProblems.DEPRECATED_PROPERTY));
+ }
}