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)); + } }