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

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

Issue 700943003: Fix issue 19424 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Clean up Created 6 years, 1 month 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 | Annotate | Revision Log
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 engine.resolver.element_resolver; 5 library engine.resolver.element_resolver;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'error.dart'; 9 import 'error.dart';
10 import 'scanner.dart' as sc; 10 import 'scanner.dart' as sc;
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 identifier.staticElement = importedLibrary.loadLibraryFunction; 861 identifier.staticElement = importedLibrary.loadLibraryFunction;
862 return null; 862 return null;
863 } 863 }
864 // 864 //
865 // Check to see whether the prefix is really a prefix. 865 // Check to see whether the prefix is really a prefix.
866 // 866 //
867 Element prefixElement = prefix.staticElement; 867 Element prefixElement = prefix.staticElement;
868 if (prefixElement is PrefixElement) { 868 if (prefixElement is PrefixElement) {
869 Element element = _resolver.nameScope.lookup(node, _definingLibrary); 869 Element element = _resolver.nameScope.lookup(node, _definingLibrary);
870 if (element == null && identifier.inSetterContext()) { 870 if (element == null && identifier.inSetterContext()) {
871 element = _resolver.nameScope.lookup(new ElementResolver_SyntheticIdenti fier("${node.name}="), _definingLibrary); 871 element = _resolver.nameScope.lookup(new SyntheticIdentifier(
872 "${node.name}=", node),
873 _definingLibrary);
872 } 874 }
873 if (element == null) { 875 if (element == null) {
874 if (identifier.inSetterContext()) { 876 if (identifier.inSetterContext()) {
875 _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_SETTER, ident ifier, [identifier.name, prefixElement.name]); 877 _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_SETTER, ident ifier, [identifier.name, prefixElement.name]);
876 } else if (node.parent is Annotation) { 878 } else if (node.parent is Annotation) {
877 Annotation annotation = node.parent as Annotation; 879 Annotation annotation = node.parent as Annotation;
878 _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []); 880 _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
879 return null; 881 return null;
880 } else { 882 } else {
881 _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_GETTER, ident ifier, [identifier.name, prefixElement.name]); 883 _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_GETTER, ident ifier, [identifier.name, prefixElement.name]);
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
1322 * 1324 *
1323 * @param identifier the identifier that might have been imported using a pref ix 1325 * @param identifier the identifier that might have been imported using a pref ix
1324 * @return the element that was found 1326 * @return the element that was found
1325 */ 1327 */
1326 Element _findImportWithoutPrefix(SimpleIdentifier identifier) { 1328 Element _findImportWithoutPrefix(SimpleIdentifier identifier) {
1327 Element element = null; 1329 Element element = null;
1328 Scope nameScope = _resolver.nameScope; 1330 Scope nameScope = _resolver.nameScope;
1329 for (ImportElement importElement in _definingLibrary.imports) { 1331 for (ImportElement importElement in _definingLibrary.imports) {
1330 PrefixElement prefixElement = importElement.prefix; 1332 PrefixElement prefixElement = importElement.prefix;
1331 if (prefixElement != null) { 1333 if (prefixElement != null) {
1332 Identifier prefixedIdentifier = new ElementResolver_SyntheticIdentifier( "${prefixElement.name}.${identifier.name}"); 1334 Identifier prefixedIdentifier = new SyntheticIdentifier(
1335 "${prefixElement.name}.${identifier.name}",
1336 identifier);
1333 Element importedElement = nameScope.lookup(prefixedIdentifier, _defining Library); 1337 Element importedElement = nameScope.lookup(prefixedIdentifier, _defining Library);
1334 if (importedElement != null) { 1338 if (importedElement != null) {
1335 if (element == null) { 1339 if (element == null) {
1336 element = importedElement; 1340 element = importedElement;
1337 } else { 1341 } else {
1338 element = MultiplyDefinedElementImpl.fromElements(_definingLibrary.c ontext, element, importedElement); 1342 element = MultiplyDefinedElementImpl.fromElements(_definingLibrary.c ontext, element, importedElement);
1339 } 1343 }
1340 } 1344 }
1341 } 1345 }
1342 } 1346 }
(...skipping 1005 matching lines...) Expand 10 before | Expand all | Expand 10 after
2348 } 2352 }
2349 return element; 2353 return element;
2350 } else if (target is SimpleIdentifier) { 2354 } else if (target is SimpleIdentifier) {
2351 Element targetElement = target.staticElement; 2355 Element targetElement = target.staticElement;
2352 if (targetElement is PrefixElement) { 2356 if (targetElement is PrefixElement) {
2353 // 2357 //
2354 // Look to see whether the name of the method is really part of a prefix ed identifier for an 2358 // Look to see whether the name of the method is really part of a prefix ed identifier for an
2355 // imported top-level function or top-level getter that returns a functi on. 2359 // imported top-level function or top-level getter that returns a functi on.
2356 // 2360 //
2357 String name = "${target.name}.$methodName"; 2361 String name = "${target.name}.$methodName";
2358 Identifier functionName = new ElementResolver_SyntheticIdentifier(name); 2362 Identifier functionName = new SyntheticIdentifier(name, methodName);
2359 Element element = _resolver.nameScope.lookup(functionName, _definingLibr ary); 2363 Element element = _resolver.nameScope.lookup(functionName, _definingLibr ary);
2360 if (element != null) { 2364 if (element != null) {
2361 // TODO(brianwilkerson) This isn't a method invocation, it's a functio n invocation where 2365 // TODO(brianwilkerson) This isn't a method invocation, it's a functio n invocation where
2362 // the function name is a prefixed identifier. Consider re-writing the AST. 2366 // the function name is a prefixed identifier. Consider re-writing the AST.
2363 return element; 2367 return element;
2364 } 2368 }
2365 } 2369 }
2366 } 2370 }
2367 // TODO(brianwilkerson) Report this error. 2371 // TODO(brianwilkerson) Report this error.
2368 return null; 2372 return null;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
2480 // 2484 //
2481 ClassElement enclosingClass = _resolver.enclosingClass; 2485 ClassElement enclosingClass = _resolver.enclosingClass;
2482 if (enclosingClass != null) { 2486 if (enclosingClass != null) {
2483 setter = _lookUpSetter(null, enclosingClass.type, node.name); 2487 setter = _lookUpSetter(null, enclosingClass.type, node.name);
2484 } 2488 }
2485 } 2489 }
2486 if (setter != null) { 2490 if (setter != null) {
2487 element = setter; 2491 element = setter;
2488 } 2492 }
2489 } 2493 }
2490 } else if (element == null && (node.inSetterContext() || node.parent is Comm entReference)) { 2494 } else if (element == null
2491 element = _resolver.nameScope.lookup(new ElementResolver_SyntheticIdentifi er("${node.name}="), _definingLibrary); 2495 && (node.inSetterContext() || node.parent is CommentReference)) {
2496 element = _resolver.nameScope.lookup(
2497 new SyntheticIdentifier("${node.name}=", node),
2498 _definingLibrary);
2492 } 2499 }
2493 ClassElement enclosingClass = _resolver.enclosingClass; 2500 ClassElement enclosingClass = _resolver.enclosingClass;
2494 if (element == null && enclosingClass != null) { 2501 if (element == null && enclosingClass != null) {
2495 InterfaceType enclosingType = enclosingClass.type; 2502 InterfaceType enclosingType = enclosingClass.type;
2496 if (element == null && (node.inSetterContext() || node.parent is CommentRe ference)) { 2503 if (element == null && (node.inSetterContext() || node.parent is CommentRe ference)) {
2497 element = _lookUpSetter(null, enclosingType, node.name); 2504 element = _lookUpSetter(null, enclosingType, node.name);
2498 } 2505 }
2499 if (element == null && node.inGetterContext()) { 2506 if (element == null && node.inGetterContext()) {
2500 element = _lookUpGetter(null, enclosingType, node.name); 2507 element = _lookUpGetter(null, enclosingType, node.name);
2501 } 2508 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
2584 */ 2591 */
2585 bool _shouldReportMissingMember(DartType type, Element member) { 2592 bool _shouldReportMissingMember(DartType type, Element member) {
2586 if (member != null || type == null || type.isDynamic || type.isBottom) { 2593 if (member != null || type == null || type.isDynamic || type.isBottom) {
2587 return false; 2594 return false;
2588 } 2595 }
2589 return true; 2596 return true;
2590 } 2597 }
2591 } 2598 }
2592 2599
2593 /** 2600 /**
2594 * Instances of the class `SyntheticIdentifier` implement an identifier that can be used to 2601 * A `SyntheticIdentifier` is an identifier that can be used to look up names in
2595 * look up names in the lexical scope when there is no identifier in the AST str ucture. There is 2602 * the lexical scope when there is no identifier in the AST structure. There is
2596 * no identifier in the AST when the parser could not distinguish between a meth od invocation and 2603 * no identifier in the AST when the parser could not distinguish between a
2597 * an invocation of a top-level function imported with a prefix. 2604 * method invocation and an invocation of a top-level function imported with a
2605 * prefix.
2598 */ 2606 */
2599 class ElementResolver_SyntheticIdentifier extends Identifier { 2607 class SyntheticIdentifier extends Identifier {
2600 /** 2608 /**
2601 * The name of the synthetic identifier. 2609 * The name of the synthetic identifier.
2602 */ 2610 */
2603 final String name; 2611 final String name;
2604 2612
2605 /** 2613 /**
2606 * Initialize a newly created synthetic identifier to have the given name. 2614 * The identifier to be highlighted in case of an error
2607 *
2608 * @param name the name of the synthetic identifier
2609 */ 2615 */
2610 ElementResolver_SyntheticIdentifier(this.name); 2616 final Identifier identifier;
2617
2618 /**
2619 * Initialize a newly created synthetic identifier to have the given [name]
2620 * and [identifier].
2621 */
2622 SyntheticIdentifier(this.name, this.identifier);
2611 2623
2612 @override 2624 @override
2613 accept(AstVisitor visitor) => null; 2625 accept(AstVisitor visitor) => null;
2614 2626
2615 @override 2627 @override
2616 sc.Token get beginToken => null; 2628 sc.Token get beginToken => null;
2617 2629
2618 @override 2630 @override
2619 Element get bestElement => null; 2631 Element get bestElement => null;
2620 2632
2621 @override 2633 @override
2622 sc.Token get endToken => null; 2634 sc.Token get endToken => null;
2623 2635
2624 @override 2636 @override
2637 int get length => identifier.length;
2638
2639 @override
2640 int get offset => identifier.offset;
2641
2642 @override
2625 int get precedence => 16; 2643 int get precedence => 16;
2626 2644
2627 @override 2645 @override
2628 Element get propagatedElement => null; 2646 Element get propagatedElement => null;
2629 2647
2630 @override 2648 @override
2631 Element get staticElement => null; 2649 Element get staticElement => null;
2632 2650
2633 @override 2651 @override
2634 void visitChildren(AstVisitor visitor) { 2652 void visitChildren(AstVisitor visitor) {
2635 } 2653 }
2636 } 2654 }
2637
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698