blob: 986550e2480849ec556c72e399304d012b0d3931 [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// 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.
import 'package:analysis_server/src/services/correction/namespace.dart';
import 'package:analysis_server/src/services/refactoring/legacy/refactoring.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/ast/element_locator.dart';
import 'package:analyzer/src/utilities/extensions/element.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
import 'package:test/test.dart';
import 'abstract_refactoring.dart';
export 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
/// The base class for all [RenameRefactoring] tests.
class RenameRefactoringTest extends RefactoringTest {
@override
late RenameRefactoring refactoring;
/// Asserts that [refactoring] has potential edits in [testFile] at offset
/// of the given [searches].
void assertPotentialEdits(List<String> searches) {
var expectedOffsets = <int>{};
for (var search in searches) {
var offset = findOffset(search);
expectedOffsets.add(offset);
}
// remove offset marked as potential
for (var potentialId in refactoring.potentialEditIds) {
var edit = findEditById(potentialId);
expect(edit, isNotNull);
expectedOffsets.remove(edit.offset);
}
// all potential offsets are marked as such
expect(expectedOffsets, isEmpty);
}
/// Creates a new [RenameRefactoring] in [refactoring] for the element of
/// the [SimpleIdentifier] at the given [search] pattern.
void createRenameRefactoringAtString(String search) {
var node = findNode.any(search);
Element2? element;
switch (node) {
case ImportDirective():
element = MockLibraryImportElement(node.libraryImport!);
default:
element = ElementLocator.locate2(node);
}
if (node is SimpleIdentifier && element is PrefixElement2) {
element = MockLibraryImportElement(getImportElement(node)!);
}
createRenameRefactoringForElement2(element);
}
/// Creates a new [RenameRefactoring] in [refactoring] for [element].
/// Fails if no [RenameRefactoring] can be created.
void createRenameRefactoringForElement2(Element2? element) {
var workspace = RefactoringWorkspace([driverFor(testFile)], searchEngine);
var refactoring = RenameRefactoring.create(
workspace,
testAnalysisResult,
element,
);
if (refactoring == null) {
fail("No refactoring for '$element'.");
}
this.refactoring = refactoring;
}
/// Returns the [Edit] with the given [id], maybe `null`.
SourceEdit findEditById(String id) {
for (var fileEdit in refactoringChange.edits) {
for (var edit in fileEdit.edits) {
if (edit.id == id) {
return edit;
}
}
}
fail('No edit with id: $id');
}
}