| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |