| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analyzer.src.generated.element_resolver; | 5 library analyzer.src.generated.element_resolver; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/ast/token.dart'; | 10 import 'package:analyzer/dart/ast/token.dart'; |
| 11 import 'package:analyzer/dart/ast/visitor.dart'; | 11 import 'package:analyzer/dart/ast/visitor.dart'; |
| 12 import 'package:analyzer/dart/element/element.dart'; | 12 import 'package:analyzer/dart/element/element.dart'; |
| 13 import 'package:analyzer/dart/element/type.dart'; | 13 import 'package:analyzer/dart/element/type.dart'; |
| 14 import 'package:analyzer/src/dart/ast/ast.dart' | 14 import 'package:analyzer/src/dart/ast/ast.dart' |
| 15 show ChildEntities, IdentifierImpl; | 15 show |
| 16 ChildEntities, |
| 17 IdentifierImpl, |
| 18 PrefixedIdentifierImpl, |
| 19 SimpleIdentifierImpl; |
| 20 import 'package:analyzer/src/dart/ast/token.dart'; |
| 16 import 'package:analyzer/src/dart/element/element.dart'; | 21 import 'package:analyzer/src/dart/element/element.dart'; |
| 17 import 'package:analyzer/src/dart/element/type.dart'; | 22 import 'package:analyzer/src/dart/element/type.dart'; |
| 18 import 'package:analyzer/src/generated/engine.dart'; | 23 import 'package:analyzer/src/generated/engine.dart'; |
| 19 import 'package:analyzer/src/generated/error.dart'; | 24 import 'package:analyzer/src/generated/error.dart'; |
| 20 import 'package:analyzer/src/generated/resolver.dart'; | 25 import 'package:analyzer/src/generated/resolver.dart'; |
| 21 | 26 |
| 22 /** | 27 /** |
| 23 * An object used by instances of [ResolverVisitor] to resolve references within | 28 * An object used by instances of [ResolverVisitor] to resolve references within |
| 24 * the AST structure to the elements being referenced. The requirements for the | 29 * the AST structure to the elements being referenced. The requirements for the |
| 25 * element resolver are: | 30 * element resolver are: |
| (...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 872 identifier.staticElement = importedLibrary.loadLibraryFunction; | 877 identifier.staticElement = importedLibrary.loadLibraryFunction; |
| 873 return null; | 878 return null; |
| 874 } | 879 } |
| 875 // | 880 // |
| 876 // Check to see whether the prefix is really a prefix. | 881 // Check to see whether the prefix is really a prefix. |
| 877 // | 882 // |
| 878 Element prefixElement = prefix.staticElement; | 883 Element prefixElement = prefix.staticElement; |
| 879 if (prefixElement is PrefixElement) { | 884 if (prefixElement is PrefixElement) { |
| 880 Element element = _resolver.nameScope.lookup(node, _definingLibrary); | 885 Element element = _resolver.nameScope.lookup(node, _definingLibrary); |
| 881 if (element == null && identifier.inSetterContext()) { | 886 if (element == null && identifier.inSetterContext()) { |
| 882 element = _resolver.nameScope.lookup( | 887 Identifier setterName = new PrefixedIdentifierImpl.temp( |
| 883 new SyntheticIdentifier("${node.name}=", node), _definingLibrary); | 888 node.prefix, |
| 889 new SimpleIdentifierImpl(new StringToken(TokenType.STRING, |
| 890 "${node.identifier.name}=", node.identifier.offset - 1))); |
| 891 element = _resolver.nameScope.lookup(setterName, _definingLibrary); |
| 884 } | 892 } |
| 885 if (element == null) { | 893 if (element == null) { |
| 886 if (identifier.inSetterContext()) { | 894 if (identifier.inSetterContext()) { |
| 887 _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_SETTER, | 895 _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_SETTER, |
| 888 identifier, [identifier.name, prefixElement.name]); | 896 identifier, [identifier.name, prefixElement.name]); |
| 889 return null; | 897 return null; |
| 890 } | 898 } |
| 891 AstNode parent = node.parent; | 899 AstNode parent = node.parent; |
| 892 if (parent is Annotation) { | 900 if (parent is Annotation) { |
| 893 _resolver.reportErrorForNode( | 901 _resolver.reportErrorForNode( |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1372 * Look for any declarations of the given [identifier] that are imported using | 1380 * Look for any declarations of the given [identifier] that are imported using |
| 1373 * a prefix. Return the element that was found, or `null` if the name is not | 1381 * a prefix. Return the element that was found, or `null` if the name is not |
| 1374 * imported using a prefix. | 1382 * imported using a prefix. |
| 1375 */ | 1383 */ |
| 1376 Element _findImportWithoutPrefix(SimpleIdentifier identifier) { | 1384 Element _findImportWithoutPrefix(SimpleIdentifier identifier) { |
| 1377 Element element = null; | 1385 Element element = null; |
| 1378 Scope nameScope = _resolver.nameScope; | 1386 Scope nameScope = _resolver.nameScope; |
| 1379 for (ImportElement importElement in _definingLibrary.imports) { | 1387 for (ImportElement importElement in _definingLibrary.imports) { |
| 1380 PrefixElement prefixElement = importElement.prefix; | 1388 PrefixElement prefixElement = importElement.prefix; |
| 1381 if (prefixElement != null) { | 1389 if (prefixElement != null) { |
| 1382 Identifier prefixedIdentifier = new SyntheticIdentifier( | 1390 Identifier prefixedIdentifier = new PrefixedIdentifierImpl.temp( |
| 1383 "${prefixElement.name}.${identifier.name}", identifier); | 1391 new SimpleIdentifierImpl(new StringToken(TokenType.STRING, |
| 1392 prefixElement.name, prefixElement.nameOffset)), |
| 1393 identifier); |
| 1384 Element importedElement = | 1394 Element importedElement = |
| 1385 nameScope.lookup(prefixedIdentifier, _definingLibrary); | 1395 nameScope.lookup(prefixedIdentifier, _definingLibrary); |
| 1386 if (importedElement != null) { | 1396 if (importedElement != null) { |
| 1387 if (element == null) { | 1397 if (element == null) { |
| 1388 element = importedElement; | 1398 element = importedElement; |
| 1389 } else { | 1399 } else { |
| 1390 element = MultiplyDefinedElementImpl.fromElements( | 1400 element = MultiplyDefinedElementImpl.fromElements( |
| 1391 _definingLibrary.context, element, importedElement); | 1401 _definingLibrary.context, element, importedElement); |
| 1392 } | 1402 } |
| 1393 } | 1403 } |
| (...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2176 _resolver.reportErrorForNode( | 2186 _resolver.reportErrorForNode( |
| 2177 CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT, | 2187 CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT, |
| 2178 target, | 2188 target, |
| 2179 [target.name]); | 2189 [target.name]); |
| 2180 } | 2190 } |
| 2181 // | 2191 // |
| 2182 // Look to see whether the name of the method is really part of a | 2192 // Look to see whether the name of the method is really part of a |
| 2183 // prefixed identifier for an imported top-level function or top-level | 2193 // prefixed identifier for an imported top-level function or top-level |
| 2184 // getter that returns a function. | 2194 // getter that returns a function. |
| 2185 // | 2195 // |
| 2186 String name = "${target.name}.$methodName"; | 2196 Identifier functionName = |
| 2187 Identifier functionName = new SyntheticIdentifier(name, methodName); | 2197 new PrefixedIdentifierImpl.temp(target, methodName); |
| 2188 Element element = | 2198 Element element = |
| 2189 _resolver.nameScope.lookup(functionName, _definingLibrary); | 2199 _resolver.nameScope.lookup(functionName, _definingLibrary); |
| 2190 if (element != null) { | 2200 if (element != null) { |
| 2191 // TODO(brianwilkerson) This isn't a method invocation, it's a | 2201 // TODO(brianwilkerson) This isn't a method invocation, it's a |
| 2192 // function invocation where the function name is a prefixed | 2202 // function invocation where the function name is a prefixed |
| 2193 // identifier. Consider re-writing the AST. | 2203 // identifier. Consider re-writing the AST. |
| 2194 return element; | 2204 return element; |
| 2195 } | 2205 } |
| 2196 } | 2206 } |
| 2197 } | 2207 } |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2568 | 2578 |
| 2569 @override | 2579 @override |
| 2570 Element get staticElement => null; | 2580 Element get staticElement => null; |
| 2571 | 2581 |
| 2572 @override | 2582 @override |
| 2573 dynamic/*=E*/ accept/*<E>*/(AstVisitor/*<E>*/ visitor) => null; | 2583 dynamic/*=E*/ accept/*<E>*/(AstVisitor/*<E>*/ visitor) => null; |
| 2574 | 2584 |
| 2575 @override | 2585 @override |
| 2576 void visitChildren(AstVisitor visitor) {} | 2586 void visitChildren(AstVisitor visitor) {} |
| 2577 } | 2587 } |
| OLD | NEW |