[migration] etract_method.dart
Change-Id: I683d58f131fb610cd343e9446a2abf1466313b75 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/410143 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
committed by
Commit Queue
parent
d960dcd43c
commit
02f86848ee
@@ -2,8 +2,6 @@
|
||||
// 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.
|
||||
|
||||
// ignore_for_file: analyzer_use_new_elements
|
||||
|
||||
import 'package:analysis_server/src/protocol_server.dart' hide Element;
|
||||
import 'package:analysis_server/src/services/correction/name_suggestion.dart';
|
||||
import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
|
||||
@@ -24,7 +22,6 @@ import 'package:analyzer/dart/analysis/session.dart';
|
||||
import 'package:analyzer/dart/ast/ast.dart';
|
||||
import 'package:analyzer/dart/ast/token.dart';
|
||||
import 'package:analyzer/dart/ast/visitor.dart';
|
||||
import 'package:analyzer/dart/element/element.dart';
|
||||
import 'package:analyzer/dart/element/element2.dart';
|
||||
import 'package:analyzer/dart/element/nullability_suffix.dart';
|
||||
import 'package:analyzer/dart/element/type.dart';
|
||||
@@ -37,7 +34,6 @@ import 'package:analyzer/src/dart/ast/utilities.dart';
|
||||
import 'package:analyzer/src/dart/resolver/exit_detector.dart';
|
||||
import 'package:analyzer/src/generated/java_core.dart';
|
||||
import 'package:analyzer/src/utilities/extensions/ast.dart';
|
||||
import 'package:analyzer/src/utilities/extensions/element.dart';
|
||||
import 'package:analyzer/src/utilities/extensions/string.dart';
|
||||
import 'package:analyzer_plugin/utilities/range_factory.dart';
|
||||
import 'package:meta/meta.dart';
|
||||
@@ -214,15 +210,14 @@ Future<void> addLibraryImports(
|
||||
}
|
||||
}
|
||||
|
||||
bool isLocalElement(Element? element) {
|
||||
return element is LocalVariableElement ||
|
||||
element is ParameterElement ||
|
||||
element is FunctionElement &&
|
||||
element.enclosingElement3 is! CompilationUnitElement;
|
||||
bool isLocalElement(Element2? element) {
|
||||
return element is LocalVariableElement2 ||
|
||||
element is FormalParameterElement ||
|
||||
element is LocalFunctionElement;
|
||||
}
|
||||
|
||||
Element? _getLocalElement(SimpleIdentifier node) {
|
||||
var element = node.writeOrReadElement;
|
||||
Element2? _getLocalElement(SimpleIdentifier node) {
|
||||
var element = node.writeOrReadElement2;
|
||||
if (isLocalElement(element)) {
|
||||
return element;
|
||||
}
|
||||
@@ -832,7 +827,7 @@ final class ExtractMethodRefactoringImpl extends RefactoringImpl
|
||||
if (argument.parent is NamedExpression) {
|
||||
argument = argument.parent as NamedExpression;
|
||||
}
|
||||
var parameter = argument.staticParameterElement;
|
||||
var parameter = argument.correspondingParameter;
|
||||
if (parameter != null) {
|
||||
var parameterType = parameter.type;
|
||||
if (parameterType is FunctionType) {
|
||||
@@ -913,7 +908,7 @@ final class ExtractMethodRefactoringImpl extends RefactoringImpl
|
||||
}
|
||||
|
||||
String _getTypeCode(DartType type) =>
|
||||
_resolveResult.libraryElement.getTypeSource(type, _librariesToImport)!;
|
||||
_resolveResult.libraryElement2.getTypeSource(type, _librariesToImport)!;
|
||||
|
||||
void _initializeHasAwait() {
|
||||
var visitor = _HasAwaitVisitor();
|
||||
@@ -954,7 +949,7 @@ final class ExtractMethodRefactoringImpl extends RefactoringImpl
|
||||
_parametersMap.clear();
|
||||
_parameterReferencesMap.clear();
|
||||
var result = RefactoringStatus();
|
||||
var assignedUsedVariables = <VariableElement>[];
|
||||
var assignedUsedVariables = <VariableElement2>[];
|
||||
|
||||
var unit = _resolveResult.unit;
|
||||
_visibleRangeMap = VisibleRangesComputer.forNode(unit);
|
||||
@@ -1040,7 +1035,7 @@ final class ExtractMethodRefactoringImpl extends RefactoringImpl
|
||||
_variableType = _getTypeCode(returnTypeObj);
|
||||
if (_hasAwait) {
|
||||
if (returnTypeObj is InterfaceType &&
|
||||
returnTypeObj.element != typeProvider.futureElement) {
|
||||
returnTypeObj.element3 != typeProvider.futureElement2) {
|
||||
returnType = _getTypeCode(typeProvider.futureType(returnTypeObj));
|
||||
}
|
||||
} else {
|
||||
@@ -1050,8 +1045,8 @@ final class ExtractMethodRefactoringImpl extends RefactoringImpl
|
||||
}
|
||||
|
||||
/// Checks if the given [element] is declared in [_selectionRange].
|
||||
bool _isDeclaredInSelection(Element element) {
|
||||
return _selectionRange.contains(element.nameOffset);
|
||||
bool _isDeclaredInSelection(Element2 element) {
|
||||
return _selectionRange.contains(element.firstFragment.nameOffset2!);
|
||||
}
|
||||
|
||||
/// Checks if it is OK to extract the node with the given [SourceRange].
|
||||
@@ -1096,7 +1091,7 @@ final class ExtractMethodRefactoringImpl extends RefactoringImpl
|
||||
}
|
||||
|
||||
/// Checks if [element] is referenced after [_selectionRange].
|
||||
bool _isUsedAfterSelection(Element element) {
|
||||
bool _isUsedAfterSelection(Element2 element) {
|
||||
var visitor = _IsUsedAfterSelectionVisitor(this, element);
|
||||
_parentMember!.accept(visitor);
|
||||
return visitor.result;
|
||||
@@ -1345,11 +1340,13 @@ class _ExtractMethodAnalyzer extends StatementAnalyzer {
|
||||
invalidSelection('Cannot extract the name part of a declaration.');
|
||||
}
|
||||
// method name
|
||||
var element = node.writeOrReadElement;
|
||||
if (element is FunctionElement || element is MethodElement) {
|
||||
var element = node.writeOrReadElement2;
|
||||
if (element is LocalFunctionElement ||
|
||||
element is MethodElement2 ||
|
||||
element is TopLevelFunctionElement) {
|
||||
invalidSelection('Cannot extract a single method name.');
|
||||
}
|
||||
if (element is PrefixElement) {
|
||||
if (element is PrefixElement2) {
|
||||
invalidSelection('Cannot extract an import prefix.');
|
||||
}
|
||||
var parent = node.parent;
|
||||
@@ -1407,17 +1404,17 @@ class _GetSourcePatternVisitor extends GeneralizingAstVisitor<void> {
|
||||
|
||||
@override
|
||||
void visitSimpleIdentifier(SimpleIdentifier node) {
|
||||
_addPatterns(nameToken: node.token, element: node.staticElement);
|
||||
_addPatterns(nameToken: node.token, element: node.element);
|
||||
}
|
||||
|
||||
@override
|
||||
void visitVariableDeclaration(VariableDeclaration node) {
|
||||
_addPatterns(nameToken: node.name, element: node.declaredElement);
|
||||
_addPatterns(nameToken: node.name, element: node.declaredFragment?.element);
|
||||
|
||||
super.visitVariableDeclaration(node);
|
||||
}
|
||||
|
||||
void _addPatterns({required Token nameToken, required Element? element}) {
|
||||
void _addPatterns({required Token nameToken, required Element2? element}) {
|
||||
var nameRange = range.token(nameToken);
|
||||
if (partRange.covers(nameRange)) {
|
||||
if (element != null && isLocalElement(element)) {
|
||||
@@ -1440,11 +1437,11 @@ class _GetSourcePatternVisitor extends GeneralizingAstVisitor<void> {
|
||||
}
|
||||
}
|
||||
|
||||
DartType _getElementType(Element element) {
|
||||
if (element is VariableElement) {
|
||||
DartType _getElementType(Element2 element) {
|
||||
if (element is VariableElement2) {
|
||||
return element.type;
|
||||
}
|
||||
if (element is FunctionElement) {
|
||||
if (element is LocalFunctionElement) {
|
||||
return element.type;
|
||||
}
|
||||
throw StateError('Unknown element type: ${element.runtimeType}');
|
||||
@@ -1620,7 +1617,7 @@ class _InitializeOccurrencesVisitor extends GeneralizingAstVisitor<void> {
|
||||
|
||||
class _InitializeParametersVisitor extends GeneralizingAstVisitor<void> {
|
||||
final ExtractMethodRefactoringImpl ref;
|
||||
final List<VariableElement> assignedUsedVariables;
|
||||
final List<VariableElement2> assignedUsedVariables;
|
||||
|
||||
_InitializeParametersVisitor(this.ref, this.assignedUsedVariables);
|
||||
|
||||
@@ -1645,7 +1642,7 @@ class _InitializeParametersVisitor extends GeneralizingAstVisitor<void> {
|
||||
if (parameter == null) {
|
||||
var parameterType = node.writeOrReadType!;
|
||||
var parametersBuffer = StringBuffer();
|
||||
var parameterTypeCode = ref._resolveResult.libraryElement
|
||||
var parameterTypeCode = ref._resolveResult.libraryElement2
|
||||
.getTypeSource(
|
||||
parameterType,
|
||||
ref._librariesToImport,
|
||||
@@ -1671,17 +1668,17 @@ class _InitializeParametersVisitor extends GeneralizingAstVisitor<void> {
|
||||
}
|
||||
// remember, if assigned and used after selection
|
||||
if (isLeftHandOfAssignment(node) && ref._isUsedAfterSelection(element)) {
|
||||
if (element is VariableElement &&
|
||||
if (element is VariableElement2 &&
|
||||
!assignedUsedVariables.contains(element)) {
|
||||
assignedUsedVariables.add(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
// remember information for conflicts checking
|
||||
if (element is LocalElement) {
|
||||
if (element is LocalElement2) {
|
||||
// declared local elements
|
||||
if (node.inDeclarationContext()) {
|
||||
var range = ref._visibleRangeMap[element.asElement2];
|
||||
var range = ref._visibleRangeMap[element];
|
||||
if (range != null) {
|
||||
var ranges = ref._localNames.putIfAbsent(name, () => <SourceRange>[]);
|
||||
ranges.add(range);
|
||||
@@ -1699,7 +1696,7 @@ class _InitializeParametersVisitor extends GeneralizingAstVisitor<void> {
|
||||
visitVariableDeclaration(VariableDeclaration node) {
|
||||
var nodeRange = range.node(node);
|
||||
if (ref._selectionRange.covers(nodeRange)) {
|
||||
var element = node.declaredElement!;
|
||||
var element = node.declaredFragment!.element;
|
||||
|
||||
// remember, if assigned and used after selection
|
||||
if (ref._isUsedAfterSelection(element)) {
|
||||
@@ -1709,9 +1706,9 @@ class _InitializeParametersVisitor extends GeneralizingAstVisitor<void> {
|
||||
}
|
||||
|
||||
// remember information for conflicts checking
|
||||
if (element is LocalElement) {
|
||||
if (element is LocalVariableElement2) {
|
||||
// declared local elements
|
||||
var range = ref._visibleRangeMap[element.asElement2 as LocalElement2];
|
||||
var range = ref._visibleRangeMap[element];
|
||||
if (range != null) {
|
||||
var name = node.name.lexeme;
|
||||
var ranges = ref._localNames.putIfAbsent(name, () => <SourceRange>[]);
|
||||
@@ -1726,14 +1723,14 @@ class _InitializeParametersVisitor extends GeneralizingAstVisitor<void> {
|
||||
|
||||
class _IsUsedAfterSelectionVisitor extends GeneralizingAstVisitor<void> {
|
||||
final ExtractMethodRefactoringImpl ref;
|
||||
final Element element;
|
||||
final Element2 element;
|
||||
bool result = false;
|
||||
|
||||
_IsUsedAfterSelectionVisitor(this.ref, this.element);
|
||||
|
||||
@override
|
||||
void visitSimpleIdentifier(SimpleIdentifier node) {
|
||||
var nodeElement = node.writeOrReadElement;
|
||||
var nodeElement = node.writeOrReadElement2;
|
||||
if (identical(nodeElement, element)) {
|
||||
var nodeOffset = node.offset;
|
||||
if (nodeOffset > ref._selectionRange.end) {
|
||||
@@ -1778,10 +1775,10 @@ class _SourcePattern {
|
||||
}
|
||||
}
|
||||
|
||||
extension on LibraryElement {
|
||||
extension on LibraryElement2 {
|
||||
/// Returns the source to reference [type] in this [CompilationUnit].
|
||||
///
|
||||
/// Fills [librariesToImport] with [LibraryElement]s whose elements are
|
||||
/// Fills [librariesToImport] with library elements whose elements are
|
||||
/// used by the generated source, but not imported.
|
||||
String? getTypeSource(
|
||||
DartType type,
|
||||
@@ -1792,7 +1789,7 @@ extension on LibraryElement {
|
||||
if (alias != null) {
|
||||
return _getTypeCodeElementArguments(
|
||||
librariesToImport: librariesToImport,
|
||||
element: alias.element,
|
||||
element: alias.element2,
|
||||
isNullable: type.nullabilitySuffix == NullabilitySuffix.question,
|
||||
typeArguments: alias.typeArguments,
|
||||
);
|
||||
@@ -1807,15 +1804,16 @@ extension on LibraryElement {
|
||||
return 'Function';
|
||||
}
|
||||
parametersBuffer.write('(');
|
||||
for (var parameter in type.parameters) {
|
||||
for (var parameter in type.formalParameters) {
|
||||
var parameterType = getTypeSource(parameter.type, librariesToImport);
|
||||
if (parametersBuffer.length != 1) {
|
||||
parametersBuffer.write(', ');
|
||||
}
|
||||
parametersBuffer.write(parameterType);
|
||||
if (parameter.name.isNotEmpty) {
|
||||
var parameterName = parameter.name3;
|
||||
if (parameterName != null && parameterName.isNotEmpty) {
|
||||
parametersBuffer.write(' ');
|
||||
parametersBuffer.write(parameter.name);
|
||||
parametersBuffer.write(parameterName);
|
||||
}
|
||||
}
|
||||
parametersBuffer.write(')');
|
||||
@@ -1825,7 +1823,7 @@ extension on LibraryElement {
|
||||
if (type is InterfaceType) {
|
||||
return _getTypeCodeElementArguments(
|
||||
librariesToImport: librariesToImport,
|
||||
element: type.element,
|
||||
element: type.element3,
|
||||
isNullable: type.nullabilitySuffix == NullabilitySuffix.question,
|
||||
typeArguments: type.typeArguments,
|
||||
);
|
||||
@@ -1862,10 +1860,10 @@ extension on LibraryElement {
|
||||
/// Returns the import element used to import given [element] into the
|
||||
/// library.
|
||||
///
|
||||
/// May be `null` if was not imported, i.e. declared in the same library.
|
||||
LibraryImportElement? _getImportElement(Element element) {
|
||||
for (var imp in library.definingCompilationUnit.libraryImports) {
|
||||
var definedNames = imp.namespace.definedNames;
|
||||
/// Returns `null` if was not imported, i.e. declared in the same library.
|
||||
LibraryImport? _getImportElement(Element2 element) {
|
||||
for (var imp in firstFragment.libraryImports2) {
|
||||
var definedNames = imp.namespace.definedNames2;
|
||||
if (definedNames.containsValue(element)) {
|
||||
return imp;
|
||||
}
|
||||
@@ -1875,14 +1873,14 @@ extension on LibraryElement {
|
||||
|
||||
String? _getTypeCodeElementArguments({
|
||||
required Set<Source> librariesToImport,
|
||||
required Element element,
|
||||
required Element2 element,
|
||||
required bool isNullable,
|
||||
required List<DartType> typeArguments,
|
||||
}) {
|
||||
var sb = StringBuffer();
|
||||
|
||||
// Check if imported.
|
||||
var library = element.library;
|
||||
var library = element.library2;
|
||||
if (library != null && library != this) {
|
||||
// No source, if private.
|
||||
if (element.isPrivate) {
|
||||
@@ -1891,13 +1889,13 @@ extension on LibraryElement {
|
||||
// Ensure import.
|
||||
var importElement = _getImportElement(element);
|
||||
if (importElement != null) {
|
||||
var prefix = importElement.prefix?.element;
|
||||
var prefix = importElement.prefix2?.element;
|
||||
if (prefix != null) {
|
||||
sb.write(prefix.displayName);
|
||||
sb.write('.');
|
||||
}
|
||||
} else {
|
||||
librariesToImport.add(library.source);
|
||||
librariesToImport.add(library.firstFragment.source);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user