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

Side by Side Diff: pkg/analysis_server/lib/src/services/index/index_contributor.dart

Issue 1407863004: Index library/part file references from import/export/part containing files. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: tweaks Created 5 years, 2 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 | « no previous file | pkg/analysis_server/lib/src/services/index/indexable_file.dart » ('j') | 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 services.src.index.index_contributor; 5 library services.src.index.index_contributor;
6 6
7 import 'dart:collection' show Queue; 7 import 'dart:collection' show Queue;
8 8
9 import 'package:analysis_server/plugin/index/index_core.dart'; 9 import 'package:analysis_server/plugin/index/index_core.dart';
10 import 'package:analysis_server/src/services/correction/namespace.dart'; 10 import 'package:analysis_server/src/services/correction/namespace.dart';
11 import 'package:analysis_server/src/services/index/index.dart'; 11 import 'package:analysis_server/src/services/index/index.dart';
12 import 'package:analysis_server/src/services/index/index_store.dart'; 12 import 'package:analysis_server/src/services/index/index_store.dart';
13 import 'package:analysis_server/src/services/index/indexable_element.dart'; 13 import 'package:analysis_server/src/services/index/indexable_element.dart';
14 import 'package:analysis_server/src/services/index/indexable_file.dart';
14 import 'package:analyzer/src/generated/ast.dart'; 15 import 'package:analyzer/src/generated/ast.dart';
15 import 'package:analyzer/src/generated/element.dart'; 16 import 'package:analyzer/src/generated/element.dart';
16 import 'package:analyzer/src/generated/engine.dart'; 17 import 'package:analyzer/src/generated/engine.dart';
17 import 'package:analyzer/src/generated/java_engine.dart'; 18 import 'package:analyzer/src/generated/java_engine.dart';
18 import 'package:analyzer/src/generated/scanner.dart'; 19 import 'package:analyzer/src/generated/scanner.dart';
19 import 'package:analyzer/src/generated/source.dart'; 20 import 'package:analyzer/src/generated/source.dart';
20 21
21 /** 22 /**
22 * An [IndexContributor] that contributes relationships for Dart files. 23 * An [IndexContributor] that contributes relationships for Dart files.
23 */ 24 */
24 class DartIndexContributor extends IndexContributor { 25 class DartIndexContributor extends IndexContributor {
25 @override 26 @override
26 void contributeTo(IndexStore store, AnalysisContext context, Object object) { 27 void contributeTo(IndexStore store, AnalysisContext context, Object object) {
27 if (store is InternalIndexStore && object is CompilationUnit) { 28 if (store is InternalIndexStore && object is CompilationUnit) {
28 _IndexContributor contributor = new _IndexContributor(store); 29 _IndexContributor contributor = new _IndexContributor(store);
29 object.accept(contributor); 30 object.accept(contributor);
30 } 31 }
31 } 32 }
32 } 33 }
33 34
34 /** 35 /**
35 * Visits a resolved AST and adds relationships into [InternalIndexStore]. 36 * Visits a resolved AST and adds relationships into [InternalIndexStore].
36 */ 37 */
37 class _IndexContributor extends GeneralizingAstVisitor { 38 class _IndexContributor extends GeneralizingAstVisitor {
38 final InternalIndexStore _store; 39 final InternalIndexStore _store;
39 40
41 CompilationUnitElement _unitElement;
40 LibraryElement _libraryElement; 42 LibraryElement _libraryElement;
41 43
42 Map<ImportElement, Set<Element>> _importElementsMap = {}; 44 Map<ImportElement, Set<Element>> _importElementsMap = {};
43 45
44 /** 46 /**
45 * A stack whose top element (the element with the largest index) is an 47 * A stack whose top element (the element with the largest index) is an
46 * element representing the inner-most enclosing scope. 48 * element representing the inner-most enclosing scope.
47 */ 49 */
48 Queue<Element> _elementStack = new Queue(); 50 Queue<Element> _elementStack = new Queue();
49 51
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 } 181 }
180 } 182 }
181 super.visitClassTypeAlias(node); 183 super.visitClassTypeAlias(node);
182 } finally { 184 } finally {
183 _exitScope(); 185 _exitScope();
184 } 186 }
185 } 187 }
186 188
187 @override 189 @override
188 visitCompilationUnit(CompilationUnit node) { 190 visitCompilationUnit(CompilationUnit node) {
189 CompilationUnitElement unitElement = node.element; 191 _unitElement = node.element;
190 if (unitElement != null) { 192 if (_unitElement != null) {
191 _elementStack.add(unitElement); 193 _elementStack.add(_unitElement);
192 _libraryElement = unitElement.enclosingElement; 194 _libraryElement = _unitElement.enclosingElement;
193 if (_libraryElement != null) { 195 if (_libraryElement != null) {
194 super.visitCompilationUnit(node); 196 super.visitCompilationUnit(node);
195 } 197 }
196 } 198 }
197 } 199 }
198 200
199 @override 201 @override
200 visitConstructorDeclaration(ConstructorDeclaration node) { 202 visitConstructorDeclaration(ConstructorDeclaration node) {
201 ConstructorElement element = node.element; 203 ConstructorElement element = node.element;
202 enterScope(element); 204 enterScope(element);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 } 274 }
273 } 275 }
274 276
275 @override 277 @override
276 visitExportDirective(ExportDirective node) { 278 visitExportDirective(ExportDirective node) {
277 ExportElement element = node.element; 279 ExportElement element = node.element;
278 if (element != null) { 280 if (element != null) {
279 LibraryElement expLibrary = element.exportedLibrary; 281 LibraryElement expLibrary = element.exportedLibrary;
280 _recordLibraryReference(node, expLibrary); 282 _recordLibraryReference(node, expLibrary);
281 } 283 }
284 _recordUriFileReference(node);
282 super.visitExportDirective(node); 285 super.visitExportDirective(node);
283 } 286 }
284 287
285 @override 288 @override
286 visitFormalParameter(FormalParameter node) { 289 visitFormalParameter(FormalParameter node) {
287 ParameterElement element = node.element; 290 ParameterElement element = node.element;
288 enterScope(element); 291 enterScope(element);
289 try { 292 try {
290 super.visitFormalParameter(node); 293 super.visitFormalParameter(node);
291 } finally { 294 } finally {
(...skipping 20 matching lines...) Expand all
312 super.visitFunctionTypeAlias(node); 315 super.visitFunctionTypeAlias(node);
313 } 316 }
314 317
315 @override 318 @override
316 visitImportDirective(ImportDirective node) { 319 visitImportDirective(ImportDirective node) {
317 ImportElement element = node.element; 320 ImportElement element = node.element;
318 if (element != null) { 321 if (element != null) {
319 LibraryElement impLibrary = element.importedLibrary; 322 LibraryElement impLibrary = element.importedLibrary;
320 _recordLibraryReference(node, impLibrary); 323 _recordLibraryReference(node, impLibrary);
321 } 324 }
325 _recordUriFileReference(node);
322 super.visitImportDirective(node); 326 super.visitImportDirective(node);
323 } 327 }
324 328
325 @override 329 @override
326 visitIndexExpression(IndexExpression node) { 330 visitIndexExpression(IndexExpression node) {
327 MethodElement element = node.bestElement; 331 MethodElement element = node.bestElement;
328 if (element is MethodElement) { 332 if (element is MethodElement) {
329 Token operator = node.leftBracket; 333 Token operator = node.leftBracket;
330 LocationImpl location = 334 LocationImpl location =
331 _createLocationForToken(operator, element != null); 335 _createLocationForToken(operator, element != null);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 _recordImportElementReferenceWithoutPrefix(name); 372 _recordImportElementReferenceWithoutPrefix(name);
369 super.visitMethodInvocation(node); 373 super.visitMethodInvocation(node);
370 } 374 }
371 375
372 @override 376 @override
373 visitPartDirective(PartDirective node) { 377 visitPartDirective(PartDirective node) {
374 Element element = node.element; 378 Element element = node.element;
375 LocationImpl location = _createLocationForNode(node.uri); 379 LocationImpl location = _createLocationForNode(node.uri);
376 recordRelationshipElement( 380 recordRelationshipElement(
377 element, IndexConstants.IS_REFERENCED_BY, location); 381 element, IndexConstants.IS_REFERENCED_BY, location);
382 _recordUriFileReference(node);
378 super.visitPartDirective(node); 383 super.visitPartDirective(node);
379 } 384 }
380 385
381 @override 386 @override
382 visitPartOfDirective(PartOfDirective node) { 387 visitPartOfDirective(PartOfDirective node) {
383 LocationImpl location = _createLocationForNode(node.libraryName); 388 LocationImpl location = _createLocationForNode(node.libraryName);
384 recordRelationshipElement( 389 recordRelationshipElement(
385 node.element, IndexConstants.IS_REFERENCED_BY, location); 390 node.element, IndexConstants.IS_REFERENCED_BY, location);
386 } 391 }
387 392
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 IndexableElement indexable = new IndexableElement(element); 788 IndexableElement indexable = new IndexableElement(element);
784 int offset = element.nameOffset; 789 int offset = element.nameOffset;
785 int length = element.nameLength; 790 int length = element.nameLength;
786 LocationImpl location = new LocationImpl(indexable, offset, length); 791 LocationImpl location = new LocationImpl(indexable, offset, length);
787 recordRelationshipElement( 792 recordRelationshipElement(
788 _libraryElement, IndexConstants.DEFINES, location); 793 _libraryElement, IndexConstants.DEFINES, location);
789 _store.recordTopLevelDeclaration(element); 794 _store.recordTopLevelDeclaration(element);
790 } 795 }
791 } 796 }
792 797
798 void _recordUriFileReference(UriBasedDirective directive) {
799 Source source = directive.source;
800 if (source != null) {
801 LocationImpl location = new LocationImpl(
802 new IndexableFile(_unitElement.source.fullName),
803 directive.uri.offset,
804 directive.uri.length);
805 _store.recordRelationship(new IndexableFile(source.fullName),
806 IndexConstants.IS_REFERENCED_BY, location);
807 }
808 }
809
793 /** 810 /**
794 * If the given expression has resolved type, returns the new location with th is type. 811 * If the given expression has resolved type, returns the new location with th is type.
795 * 812 *
796 * [location] - the base location 813 * [location] - the base location
797 * [expression] - the expression assigned at the given location 814 * [expression] - the expression assigned at the given location
798 */ 815 */
799 static LocationImpl _getLocationWithExpressionType( 816 static LocationImpl _getLocationWithExpressionType(
800 LocationImpl location, Expression expression) { 817 LocationImpl location, Expression expression) {
801 if (expression != null) { 818 if (expression != null) {
802 return new LocationWithData<DartType>(location, expression.bestType); 819 return new LocationWithData<DartType>(location, expression.bestType);
(...skipping 10 matching lines...) Expand all
813 } 830 }
814 831
815 /** 832 /**
816 * @return `true` if given "node" is part of [PrefixedIdentifier] "prefix.node ". 833 * @return `true` if given "node" is part of [PrefixedIdentifier] "prefix.node ".
817 */ 834 */
818 static bool _isIdentifierInPrefixedIdentifier(SimpleIdentifier node) { 835 static bool _isIdentifierInPrefixedIdentifier(SimpleIdentifier node) {
819 AstNode parent = node.parent; 836 AstNode parent = node.parent;
820 return parent is PrefixedIdentifier && parent.identifier == node; 837 return parent is PrefixedIdentifier && parent.identifier == node;
821 } 838 }
822 } 839 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/lib/src/services/index/indexable_file.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698