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

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

Issue 1655353002: Issue 25616. Support for extracting methods with function-typed parameters. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 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
Index: pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index 61352379fd5c39d38bf43e903518510177d9d49b..7855298d1b95e79459fbf5a1e95d353b45abb3ac 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -31,6 +31,16 @@ import 'package:analyzer/src/generated/source.dart';
const String _TOKEN_SEPARATOR = '\uFFFF';
+Element _getLocalElement(SimpleIdentifier node) {
+ Element element = node.staticElement;
+ if (element is LocalVariableElement ||
+ element is ParameterElement ||
+ element is FunctionElement && element.visibleRange != null) {
+ return element;
+ }
+ return null;
+}
+
/**
* Returns the "normalized" version of the given source, which is reconstructed
* from tokens, so ignores all the comments and spaces.
@@ -161,6 +171,10 @@ class ExtractMethodRefactoringImpl extends RefactoringImpl
}
// name
sb.write(parameter.name);
+ // optional function-typed parameter parameters
+ if (parameter.parameters != null) {
+ sb.write(parameter.parameters);
+ }
}
sb.write(')');
}
@@ -662,9 +676,9 @@ class ExtractMethodRefactoringImpl extends RefactoringImpl
}
/**
- * Checks if the given [VariableElement] is declared in [selectionRange].
+ * Checks if the given [element] is declared in [selectionRange].
*/
- bool _isDeclaredInSelection(VariableElement element) {
+ bool _isDeclaredInSelection(Element element) {
return selectionRange.contains(element.nameOffset);
}
@@ -700,7 +714,7 @@ class ExtractMethodRefactoringImpl extends RefactoringImpl
/**
* Checks if [element] is referenced after [selectionRange].
*/
- bool _isUsedAfterSelection(VariableElement element) {
+ bool _isUsedAfterSelection(Element element) {
var visitor = new _IsUsedAfterSelectionVisitor(this, element);
_parentMember.accept(visitor);
return visitor.result;
@@ -907,18 +921,18 @@ class _GetSourcePatternVisitor extends GeneralizingAstVisitor {
visitSimpleIdentifier(SimpleIdentifier node) {
SourceRange nodeRange = rangeNode(node);
if (partRange.covers(nodeRange)) {
- VariableElement variableElement =
- getLocalOrParameterVariableElement(node);
- if (variableElement != null) {
+ Element element = _getLocalElement(node);
+ if (element != null) {
// name of a named expression
if (isNamedExpressionName(node)) {
return;
}
// continue
- String originalName = variableElement.displayName;
+ String originalName = element.displayName;
String patternName = pattern.originalToPatternNames[originalName];
if (patternName == null) {
- pattern.parameterTypes.add(variableElement.type);
+ DartType parameterType = _getElementType(element);
+ pattern.parameterTypes.add(parameterType);
patternName = '__refVar${pattern.originalToPatternNames.length}';
pattern.originalToPatternNames[originalName] = patternName;
}
@@ -927,6 +941,16 @@ class _GetSourcePatternVisitor extends GeneralizingAstVisitor {
}
}
}
+
+ DartType _getElementType(Element element) {
+ if (element is VariableElement) {
+ return element.type;
+ }
+ if (element is FunctionElement) {
+ return element.type;
+ }
+ throw new StateError('Unknown element type: ${element?.runtimeType}');
+ }
}
class _HasAwaitVisitor extends GeneralizingAstVisitor {
@@ -1077,23 +1101,28 @@ class _InitializeParametersVisitor extends GeneralizingAstVisitor {
return;
}
String name = node.name;
- // analyze local variable
- VariableElement variableElement = getLocalOrParameterVariableElement(node);
- if (variableElement != null) {
+ // analyze local element
+ Element element = _getLocalElement(node);
+ if (element != null) {
// name of the named expression
if (isNamedExpressionName(node)) {
return;
}
// if declared outside, add parameter
- if (!ref._isDeclaredInSelection(variableElement)) {
+ if (!ref._isDeclaredInSelection(element)) {
// add parameter
RefactoringMethodParameter parameter = ref._parametersMap[name];
if (parameter == null) {
DartType parameterType = node.bestType;
- String parameterTypeCode = ref._getTypeCode(parameterType);
+ StringBuffer parametersBuffer = new StringBuffer();
+ String parameterTypeCode = ref.utils.getTypeSource(
+ parameterType, ref.librariesToImport,
+ parametersBuffer: parametersBuffer);
+ String parametersCode =
+ parametersBuffer.isNotEmpty ? parametersBuffer.toString() : null;
parameter = new RefactoringMethodParameter(
RefactoringMethodParameterKind.REQUIRED, parameterTypeCode, name,
- id: name);
+ parameters: parametersCode, id: name);
ref._parameters.add(parameter);
ref._parametersMap[name] = parameter;
}
@@ -1101,20 +1130,18 @@ class _InitializeParametersVisitor extends GeneralizingAstVisitor {
ref._addParameterReference(name, nodeRange);
}
// remember, if assigned and used after selection
- if (isLeftHandOfAssignment(node) &&
- ref._isUsedAfterSelection(variableElement)) {
- if (!assignedUsedVariables.contains(variableElement)) {
- assignedUsedVariables.add(variableElement);
+ if (isLeftHandOfAssignment(node) && ref._isUsedAfterSelection(element)) {
+ if (!assignedUsedVariables.contains(element)) {
+ assignedUsedVariables.add(element);
}
}
}
// remember information for conflicts checking
- if (variableElement is LocalElement) {
+ if (element is LocalElement) {
// declared local elements
- LocalElement localElement = variableElement as LocalElement;
if (node.inDeclarationContext()) {
ref._localNames.putIfAbsent(name, () => <SourceRange>[]);
- ref._localNames[name].add(localElement.visibleRange);
+ ref._localNames[name].add(element.visibleRange);
}
} else {
// unqualified non-local names
@@ -1127,14 +1154,14 @@ class _InitializeParametersVisitor extends GeneralizingAstVisitor {
class _IsUsedAfterSelectionVisitor extends GeneralizingAstVisitor {
final ExtractMethodRefactoringImpl ref;
- final VariableElement element;
+ final Element element;
bool result = false;
_IsUsedAfterSelectionVisitor(this.ref, this.element);
@override
visitSimpleIdentifier(SimpleIdentifier node) {
- VariableElement nodeElement = getLocalVariableElement(node);
+ Element nodeElement = node.staticElement;
if (identical(nodeElement, element)) {
int nodeOffset = node.offset;
if (nodeOffset > ref.selectionRange.end) {

Powered by Google App Engine
This is Rietveld 408576698