| 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, "()"));
|
| }
|
| });
|
| }
|
|
|