Make 'Inline Method' refactoring work with the new analysis driver.
R=brianwilkerson@google.com
BUG=
Review URL: https://codereview.chromium.org/2540793003 .
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index b1a0a0c..58137c6 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -760,7 +760,11 @@
CompilationUnit unit = await server.getResolvedCompilationUnit(file);
if (unit != null) {
_resetOnAnalysisStarted();
- refactoring = new InlineMethodRefactoring(searchEngine, unit, offset);
+ refactoring =
+ new InlineMethodRefactoring(searchEngine, (Element element) async {
+ String elementPath = element.source.fullName;
+ return await server.getResolvedCompilationUnit(elementPath);
+ }, unit, offset);
}
}
if (kind == RefactoringKind.MOVE_FILE) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 486f724..8a0322c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -191,11 +191,18 @@
}
/**
+ * Completes with the resolved [CompilationUnit] that contains the [element].
+ */
+typedef Future<CompilationUnit> GetResolvedUnitContainingElement(
+ Element element);
+
+/**
* [InlineMethodRefactoring] implementation.
*/
class InlineMethodRefactoringImpl extends RefactoringImpl
implements InlineMethodRefactoring {
final SearchEngine searchEngine;
+ final GetResolvedUnitContainingElement getResolvedUnit;
final CompilationUnit unit;
final int offset;
CorrectionUtils utils;
@@ -218,7 +225,8 @@
List<_ReferenceProcessor> _referenceProcessors = [];
Set<FunctionBody> _alreadyMadeAsync = new Set<FunctionBody>();
- InlineMethodRefactoringImpl(this.searchEngine, this.unit, this.offset) {
+ InlineMethodRefactoringImpl(
+ this.searchEngine, this.getResolvedUnit, this.unit, this.offset) {
utils = new CorrectionUtils(unit);
}
@@ -279,7 +287,7 @@
Future<RefactoringStatus> checkInitialConditions() async {
RefactoringStatus result = new RefactoringStatus();
// prepare method information
- result.addStatus(_prepareMethod());
+ result.addStatus(await _prepareMethod());
if (result.hasFatalError) {
return new Future<RefactoringStatus>.value(result);
}
@@ -301,6 +309,7 @@
_referenceProcessors.clear();
for (SearchMatch reference in references) {
_ReferenceProcessor processor = new _ReferenceProcessor(this, reference);
+ await processor.init();
_referenceProcessors.add(processor);
}
return result;
@@ -327,7 +336,7 @@
/**
* Initializes [_methodElement] and related fields.
*/
- RefactoringStatus _prepareMethod() {
+ Future<RefactoringStatus> _prepareMethod() async {
_methodElement = null;
_methodParameters = null;
_methodBody = null;
@@ -352,7 +361,7 @@
}
_methodElement = element as ExecutableElement;
_isAccessor = element is PropertyAccessorElement;
- _methodUnit = element.unit;
+ _methodUnit = await getResolvedUnit(element);
_methodUtils = new CorrectionUtils(_methodUnit);
// class member
bool isClassMember = element.enclosingElement is ClassElement;
@@ -435,6 +444,7 @@
*/
class _ReferenceProcessor {
final InlineMethodRefactoringImpl ref;
+ final SearchMatch reference;
Element refElement;
CorrectionUtils _refUtils;
@@ -442,10 +452,12 @@
SourceRange _refLineRange;
String _refPrefix;
- _ReferenceProcessor(this.ref, SearchMatch reference) {
+ _ReferenceProcessor(this.ref, this.reference);
+
+ Future<Null> init() async {
refElement = reference.element;
// prepare CorrectionUtils
- CompilationUnit refUnit = refElement.unit;
+ CompilationUnit refUnit = await ref.getResolvedUnit(refElement);
_refUtils = new CorrectionUtils(refUnit);
// prepare node and environment
_node = _refUtils.findNode(reference.sourceRange.offset);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index b4abf87..5cf982f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -249,8 +249,12 @@
* Returns a new [InlineMethodRefactoring] instance.
*/
factory InlineMethodRefactoring(
- SearchEngine searchEngine, CompilationUnit unit, int offset) {
- return new InlineMethodRefactoringImpl(searchEngine, unit, offset);
+ SearchEngine searchEngine,
+ GetResolvedUnitContainingElement getResolvedUnit,
+ CompilationUnit unit,
+ int offset) {
+ return new InlineMethodRefactoringImpl(
+ searchEngine, getResolvedUnit, unit, offset);
}
/**
diff --git a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
index bc1d29c..c629f93 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
@@ -1712,6 +1712,7 @@
void _createRefactoring(String search) {
int offset = findOffset(search);
- refactoring = new InlineMethodRefactoring(searchEngine, testUnit, offset);
+ refactoring = new InlineMethodRefactoring(
+ searchEngine, (element) async => element.unit, testUnit, offset);
}
}