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

Unified Diff: pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart

Issue 594503005: 'Convert Getter to Method' refactoring implementation. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/analysis_server/lib/src/services/refactoring/refactoring.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
similarity index 51%
copy from pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
copy to pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
index 7a63d3189e109fed64f35a011ee110cf3b08ee4f..1ae153d2ca4b91384252e177d6ff177cb09cc8eb 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library services.src.refactoring.convert_method_to_getter;
+library services.src.refactoring.convert_getter_to_getter;
import 'dart:async';
@@ -16,22 +16,23 @@ import 'package:analysis_server/src/services/search/search_engine.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/scanner.dart';
/**
* [ConvertMethodToGetterRefactoring] implementation.
*/
-class ConvertMethodToGetterRefactoringImpl extends RefactoringImpl implements
- ConvertMethodToGetterRefactoring {
+class ConvertGetterToMethodRefactoringImpl extends RefactoringImpl implements
+ ConvertGetterToMethodRefactoring {
final SearchEngine searchEngine;
- final ExecutableElement element;
+ final PropertyAccessorElement element;
SourceChange change;
- ConvertMethodToGetterRefactoringImpl(this.searchEngine, this.element);
+ ConvertGetterToMethodRefactoringImpl(this.searchEngine, this.element);
@override
- String get refactoringName => 'Convert Method To Getter';
+ String get refactoringName => 'Convert Getter To Method';
@override
Future<RefactoringStatus> checkFinalConditions() {
@@ -48,18 +49,21 @@ class ConvertMethodToGetterRefactoringImpl extends RefactoringImpl implements
@override
Future<SourceChange> createChange() {
change = new SourceChange(refactoringName);
- // FunctionElement
- if (element is FunctionElement) {
+ // function
+ if (element.enclosingElement is CompilationUnitElement) {
_updateElementDeclaration(element);
return _updateElementReferences(element).then((_) => change);
}
- // MethodElement
- if (element is MethodElement) {
- MethodElement method = element;
- return getHierarchyMembers(searchEngine, method).then((elements) {
- return Future.forEach(elements, (Element element) {
- _updateElementDeclaration(element);
- _updateElementReferences(element);
+ // method
+ if (element.enclosingElement is ClassElement) {
+ FieldElement field = element.variable;
+ return getHierarchyMembers(searchEngine, field).then((elements) {
+ return Future.forEach(elements, (FieldElement field) {
+ PropertyAccessorElement getter = field.getter;
+ if (!getter.isSynthetic) {
+ _updateElementDeclaration(getter);
+ _updateElementReferences(getter);
+ }
});
}).then((_) => change);
}
@@ -71,45 +75,33 @@ class ConvertMethodToGetterRefactoringImpl extends RefactoringImpl implements
bool requiresPreview() => false;
RefactoringStatus _checkInitialConditions() {
- // check Element type
- if (element is FunctionElement) {
- if (element.enclosingElement is! CompilationUnitElement) {
- return new RefactoringStatus.fatal(
- 'Only top-level functions can be converted to getters.');
- }
- } else if (element is! MethodElement) {
- return new RefactoringStatus.fatal(
- 'Only class methods or top-level functions can be converted to getters.');
- }
- // no parameters
- if (element.parameters.isNotEmpty) {
+ if (!element.isGetter || element.isSynthetic) {
return new RefactoringStatus.fatal(
- 'Only methods without parameters can be converted to getters.');
+ 'Only explicit getters can be converted to methods.');
}
- // OK
return new RefactoringStatus();
}
- void _updateElementDeclaration(Element element) {
- // prepare parameters
- FormalParameterList parameters;
+ void _updateElementDeclaration(PropertyAccessorElement element) {
+ // prepare "get" keyword
+ Token getKeyword = null;
{
AstNode node = element.node;
if (node is MethodDeclaration) {
- parameters = node.parameters;
- }
- if (node is FunctionDeclaration) {
- parameters = node.functionExpression.parameters;
+ getKeyword = node.propertyKeyword;
+ } else if (node is FunctionDeclaration) {
+ getKeyword = node.propertyKeyword;
}
}
- // insert "get "
- {
- SourceEdit edit = new SourceEdit(element.nameOffset, 0, 'get ');
+ // remove "get "
+ if (getKeyword != null) {
+ SourceRange getRange = rangeStartEnd(getKeyword, element.nameOffset);
+ SourceEdit edit = new SourceEdit.range(getRange, '');
change.addElementEdit(element, edit);
}
- // remove parameters
+ // add parameters "()"
{
- SourceEdit edit = new SourceEdit.range(rangeNode(parameters), '');
+ SourceEdit edit = new SourceEdit(rangeElementName(element).end, 0, '()');
change.addElementEdit(element, edit);
}
}
@@ -120,20 +112,10 @@ class ConvertMethodToGetterRefactoringImpl extends RefactoringImpl implements
for (SourceReference reference in references) {
Element refElement = reference.element;
SourceRange refRange = reference.range;
- // prepare invocation
- MethodInvocation invocation;
- {
- CompilationUnit refUnit = refElement.unit;
- AstNode refNode =
- new NodeLocator.con1(refRange.offset).searchWithin(refUnit);
- invocation = refNode.getAncestor((node) => node is MethodInvocation);
- }
- // we need invocation
- if (invocation != null) {
- SourceRange range = rangeEndEnd(refRange, invocation);
- SourceEdit edit = new SourceEdit.range(range, '');
- change.addElementEdit(refElement, edit);
- }
+ // insert "()"
+ change.addElementEdit(
+ refElement,
+ new SourceEdit(refRange.end, 0, "()"));
}
});
}
« no previous file with comments | « no previous file | pkg/analysis_server/lib/src/services/refactoring/refactoring.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698