Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 elements.modelx; | 5 library elements.modelx; |
| 6 | 6 |
| 7 import 'elements.dart'; | 7 import 'elements.dart'; |
| 8 import '../constants/expressions.dart'; | 8 import '../constants/expressions.dart'; |
| 9 import '../constants/constructors.dart'; | 9 import '../constants/constructors.dart'; |
| 10 import '../helpers/helpers.dart'; // Included for debug helpers. | 10 import '../helpers/helpers.dart'; // Included for debug helpers. |
| (...skipping 2459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2470 Element e = s.lookupLocalMember(memberName); | 2470 Element e = s.lookupLocalMember(memberName); |
| 2471 if (e == null) continue; | 2471 if (e == null) continue; |
| 2472 // Static members are not inherited. | 2472 // Static members are not inherited. |
| 2473 if (e.isStatic) continue; | 2473 if (e.isStatic) continue; |
| 2474 return e; | 2474 return e; |
| 2475 } | 2475 } |
| 2476 return null; | 2476 return null; |
| 2477 } | 2477 } |
| 2478 | 2478 |
| 2479 /** | 2479 /** |
| 2480 * Find the first member in the class chain with the given [selector]. | 2480 * Find the first member in the class chain with the given [memberName]. |
| 2481 * | 2481 * |
| 2482 * This method is NOT to be used for resolving | 2482 * This method is NOT to be used for resolving |
| 2483 * unqualified sends because it does not implement the scoping | 2483 * unqualified sends because it does not implement the scoping |
| 2484 * rules, where library scope comes before superclass scope. | 2484 * rules, where library scope comes before superclass scope. |
| 2485 * | 2485 * |
| 2486 * When called on the implementation element both members declared in the | 2486 * When called on the implementation element both members declared in the |
| 2487 * origin and the patch class are returned. | 2487 * origin and the patch class are returned. |
| 2488 */ | 2488 */ |
| 2489 Element lookupSelector(Selector selector) { | 2489 Element lookupByName(Name memberName) { |
| 2490 return internalLookupSelector(selector, false); | 2490 return internalLookupByName(memberName, isSuperLookup: false); |
| 2491 } | 2491 } |
| 2492 | 2492 |
| 2493 Element lookupSuperSelector(Selector selector) { | 2493 Element lookupSuperByName(Name memberName) { |
| 2494 return internalLookupSelector(selector, true); | 2494 return internalLookupByName(memberName, isSuperLookup: true); |
| 2495 } | 2495 } |
| 2496 | 2496 |
| 2497 Element internalLookupSelector(Selector selector, | 2497 Element internalLookupByName(Name memberName, |
| 2498 bool isSuperLookup) { | 2498 {bool isSuperLookup}) { |
|
karlklose
2015/05/26 08:23:32
Fix indentation. Does it fit on one line now?
Johnni Winther
2015/05/26 08:53:11
Done.
| |
| 2499 String name = selector.name; | 2499 String name = memberName.text; |
| 2500 bool isPrivate = isPrivateName(name); | 2500 bool isPrivate = memberName.isPrivate; |
| 2501 LibraryElement library = selector.library; | 2501 LibraryElement library = memberName.library; |
| 2502 for (ClassElement current = isSuperLookup ? superclass : this; | 2502 for (ClassElement current = isSuperLookup ? superclass : this; |
| 2503 current != null; | 2503 current != null; |
| 2504 current = current.superclass) { | 2504 current = current.superclass) { |
| 2505 Element member = current.lookupLocalMember(name); | 2505 Element member = current.lookupLocalMember(name); |
| 2506 if (member == null && current.isPatched) { | 2506 if (member == null && current.isPatched) { |
| 2507 // Doing lookups on selectors is done after resolution, so it | 2507 // Doing lookups on selectors is done after resolution, so it |
| 2508 // is safe to look in the patch class. | 2508 // is safe to look in the patch class. |
| 2509 member = current.patch.lookupLocalMember(name); | 2509 member = current.patch.lookupLocalMember(name); |
| 2510 } | 2510 } |
| 2511 if (member == null) continue; | 2511 if (member == null) continue; |
| 2512 // Private members from a different library are not visible. | 2512 // Private members from a different library are not visible. |
| 2513 if (isPrivate && !identical(library, member.library)) continue; | 2513 if (isPrivate && !identical(library, member.library)) continue; |
| 2514 // Static members are not inherited. | 2514 // Static members are not inherited. |
| 2515 if (member.isStatic && !identical(this, current)) continue; | 2515 if (member.isStatic && !identical(this, current)) continue; |
| 2516 // If we find an abstract field we have to make sure that it has | 2516 // If we find an abstract field we have to make sure that it has |
| 2517 // the getter or setter part we're actually looking | 2517 // the getter or setter part we're actually looking |
| 2518 // for. Otherwise, we continue up the superclass chain. | 2518 // for. Otherwise, we continue up the superclass chain. |
| 2519 if (member.isAbstractField) { | 2519 if (member.isAbstractField) { |
| 2520 AbstractFieldElement field = member; | 2520 AbstractFieldElement field = member; |
| 2521 FunctionElement getter = field.getter; | 2521 FunctionElement getter = field.getter; |
| 2522 FunctionElement setter = field.setter; | 2522 FunctionElement setter = field.setter; |
| 2523 if (selector.isSetter) { | 2523 if (memberName.isSetter) { |
| 2524 // Abstract members can be defined in a super class. | 2524 // Abstract members can be defined in a super class. |
| 2525 if (setter != null && !setter.isAbstract) return setter; | 2525 if (setter != null && !setter.isAbstract) { |
| 2526 return setter; | |
| 2527 } | |
| 2526 } else { | 2528 } else { |
| 2527 assert(selector.isGetter || selector.isCall); | 2529 if (getter != null && !getter.isAbstract) { |
| 2528 if (getter != null && !getter.isAbstract) return getter; | 2530 return getter; |
| 2531 } | |
| 2529 } | 2532 } |
| 2530 // Abstract members can be defined in a super class. | 2533 // Abstract members can be defined in a super class. |
| 2531 } else if (!member.isAbstract) { | 2534 } else if (!member.isAbstract) { |
| 2532 return member; | 2535 return member; |
| 2533 } | 2536 } |
| 2534 } | 2537 } |
| 2535 return null; | 2538 return null; |
| 2536 } | 2539 } |
| 2537 | 2540 |
| 2538 /** | 2541 /** |
| (...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3217 AstElement get definingElement; | 3220 AstElement get definingElement; |
| 3218 | 3221 |
| 3219 bool get hasResolvedAst => definingElement.hasTreeElements; | 3222 bool get hasResolvedAst => definingElement.hasTreeElements; |
| 3220 | 3223 |
| 3221 ResolvedAst get resolvedAst { | 3224 ResolvedAst get resolvedAst { |
| 3222 return new ResolvedAst(declaration, | 3225 return new ResolvedAst(declaration, |
| 3223 definingElement.node, definingElement.treeElements); | 3226 definingElement.node, definingElement.treeElements); |
| 3224 } | 3227 } |
| 3225 | 3228 |
| 3226 } | 3229 } |
| OLD | NEW |