| Index: pkg/analyzer/lib/src/generated/resolver.dart
|
| diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
|
| index fa12291b94e390ae79b4e213cbb00fbe55e5eef4..10f97252743ef43d50fbcb9a6a563ea403542972 100644
|
| --- a/pkg/analyzer/lib/src/generated/resolver.dart
|
| +++ b/pkg/analyzer/lib/src/generated/resolver.dart
|
| @@ -3759,71 +3759,98 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
|
|
|
| @override
|
| Object visitMethodDeclaration(MethodDeclaration node) {
|
| - ElementHolder holder = new ElementHolder();
|
| - bool wasInFunction = _inFunction;
|
| - _inFunction = true;
|
| try {
|
| - _visitChildren(holder, node);
|
| - } finally {
|
| - _inFunction = wasInFunction;
|
| - }
|
| - bool isStatic = node.isStatic;
|
| - sc.Token property = node.propertyKeyword;
|
| - if (property == null) {
|
| - SimpleIdentifier methodName = node.name;
|
| - String nameOfMethod = methodName.name;
|
| - if (nameOfMethod == sc.TokenType.MINUS.lexeme && node.parameters.parameters.length == 0) {
|
| - nameOfMethod = "unary-";
|
| + ElementHolder holder = new ElementHolder();
|
| + bool wasInFunction = _inFunction;
|
| + _inFunction = true;
|
| + try {
|
| + _visitChildren(holder, node);
|
| + } finally {
|
| + _inFunction = wasInFunction;
|
| }
|
| - MethodElementImpl element = new MethodElementImpl(nameOfMethod, methodName.offset);
|
| - element.abstract = node.isAbstract;
|
| - element.functions = holder.functions;
|
| - element.labels = holder.labels;
|
| - element.localVariables = holder.localVariables;
|
| - element.parameters = holder.parameters;
|
| - element.static = isStatic;
|
| - _currentHolder.addMethod(element);
|
| - methodName.staticElement = element;
|
| - } else {
|
| - SimpleIdentifier propertyNameNode = node.name;
|
| - String propertyName = propertyNameNode.name;
|
| - FieldElementImpl field = _currentHolder.getField(propertyName) as FieldElementImpl;
|
| - if (field == null) {
|
| - field = new FieldElementImpl(node.name.name, -1);
|
| - field.final2 = true;
|
| - field.static = isStatic;
|
| - field.synthetic = true;
|
| - _currentHolder.addField(field);
|
| - }
|
| - if (_matches(property, sc.Keyword.GET)) {
|
| - PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.forNode(propertyNameNode);
|
| - getter.functions = holder.functions;
|
| - getter.labels = holder.labels;
|
| - getter.localVariables = holder.localVariables;
|
| - getter.variable = field;
|
| - getter.abstract = node.body is EmptyFunctionBody && node.externalKeyword == null;
|
| - getter.getter = true;
|
| - getter.static = isStatic;
|
| - field.getter = getter;
|
| - _currentHolder.addAccessor(getter);
|
| - propertyNameNode.staticElement = getter;
|
| + bool isStatic = node.isStatic;
|
| + sc.Token property = node.propertyKeyword;
|
| + if (property == null) {
|
| + SimpleIdentifier methodName = node.name;
|
| + String nameOfMethod = methodName.name;
|
| + if (nameOfMethod == sc.TokenType.MINUS.lexeme && node.parameters.parameters.length == 0) {
|
| + nameOfMethod = "unary-";
|
| + }
|
| + MethodElementImpl element = new MethodElementImpl(nameOfMethod, methodName.offset);
|
| + element.abstract = node.isAbstract;
|
| + element.functions = holder.functions;
|
| + element.labels = holder.labels;
|
| + element.localVariables = holder.localVariables;
|
| + element.parameters = holder.parameters;
|
| + element.static = isStatic;
|
| + _currentHolder.addMethod(element);
|
| + methodName.staticElement = element;
|
| } else {
|
| - PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.forNode(propertyNameNode);
|
| - setter.functions = holder.functions;
|
| - setter.labels = holder.labels;
|
| - setter.localVariables = holder.localVariables;
|
| - setter.parameters = holder.parameters;
|
| - setter.variable = field;
|
| - setter.abstract = node.body is EmptyFunctionBody && !_matches(node.externalKeyword, sc.Keyword.EXTERNAL);
|
| - setter.setter = true;
|
| - setter.static = isStatic;
|
| - field.setter = setter;
|
| - field.final2 = false;
|
| - _currentHolder.addAccessor(setter);
|
| - propertyNameNode.staticElement = setter;
|
| + SimpleIdentifier propertyNameNode = node.name;
|
| + String propertyName = propertyNameNode.name;
|
| + FieldElementImpl field = _currentHolder.getField(propertyName) as FieldElementImpl;
|
| + if (field == null) {
|
| + field = new FieldElementImpl(node.name.name, -1);
|
| + field.final2 = true;
|
| + field.static = isStatic;
|
| + field.synthetic = true;
|
| + _currentHolder.addField(field);
|
| + }
|
| + if (_matches(property, sc.Keyword.GET)) {
|
| + PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.forNode(propertyNameNode);
|
| + getter.functions = holder.functions;
|
| + getter.labels = holder.labels;
|
| + getter.localVariables = holder.localVariables;
|
| + getter.variable = field;
|
| + getter.abstract = node.body is EmptyFunctionBody && node.externalKeyword == null;
|
| + getter.getter = true;
|
| + getter.static = isStatic;
|
| + field.getter = getter;
|
| + _currentHolder.addAccessor(getter);
|
| + propertyNameNode.staticElement = getter;
|
| + } else {
|
| + PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.forNode(propertyNameNode);
|
| + setter.functions = holder.functions;
|
| + setter.labels = holder.labels;
|
| + setter.localVariables = holder.localVariables;
|
| + setter.parameters = holder.parameters;
|
| + setter.variable = field;
|
| + setter.abstract = node.body is EmptyFunctionBody && !_matches(node.externalKeyword, sc.Keyword.EXTERNAL);
|
| + setter.setter = true;
|
| + setter.static = isStatic;
|
| + field.setter = setter;
|
| + field.final2 = false;
|
| + _currentHolder.addAccessor(setter);
|
| + propertyNameNode.staticElement = setter;
|
| + }
|
| + }
|
| + holder.validate();
|
| + } on JavaException catch (ex) {
|
| + if (node.name.staticElement == null) {
|
| + ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
|
| + JavaStringBuilder builder = new JavaStringBuilder();
|
| + builder.append("The element for the method ");
|
| + builder.append(node.name);
|
| + builder.append(" in ");
|
| + builder.append(classNode.name);
|
| + builder.append(" was not set while trying to build the element model.");
|
| + AnalysisEngine.instance.logger.logError2(builder.toString(), new AnalysisException(builder.toString(), new CaughtException(ex, null)));
|
| + } else {
|
| + String message = "Exception caught in ElementBuilder.visitMethodDeclaration()";
|
| + AnalysisEngine.instance.logger.logError2(message, new AnalysisException(message, new CaughtException(ex, null)));
|
| + }
|
| + } finally {
|
| + if (node.name.staticElement == null) {
|
| + ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
|
| + JavaStringBuilder builder = new JavaStringBuilder();
|
| + builder.append("The element for the method ");
|
| + builder.append(node.name);
|
| + builder.append(" in ");
|
| + builder.append(classNode.name);
|
| + builder.append(" was not set while trying to resolve types.");
|
| + AnalysisEngine.instance.logger.logError2(builder.toString(), new CaughtException(new AnalysisException(builder.toString()), null));
|
| }
|
| }
|
| - holder.validate();
|
| return null;
|
| }
|
|
|
| @@ -6507,8 +6534,15 @@ class ElementResolver extends SimpleAstVisitor<Object> {
|
| names = (combinator as ShowCombinator).shownNames;
|
| }
|
| for (SimpleIdentifier name in names) {
|
| - Element element = namespace.get(name.name);
|
| + String nameStr = name.name;
|
| + Element element = namespace.get(nameStr);
|
| + if (element == null) {
|
| + element = namespace.get("${nameStr}=");
|
| + }
|
| if (element != null) {
|
| + if (element is PropertyAccessorElement) {
|
| + element = (element as PropertyAccessorElement).variable;
|
| + }
|
| name.staticElement = element;
|
| }
|
| }
|
| @@ -22840,6 +22874,23 @@ class TypeResolverVisitor extends ScopedVisitor {
|
| Object visitMethodDeclaration(MethodDeclaration node) {
|
| super.visitMethodDeclaration(node);
|
| ExecutableElementImpl element = node.element as ExecutableElementImpl;
|
| + if (element == null) {
|
| + ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
|
| + ClassElement classElement = classNode.element;
|
| + JavaStringBuilder builder = new JavaStringBuilder();
|
| + builder.append("The element for the method ");
|
| + builder.append(node.name);
|
| + builder.append(" in ");
|
| + builder.append(classNode.name);
|
| + builder.append(" in ");
|
| + if (classElement != null) {
|
| + builder.append(classElement.source.fullName);
|
| + } else {
|
| + builder.append("<element from class also not resolved>");
|
| + }
|
| + builder.append(" was not set while trying to resolve types.");
|
| + AnalysisEngine.instance.logger.logError2(builder.toString(), new AnalysisException());
|
| + }
|
| element.returnType = _computeReturnType(node.returnType);
|
| FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
|
| ClassElement definingClass = element.getAncestor((element) => element is ClassElement);
|
|
|