Index: pkg/analysis_server/lib/src/services/index/index_contributor.dart |
diff --git a/pkg/analysis_server/lib/src/services/index/index_contributor.dart b/pkg/analysis_server/lib/src/services/index/index_contributor.dart |
index b5bef6bb75c792e51faad20d6e88e4880016de36..2c45fdfea372d075ae7fe6c17df3e74f2fd77c52 100644 |
--- a/pkg/analysis_server/lib/src/services/index/index_contributor.dart |
+++ b/pkg/analysis_server/lib/src/services/index/index_contributor.dart |
@@ -6,9 +6,12 @@ library services.src.index.index_contributor; |
import 'dart:collection' show Queue; |
+import 'package:analysis_server/analysis/index/index_core.dart'; |
+import 'package:analysis_server/analysis/index/index_dart.dart'; |
import 'package:analysis_server/src/services/correction/namespace.dart'; |
import 'package:analysis_server/src/services/index/index.dart'; |
import 'package:analysis_server/src/services/index/index_store.dart'; |
+import 'package:analysis_server/src/services/index/indexable_element.dart'; |
import 'package:analyzer/src/generated/ast.dart'; |
import 'package:analyzer/src/generated/element.dart'; |
import 'package:analyzer/src/generated/engine.dart'; |
@@ -65,6 +68,19 @@ void indexHtmlUnit( |
} |
/** |
+ * An [IndexContributor] that can be used to contribute relationships for Dart |
+ * files. |
+ */ |
+class DefaultDartIndexContributor extends DartIndexContributor { |
+ @override |
+ void internalContributeTo(IndexStore store, CompilationUnit unit) { |
+ _IndexContributor contributor = |
+ new _IndexContributor(store as InternalIndexStore); |
+ unit.accept(contributor); |
+ } |
+} |
+ |
+/** |
* Visits a resolved AST and adds relationships into [InternalIndexStore]. |
*/ |
class _IndexContributor extends GeneralizingAstVisitor { |
@@ -90,12 +106,13 @@ class _IndexContributor extends GeneralizingAstVisitor { |
} |
/** |
- * @return the inner-most enclosing [Element], may be `null`. |
+ * Return the inner-most enclosing [Element], wrapped as an indexable object, |
+ * or `null` if there is no enclosing element. |
*/ |
- Element peekElement() { |
+ IndexableElement peekElement() { |
for (Element element in _elementStack) { |
if (element != null) { |
- return element; |
+ return new IndexableElement(element); |
} |
} |
return null; |
@@ -108,7 +125,8 @@ class _IndexContributor extends GeneralizingAstVisitor { |
void recordRelationship( |
Element element, RelationshipImpl relationship, LocationImpl location) { |
if (element != null && location != null) { |
- _store.recordRelationship(element, relationship, location); |
+ _store.recordRelationship( |
+ new IndexableElement(element), relationship, location); |
} |
} |
@@ -231,8 +249,8 @@ class _IndexContributor extends GeneralizingAstVisitor { |
if (fieldName != null) { |
Element element = fieldName.staticElement; |
LocationImpl location = _createLocationForNode(fieldName); |
- _store.recordRelationship( |
- element, IndexConstants.IS_WRITTEN_BY, location); |
+ _store.recordRelationship(new IndexableElement(element), |
scheglov
2015/05/25 18:29:33
Could we use [this.]recordRelationship(element, ki
Brian Wilkerson
2015/06/01 13:20:08
Done
|
+ IndexConstants.IS_WRITTEN_BY, location); |
} |
// index expression |
if (expression != null) { |
@@ -374,9 +392,10 @@ class _IndexContributor extends GeneralizingAstVisitor { |
} |
// name invocation |
{ |
- Element nameElement = new NameElement(name.name); |
+ IndexableObject indexable = |
+ new IndexableElement(new NameElement(name.name)); |
_store.recordRelationship( |
- nameElement, IndexConstants.IS_INVOKED_BY, location); |
+ indexable, IndexConstants.IS_INVOKED_BY, location); |
} |
_recordImportElementReferenceWithoutPrefix(name); |
super.visitMethodInvocation(node); |
@@ -426,12 +445,16 @@ class _IndexContributor extends GeneralizingAstVisitor { |
@override |
visitSimpleIdentifier(SimpleIdentifier node) { |
- Element nameElement = new NameElement(node.name); |
+ IndexableObject indexable = |
+ new IndexableElement(new NameElement(node.name)); |
LocationImpl location = _createLocationForNode(node); |
+ if (location == null) { |
+ return; |
+ } |
// name in declaration |
if (node.inDeclarationContext()) { |
- recordRelationship( |
- nameElement, IndexConstants.NAME_IS_DEFINED_BY, location); |
+ _store.recordRelationship( |
+ indexable, IndexConstants.NAME_IS_DEFINED_BY, location); |
return; |
} |
// prepare information |
@@ -447,21 +470,22 @@ class _IndexContributor extends GeneralizingAstVisitor { |
bool inSetterContext = node.inSetterContext(); |
if (inGetterContext && inSetterContext) { |
_store.recordRelationship( |
- nameElement, IndexConstants.IS_READ_WRITTEN_BY, location); |
+ indexable, IndexConstants.IS_READ_WRITTEN_BY, location); |
} else if (inGetterContext) { |
_store.recordRelationship( |
- nameElement, IndexConstants.IS_READ_BY, location); |
+ indexable, IndexConstants.IS_READ_BY, location); |
} else if (inSetterContext) { |
_store.recordRelationship( |
- nameElement, IndexConstants.IS_WRITTEN_BY, location); |
+ indexable, IndexConstants.IS_WRITTEN_BY, location); |
} |
} |
// this.field parameter |
if (element is FieldFormalParameterElement) { |
- RelationshipImpl relationship = peekElement() == element |
+ RelationshipImpl relationship = peekElement().element == element |
? IndexConstants.IS_WRITTEN_BY |
: IndexConstants.IS_REFERENCED_BY; |
- _store.recordRelationship(element.field, relationship, location); |
+ _store.recordRelationship( |
+ new IndexableElement(element.field), relationship, location); |
return; |
} |
// record specific relations |
@@ -585,8 +609,8 @@ class _IndexContributor extends GeneralizingAstVisitor { |
if (node is SimpleIdentifier) { |
isResolved = node.bestElement != null; |
} |
- Element element = peekElement(); |
- return new LocationImpl(element, node.offset, node.length, |
+ IndexableObject indexable = peekElement(); |
+ return new LocationImpl(indexable, node.offset, node.length, |
isQualified: isQualified, isResolved: isResolved); |
} |
@@ -598,7 +622,7 @@ class _IndexContributor extends GeneralizingAstVisitor { |
* inner-most [Element]. |
*/ |
LocationImpl _createLocationForOffset(int offset, int length) { |
- Element element = peekElement(); |
+ IndexableObject element = peekElement(); |
return new LocationImpl(element, offset, length); |
} |
@@ -606,7 +630,7 @@ class _IndexContributor extends GeneralizingAstVisitor { |
* @return the [LocationImpl] representing location of the [Token]. |
*/ |
LocationImpl _createLocationForToken(Token token, bool isResolved) { |
- Element element = peekElement(); |
+ IndexableObject element = peekElement(); |
return new LocationImpl(element, token.offset, token.length, |
isQualified: true, isResolved: isResolved); |
} |
@@ -744,19 +768,20 @@ class _IndexContributor extends GeneralizingAstVisitor { |
* Records the [Element] definition in the library and universe. |
*/ |
void _recordTopLevelElementDefinition(Element element) { |
- LocationImpl location = createLocation(element); |
+ LocationImpl location = createLocation(new IndexableElement(element)); |
recordRelationship(_libraryElement, IndexConstants.DEFINES, location); |
_store.recordTopLevelDeclaration(element); |
} |
/** |
- * Creates a [LocationImpl] representing declaration of the [Element]. |
+ * Creates a location representing the declaration of the given [indexable] |
+ * element. |
*/ |
- static LocationImpl createLocation(Element element) { |
- if (element != null) { |
- int offset = element.nameOffset; |
- int length = element.displayName.length; |
- return new LocationImpl(element, offset, length); |
+ static LocationImpl createLocation(IndexableElement indexable) { |
scheglov
2015/05/25 18:29:33
The same here - we need IndexableElement only for
Brian Wilkerson
2015/06/01 13:20:08
Given that this method is only invoked in one plac
|
+ if (indexable != null) { |
+ int offset = indexable.offset; |
+ int length = indexable.length; |
+ return new LocationImpl(indexable, offset, length); |
} |
return null; |
} |