Index: pkg/analysis_server/lib/src/services/correction/fix_internal.dart |
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart |
index ceadf3c79bc199d0ae181deab214c570b841a012..a8945181a748953a4b169ffe0734a6fa75daff33 100644 |
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart |
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart |
@@ -1808,31 +1808,44 @@ class FixProcessor { |
} |
void _addFix_undefinedClass_useSimilar() { |
+ AstNode node = this.node; |
+ // Prepare the optional import prefix name. |
+ String prefixName = null; |
+ if (node is SimpleIdentifier && node.staticElement is PrefixElement) { |
+ AstNode parent = node.parent; |
+ if (parent is PrefixedIdentifier && |
+ parent.prefix == node && |
+ parent.parent is TypeName) { |
+ prefixName = (node as SimpleIdentifier).name; |
+ node = parent.identifier; |
+ } |
+ } |
+ // Process if looks like a type. |
if (_mayBeTypeIdentifier(node)) { |
+ // Prepare for selecting the closest element. |
String name = (node as SimpleIdentifier).name; |
_ClosestElementFinder finder = new _ClosestElementFinder( |
name, |
(Element element) => element is ClassElement, |
MAX_LEVENSHTEIN_DISTANCE); |
- // find closest element |
- { |
- // elements of this library |
+ // Check elements of this library. |
+ if (prefixName == null) { |
for (CompilationUnitElement unit in unitLibraryElement.units) { |
finder._updateList(unit.types); |
} |
- // elements from imports |
- for (ImportElement importElement in unitLibraryElement.imports) { |
- if (importElement.prefix == null) { |
- Map<String, Element> namespace = getImportNamespace(importElement); |
- finder._updateList(namespace.values); |
- } |
+ } |
+ // Check elements from imports. |
+ for (ImportElement importElement in unitLibraryElement.imports) { |
+ if (importElement.prefix?.name == prefixName) { |
+ Map<String, Element> namespace = getImportNamespace(importElement); |
+ finder._updateList(namespace.values); |
} |
} |
- // if we have close enough element, suggest to use it |
+ // If we have a close enough element, suggest to use it. |
if (finder._element != null) { |
String closestName = finder._element.name; |
_addReplaceEdit(rf.rangeNode(node), closestName); |
- // add proposal |
+ // Add proposal. |
if (closestName != null) { |
_addFix(DartFixKind.CHANGE_TO, [closestName]); |
} |
@@ -1942,24 +1955,39 @@ class FixProcessor { |
} |
void _addFix_undefinedFunction_useSimilar() { |
+ AstNode node = this.node; |
if (node is SimpleIdentifier) { |
- String name = (node as SimpleIdentifier).name; |
+ // Prepare the optional import prefix name. |
+ String prefixName = null; |
+ { |
+ AstNode invocation = node.parent; |
+ if (invocation is MethodInvocation && invocation.methodName == node) { |
+ Expression target = invocation.target; |
+ if (target is SimpleIdentifier && |
+ target.staticElement is PrefixElement) { |
+ prefixName = target.name; |
+ } |
+ } |
+ } |
+ // Prepare for selecting the closest element. |
_ClosestElementFinder finder = new _ClosestElementFinder( |
- name, |
+ node.name, |
(Element element) => element is FunctionElement, |
MAX_LEVENSHTEIN_DISTANCE); |
- // this library |
- for (CompilationUnitElement unit in unitLibraryElement.units) { |
- finder._updateList(unit.functions); |
+ // Check to this library units. |
+ if (prefixName == null) { |
+ for (CompilationUnitElement unit in unitLibraryElement.units) { |
+ finder._updateList(unit.functions); |
+ } |
} |
- // imports |
+ // Check unprefixed imports. |
for (ImportElement importElement in unitLibraryElement.imports) { |
- if (importElement.prefix == null) { |
+ if (importElement.prefix?.name == prefixName) { |
Map<String, Element> namespace = getImportNamespace(importElement); |
finder._updateList(namespace.values); |
} |
} |
- // if we have close enough element, suggest to use it |
+ // If we have a close enough element, suggest to use it. |
if (finder._element != null) { |
String closestName = finder._element.name; |
_addReplaceEdit(rf.rangeNode(node), closestName); |