| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 'dart:async'; | 5 import 'dart:async'; |
| 6 | 6 |
| 7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
| 8 import 'package:analyzer/dart/element/element.dart'; | 8 import 'package:analyzer/dart/element/element.dart'; |
| 9 import 'package:analyzer/src/dart/analysis/driver.dart'; | 9 import 'package:analyzer/src/dart/analysis/driver.dart'; |
| 10 import 'package:analyzer/src/dart/ast/utilities.dart'; | 10 import 'package:analyzer/src/dart/ast/utilities.dart'; |
| 11 import 'package:analyzer/src/dart/element/ast_provider.dart'; | 11 import 'package:analyzer/src/dart/element/ast_provider.dart'; |
| 12 | 12 |
| 13 abstract class AbstractAstProvider implements AstProvider { | 13 abstract class AbstractAstProvider implements AstProvider { |
| 14 /** | |
| 15 * Return the [AstNode] for the given [element] if the given [unit], or | |
| 16 * `null` if the [element] is not know, or is not defined in the [unit]. | |
| 17 */ | |
| 18 @override | 14 @override |
| 19 AstNode findNodeForElement(CompilationUnit unit, Element element) { | 15 Future<SimpleIdentifier> getParsedNameForElement(Element element) async { |
| 20 AstNode nameNode = new NodeLocator(element.nameOffset).searchWithin(unit); | 16 CompilationUnit unit = await getParsedUnitForElement(element); |
| 21 if (element is ClassElement) { | 17 return _getNameNode(unit, element); |
| 22 if (element.isEnum) { | |
| 23 return nameNode.getAncestor((node) => node is EnumDeclaration); | |
| 24 } else { | |
| 25 return nameNode.getAncestor( | |
| 26 (node) => node is ClassDeclaration || node is ClassTypeAlias); | |
| 27 } | |
| 28 } | |
| 29 if (element is ConstructorElement) { | |
| 30 return nameNode.getAncestor((node) => node is ConstructorDeclaration); | |
| 31 } | |
| 32 if (element is FieldElement) { | |
| 33 if (element.isEnumConstant) { | |
| 34 return nameNode.getAncestor((node) => node is EnumConstantDeclaration); | |
| 35 } else { | |
| 36 return nameNode.getAncestor((node) => node is VariableDeclaration); | |
| 37 } | |
| 38 } | |
| 39 if (element is FunctionElement) { | |
| 40 return nameNode.getAncestor((node) => node is FunctionDeclaration); | |
| 41 } | |
| 42 if (element is FunctionTypeAliasElement) { | |
| 43 return nameNode.getAncestor((node) => node is FunctionTypeAlias); | |
| 44 } | |
| 45 if (element is LocalVariableElement) { | |
| 46 return nameNode.getAncestor( | |
| 47 (node) => node is DeclaredIdentifier || node is VariableDeclaration); | |
| 48 } | |
| 49 if (element is MethodElement) { | |
| 50 return nameNode.getAncestor((node) => node is MethodDeclaration); | |
| 51 } | |
| 52 if (element is ParameterElement) { | |
| 53 return nameNode.getAncestor((node) => node is FormalParameter); | |
| 54 } | |
| 55 if (element is PropertyAccessorElement) { | |
| 56 if (element.isSynthetic) { | |
| 57 return null; | |
| 58 } | |
| 59 if (element.enclosingElement is ClassElement) { | |
| 60 return nameNode.getAncestor((node) => node is MethodDeclaration); | |
| 61 } else if (element.enclosingElement is CompilationUnitElement) { | |
| 62 return nameNode.getAncestor((node) => node is FunctionDeclaration); | |
| 63 } | |
| 64 return null; | |
| 65 } | |
| 66 if (element is TopLevelVariableElement) { | |
| 67 return nameNode.getAncestor((node) => node is VariableDeclaration); | |
| 68 } | |
| 69 return nameNode; | |
| 70 } | 18 } |
| 71 | 19 |
| 72 @override | 20 @override |
| 73 Future<T> getParsedNodeForElement<T extends AstNode>(Element element) async { | 21 Future<SimpleIdentifier> getResolvedNameForElement(Element element) async { |
| 74 CompilationUnit unit = await getParsedUnitForElement(element); | 22 CompilationUnit unit = await getResolvedUnitForElement(element); |
| 75 return findNodeForElement(unit, element) as T; | 23 return _getNameNode(unit, element); |
| 76 } | 24 } |
| 77 | 25 |
| 78 @override | 26 SimpleIdentifier _getNameNode(CompilationUnit unit, Element element) { |
| 79 Future<T> getResolvedNodeForElement<T extends AstNode>( | 27 int nameOffset = element.nameOffset; |
| 80 Element element) async { | 28 if (nameOffset == -1) { |
| 81 CompilationUnit unit = await getResolvedUnitForElement(element); | 29 return null; |
| 82 return findNodeForElement(unit, element) as T; | 30 } |
| 31 AstNode nameNode = new NodeLocator(nameOffset).searchWithin(unit); |
| 32 if (nameNode is SimpleIdentifier) { |
| 33 return nameNode; |
| 34 } |
| 35 return null; |
| 83 } | 36 } |
| 84 } | 37 } |
| 85 | 38 |
| 86 /** | 39 /** |
| 87 * [AstProvider] implementation for [AnalysisDriver]. | 40 * [AstProvider] implementation for [AnalysisDriver]. |
| 88 */ | 41 */ |
| 89 class AstProviderForDriver extends AbstractAstProvider { | 42 class AstProviderForDriver extends AbstractAstProvider { |
| 90 final AnalysisDriver driver; | 43 final AnalysisDriver driver; |
| 91 | 44 |
| 92 AstProviderForDriver(this.driver); | 45 AstProviderForDriver(this.driver); |
| 93 | 46 |
| 94 @override | 47 @override |
| 95 Future<CompilationUnit> getParsedUnitForElement(Element element) async { | 48 Future<CompilationUnit> getParsedUnitForElement(Element element) async { |
| 96 String path = element.source.fullName; | 49 String path = element.source.fullName; |
| 97 ParseResult parseResult = await driver.parseFile(path); | 50 ParseResult parseResult = await driver.parseFile(path); |
| 98 return parseResult.unit; | 51 return parseResult.unit; |
| 99 } | 52 } |
| 100 | 53 |
| 101 @override | 54 @override |
| 102 Future<CompilationUnit> getResolvedUnitForElement(Element element) async { | 55 Future<CompilationUnit> getResolvedUnitForElement(Element element) async { |
| 103 String path = element.source.fullName; | 56 String path = element.source.fullName; |
| 104 AnalysisResult analysisResult = await driver.getResult(path); | 57 AnalysisResult analysisResult = await driver.getResult(path); |
| 105 return analysisResult?.unit; | 58 return analysisResult?.unit; |
| 106 } | 59 } |
| 107 } | 60 } |
| OLD | NEW |