Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Side by Side Diff: pkg/analyzer/lib/src/generated/element_resolver.dart

Issue 1916223004: Stop concatenating prefixes and identifiers when performing lookup (issue 26069) (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Clean up Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/analyzer/lib/src/dart/resolver/scope.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/dart/resolver/scope.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698