Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 import 'package:analyzer/dart/ast/ast.dart'; | 5 import 'package:analyzer/dart/ast/ast.dart'; |
| 6 import 'package:analyzer/dart/ast/token.dart'; | 6 import 'package:analyzer/dart/ast/token.dart'; |
| 7 import 'package:analyzer/dart/ast/visitor.dart'; | 7 import 'package:analyzer/dart/ast/visitor.dart'; |
| 8 import 'package:analyzer/dart/element/element.dart'; | 8 import 'package:analyzer/dart/element/element.dart'; |
| 9 import 'package:analyzer/dart/element/type.dart'; | 9 import 'package:analyzer/dart/element/type.dart'; |
| 10 import 'package:analyzer/src/dart/element/member.dart'; | 10 import 'package:analyzer/src/dart/element/member.dart'; |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 36 */ | 36 */ |
| 37 final IndexSyntheticElementKind kind; | 37 final IndexSyntheticElementKind kind; |
| 38 | 38 |
| 39 /** | 39 /** |
| 40 * The unique id of the element. It is set after indexing of the whole | 40 * The unique id of the element. It is set after indexing of the whole |
| 41 * package is done and we are assembling the full package index. | 41 * package is done and we are assembling the full package index. |
| 42 */ | 42 */ |
| 43 int id; | 43 int id; |
| 44 | 44 |
| 45 ElementInfo(this.unitId, this.offset, this.kind) { | 45 ElementInfo(this.unitId, this.offset, this.kind) { |
| 46 if (offset < 0) { | |
| 47 print(offset); | |
|
Brian Wilkerson
2016/03/11 22:50:06
Debugging code?
| |
| 48 } | |
| 46 assert(offset >= 0); | 49 assert(offset >= 0); |
| 47 } | 50 } |
| 48 } | 51 } |
| 49 | 52 |
| 50 /** | 53 /** |
| 51 * Object that gathers information about the whole package index and then uses | 54 * Object that gathers information about the whole package index and then uses |
| 52 * it to assemble a new [PackageIndexBuilder]. Call [index] on each compilation | 55 * it to assemble a new [PackageIndexBuilder]. Call [index] on each compilation |
| 53 * unit to be indexed, then call [assemble] to retrieve the complete index for | 56 * unit to be indexed, then call [assemble] to retrieve the complete index for |
| 54 * the package. | 57 * the package. |
| 55 */ | 58 */ |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 297 } | 300 } |
| 298 } | 301 } |
| 299 | 302 |
| 300 void recordIsAncestorOf(Element descendant) { | 303 void recordIsAncestorOf(Element descendant) { |
| 301 _recordIsAncestorOf(descendant, descendant, false, <ClassElement>[]); | 304 _recordIsAncestorOf(descendant, descendant, false, <ClassElement>[]); |
| 302 } | 305 } |
| 303 | 306 |
| 304 /** | 307 /** |
| 305 * Record that the name [node] has a relation of the given [kind]. | 308 * Record that the name [node] has a relation of the given [kind]. |
| 306 */ | 309 */ |
| 307 void recordNameRelation(SimpleIdentifier node, IndexRelationKind kind) { | 310 void recordNameRelation( |
| 311 SimpleIdentifier node, IndexRelationKind kind, bool isQualified) { | |
| 308 if (node != null) { | 312 if (node != null) { |
| 309 assembler.addNameRelation(node.name, kind, node.offset); | 313 assembler.addNameRelation(node.name, kind, node.offset, isQualified); |
| 310 } | 314 } |
| 311 } | 315 } |
| 312 | 316 |
| 313 /** | 317 /** |
| 314 * Record reference to the given operator [Element]. | 318 * Record reference to the given operator [Element]. |
| 315 */ | 319 */ |
| 316 void recordOperatorReference(Token operator, Element element) { | 320 void recordOperatorReference(Token operator, Element element) { |
| 317 recordRelationToken(element, IndexRelationKind.IS_INVOKED_BY, operator); | 321 recordRelationToken(element, IndexRelationKind.IS_INVOKED_BY, operator); |
| 318 } | 322 } |
| 319 | 323 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 484 Token operator = node.leftBracket; | 488 Token operator = node.leftBracket; |
| 485 recordRelationToken(element, IndexRelationKind.IS_INVOKED_BY, operator); | 489 recordRelationToken(element, IndexRelationKind.IS_INVOKED_BY, operator); |
| 486 } | 490 } |
| 487 super.visitIndexExpression(node); | 491 super.visitIndexExpression(node); |
| 488 } | 492 } |
| 489 | 493 |
| 490 @override | 494 @override |
| 491 visitMethodInvocation(MethodInvocation node) { | 495 visitMethodInvocation(MethodInvocation node) { |
| 492 SimpleIdentifier name = node.methodName; | 496 SimpleIdentifier name = node.methodName; |
| 493 Element element = name.bestElement; | 497 Element element = name.bestElement; |
| 494 // qualified unresolved name invocation | 498 // unresolved name invocation |
| 495 bool isQualified = node.realTarget != null; | 499 bool isQualified = node.realTarget != null; |
| 496 if (isQualified && element == null) { | 500 if (element == null) { |
| 497 recordNameRelation(name, IndexRelationKind.IS_INVOKED_BY); | 501 recordNameRelation(name, IndexRelationKind.IS_INVOKED_BY, isQualified); |
| 498 } | 502 } |
| 499 // element invocation | 503 // element invocation |
| 500 IndexRelationKind kind = element is ClassElement | 504 IndexRelationKind kind = element is ClassElement |
| 501 ? IndexRelationKind.IS_REFERENCED_BY | 505 ? IndexRelationKind.IS_REFERENCED_BY |
| 502 : IndexRelationKind.IS_INVOKED_BY; | 506 : IndexRelationKind.IS_INVOKED_BY; |
| 503 recordRelation(element, kind, name, isQualified); | 507 recordRelation(element, kind, name, isQualified); |
| 504 node.target?.accept(this); | 508 node.target?.accept(this); |
| 505 node.argumentList?.accept(this); | 509 node.argumentList?.accept(this); |
| 506 } | 510 } |
| 507 | 511 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 541 } | 545 } |
| 542 | 546 |
| 543 @override | 547 @override |
| 544 visitSimpleIdentifier(SimpleIdentifier node) { | 548 visitSimpleIdentifier(SimpleIdentifier node) { |
| 545 Element element = node.bestElement; | 549 Element element = node.bestElement; |
| 546 // name in declaration | 550 // name in declaration |
| 547 if (node.inDeclarationContext()) { | 551 if (node.inDeclarationContext()) { |
| 548 recordDefinedElement(element); | 552 recordDefinedElement(element); |
| 549 return; | 553 return; |
| 550 } | 554 } |
| 551 // record qualified unresolved name reference | 555 // record unresolved name reference |
| 552 bool isQualified = _isQualified(node); | 556 bool isQualified = _isQualified(node); |
| 553 if (isQualified && element == null) { | 557 if (element == null) { |
| 554 bool inGetterContext = node.inGetterContext(); | 558 bool inGetterContext = node.inGetterContext(); |
| 555 bool inSetterContext = node.inSetterContext(); | 559 bool inSetterContext = node.inSetterContext(); |
| 556 IndexRelationKind kind; | 560 IndexRelationKind kind; |
| 557 if (inGetterContext && inSetterContext) { | 561 if (inGetterContext && inSetterContext) { |
| 558 kind = IndexRelationKind.IS_READ_WRITTEN_BY; | 562 kind = IndexRelationKind.IS_READ_WRITTEN_BY; |
| 559 } else if (inGetterContext) { | 563 } else if (inGetterContext) { |
| 560 kind = IndexRelationKind.IS_READ_BY; | 564 kind = IndexRelationKind.IS_READ_BY; |
| 561 } else { | 565 } else { |
| 562 kind = IndexRelationKind.IS_WRITTEN_BY; | 566 kind = IndexRelationKind.IS_WRITTEN_BY; |
| 563 } | 567 } |
| 564 recordNameRelation(node, kind); | 568 recordNameRelation(node, kind, isQualified); |
| 565 } | 569 } |
| 566 // this.field parameter | 570 // this.field parameter |
| 567 if (element is FieldFormalParameterElement) { | 571 if (element is FieldFormalParameterElement) { |
| 568 AstNode parent = node.parent; | 572 AstNode parent = node.parent; |
| 569 IndexRelationKind kind = | 573 IndexRelationKind kind = |
| 570 parent is FieldFormalParameter && parent.identifier == node | 574 parent is FieldFormalParameter && parent.identifier == node |
| 571 ? IndexRelationKind.IS_WRITTEN_BY | 575 ? IndexRelationKind.IS_WRITTEN_BY |
| 572 : IndexRelationKind.IS_REFERENCED_BY; | 576 : IndexRelationKind.IS_REFERENCED_BY; |
| 573 recordRelation(element.field, kind, node, true); | 577 recordRelation(element.field, kind, node, true); |
| 574 return; | 578 return; |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 685 * context of the compilation unit pointed to by the [_UnitIndexAssembler]. | 689 * context of the compilation unit pointed to by the [_UnitIndexAssembler]. |
| 686 */ | 690 */ |
| 687 class _NameRelationInfo { | 691 class _NameRelationInfo { |
| 688 /** | 692 /** |
| 689 * The information about the name returned from | 693 * The information about the name returned from |
| 690 * [PackageIndexAssembler._getStringInfo]. | 694 * [PackageIndexAssembler._getStringInfo]. |
| 691 */ | 695 */ |
| 692 final _StringInfo nameInfo; | 696 final _StringInfo nameInfo; |
| 693 final IndexRelationKind kind; | 697 final IndexRelationKind kind; |
| 694 final int offset; | 698 final int offset; |
| 699 final bool isQualified; | |
| 695 | 700 |
| 696 _NameRelationInfo(this.nameInfo, this.kind, this.offset); | 701 _NameRelationInfo(this.nameInfo, this.kind, this.offset, this.isQualified); |
| 697 } | 702 } |
| 698 | 703 |
| 699 /** | 704 /** |
| 700 * Information about a string referenced in the index. | 705 * Information about a string referenced in the index. |
| 701 */ | 706 */ |
| 702 class _StringInfo { | 707 class _StringInfo { |
| 703 /** | 708 /** |
| 704 * The value of the string. | 709 * The value of the string. |
| 705 */ | 710 */ |
| 706 final String value; | 711 final String value; |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 737 | 742 |
| 738 void addElementRelation(Element element, IndexRelationKind kind, int offset, | 743 void addElementRelation(Element element, IndexRelationKind kind, int offset, |
| 739 int length, bool isQualified) { | 744 int length, bool isQualified) { |
| 740 try { | 745 try { |
| 741 ElementInfo elementInfo = pkg._getElementInfo(element); | 746 ElementInfo elementInfo = pkg._getElementInfo(element); |
| 742 elementRelations.add(new _ElementRelationInfo( | 747 elementRelations.add(new _ElementRelationInfo( |
| 743 elementInfo, kind, offset, length, isQualified)); | 748 elementInfo, kind, offset, length, isQualified)); |
| 744 } on StateError {} | 749 } on StateError {} |
| 745 } | 750 } |
| 746 | 751 |
| 747 void addNameRelation(String name, IndexRelationKind kind, int offset) { | 752 void addNameRelation( |
| 753 String name, IndexRelationKind kind, int offset, bool isQualified) { | |
| 748 _StringInfo nameId = pkg._getStringInfo(name); | 754 _StringInfo nameId = pkg._getStringInfo(name); |
| 749 nameRelations.add(new _NameRelationInfo(nameId, kind, offset)); | 755 nameRelations.add(new _NameRelationInfo(nameId, kind, offset, isQualified)); |
| 750 } | 756 } |
| 751 | 757 |
| 752 /** | 758 /** |
| 753 * Assemble a new [UnitIndexBuilder] using the information gathered | 759 * Assemble a new [UnitIndexBuilder] using the information gathered |
| 754 * by [addElementRelation] and [defineName]. | 760 * by [addElementRelation] and [defineName]. |
| 755 */ | 761 */ |
| 756 UnitIndexBuilder assemble() { | 762 UnitIndexBuilder assemble() { |
| 757 definedNames.sort((a, b) { | 763 definedNames.sort((a, b) { |
| 758 return a.nameInfo.id - b.nameInfo.id; | 764 return a.nameInfo.id - b.nameInfo.id; |
| 759 }); | 765 }); |
| 760 elementRelations.sort((a, b) { | 766 elementRelations.sort((a, b) { |
| 761 return a.elementInfo.id - b.elementInfo.id; | 767 return a.elementInfo.id - b.elementInfo.id; |
| 762 }); | 768 }); |
| 763 nameRelations.sort((a, b) { | 769 nameRelations.sort((a, b) { |
| 764 return a.nameInfo.id - b.nameInfo.id; | 770 return a.nameInfo.id - b.nameInfo.id; |
| 765 }); | 771 }); |
| 766 return new UnitIndexBuilder( | 772 return new UnitIndexBuilder( |
| 767 unit: unitId, | 773 unit: unitId, |
| 768 definedNames: definedNames.map((n) => n.nameInfo.id).toList(), | 774 definedNames: definedNames.map((n) => n.nameInfo.id).toList(), |
| 769 definedNameKinds: definedNames.map((n) => n.kind).toList(), | 775 definedNameKinds: definedNames.map((n) => n.kind).toList(), |
| 770 definedNameOffsets: definedNames.map((n) => n.offset).toList(), | 776 definedNameOffsets: definedNames.map((n) => n.offset).toList(), |
| 771 usedElements: elementRelations.map((r) => r.elementInfo.id).toList(), | 777 usedElements: elementRelations.map((r) => r.elementInfo.id).toList(), |
| 772 usedElementKinds: elementRelations.map((r) => r.kind).toList(), | 778 usedElementKinds: elementRelations.map((r) => r.kind).toList(), |
| 773 usedElementOffsets: elementRelations.map((r) => r.offset).toList(), | 779 usedElementOffsets: elementRelations.map((r) => r.offset).toList(), |
| 774 usedElementLengths: elementRelations.map((r) => r.length).toList(), | 780 usedElementLengths: elementRelations.map((r) => r.length).toList(), |
| 775 usedElementIsQualifiedFlags: | 781 usedElementIsQualifiedFlags: |
| 776 elementRelations.map((r) => r.isQualified).toList(), | 782 elementRelations.map((r) => r.isQualified).toList(), |
| 777 usedNames: nameRelations.map((r) => r.nameInfo.id).toList(), | 783 usedNames: nameRelations.map((r) => r.nameInfo.id).toList(), |
| 778 usedNameKinds: nameRelations.map((r) => r.kind).toList(), | 784 usedNameKinds: nameRelations.map((r) => r.kind).toList(), |
| 779 usedNameOffsets: nameRelations.map((r) => r.offset).toList()); | 785 usedNameOffsets: nameRelations.map((r) => r.offset).toList(), |
| 786 usedNameIsQualifiedFlags: | |
| 787 nameRelations.map((r) => r.isQualified).toList()); | |
| 780 } | 788 } |
| 781 | 789 |
| 782 void defineName(String name, IndexNameKind kind, int offset) { | 790 void defineName(String name, IndexNameKind kind, int offset) { |
| 783 _StringInfo nameInfo = pkg._getStringInfo(name); | 791 _StringInfo nameInfo = pkg._getStringInfo(name); |
| 784 definedNames.add(new _DefinedNameInfo(nameInfo, kind, offset)); | 792 definedNames.add(new _DefinedNameInfo(nameInfo, kind, offset)); |
| 785 } | 793 } |
| 786 } | 794 } |
| OLD | NEW |