Skip to content

Commit ffe4a8c

Browse files
DanTupCommit Queue
authored andcommitted
[analysis_server] Prevent convert method<->getter refactors on SDK/external package files
Fixes Dart-Code/Dart-Code#4221. Change-Id: I1a017f098d3d72bc19c91cead4c68b2666c5fe01 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/264480 Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 8dc77f6 commit ffe4a8c

27 files changed

+100
-78
lines changed

pkg/analysis_server/lib/src/handler/legacy/edit_get_available_refactorings.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,16 @@ class EditGetAvailableRefactoringsHandler extends LegacyHandler {
5959
var node = NodeLocator(offset).searchWithin(resolvedUnit.unit);
6060
var element = server.getElementOfNode(node);
6161
if (element != null) {
62+
final refactoringWorkspace = server.refactoringWorkspace;
6263
// try CONVERT_METHOD_TO_GETTER
6364
if (element is ExecutableElement) {
6465
if (ConvertMethodToGetterRefactoring(
65-
searchEngine, resolvedUnit.session, element)
66+
refactoringWorkspace, resolvedUnit.session, element)
6667
.isAvailable()) {
6768
kinds.add(RefactoringKind.CONVERT_METHOD_TO_GETTER);
6869
}
6970
}
7071
// try RENAME
71-
final refactoringWorkspace = server.refactoringWorkspace;
7272
var renameRefactoring = RenameRefactoring.create(
7373
refactoringWorkspace, resolvedUnit, element);
7474
if (renameRefactoring != null) {

pkg/analysis_server/lib/src/lsp/handlers/commands/abstract_refactor.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ abstract class AbstractRefactorCommandHandler extends SimpleEditCommandHandler
112112
if (element != null) {
113113
if (element is PropertyAccessorElement) {
114114
final refactor = ConvertGetterToMethodRefactoring(
115-
server.searchEngine, result.session, element);
115+
server.refactoringWorkspace, result.session, element);
116116
return success(refactor);
117117
}
118118
}
@@ -125,7 +125,7 @@ abstract class AbstractRefactorCommandHandler extends SimpleEditCommandHandler
125125
if (element != null) {
126126
if (element is ExecutableElement) {
127127
final refactor = ConvertMethodToGetterRefactoring(
128-
server.searchEngine, result.session, element);
128+
server.refactoringWorkspace, result.session, element);
129129
return success(refactor);
130130
}
131131
}

pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ class CodeActionHandler
629629
// Getter to Method
630630
if (element is PropertyAccessorElement &&
631631
ConvertGetterToMethodRefactoring(
632-
server.searchEngine, unit.session, element)
632+
server.refactoringWorkspace, unit.session, element)
633633
.isAvailable()) {
634634
refactorActions.add(createRefactor(
635635
CodeActionKind.RefactorRewrite,
@@ -640,7 +640,7 @@ class CodeActionHandler
640640
// Method to Getter
641641
if (element is ExecutableElement &&
642642
ConvertMethodToGetterRefactoring(
643-
server.searchEngine, unit.session, element)
643+
server.refactoringWorkspace, unit.session, element)
644644
.isAvailable()) {
645645
refactorActions.add(createRefactor(
646646
CodeActionKind.RefactorRewrite,

pkg/analysis_server/lib/src/services/refactoring/legacy/convert_getter_to_method.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@ import 'package:analyzer_plugin/utilities/range_factory.dart';
1818
/// [ConvertMethodToGetterRefactoring] implementation.
1919
class ConvertGetterToMethodRefactoringImpl extends RefactoringImpl
2020
implements ConvertGetterToMethodRefactoring {
21+
final RefactoringWorkspace workspace;
2122
final SearchEngine searchEngine;
2223
final AnalysisSession session;
2324
final PropertyAccessorElement element;
2425

2526
late SourceChange change;
2627

2728
ConvertGetterToMethodRefactoringImpl(
28-
this.searchEngine, this.session, this.element);
29+
this.workspace, this.session, this.element)
30+
: searchEngine = workspace.searchEngine;
2931

3032
@override
3133
String get refactoringName => 'Convert Getter To Method';
@@ -77,6 +79,11 @@ class ConvertGetterToMethodRefactoringImpl extends RefactoringImpl
7779

7880
/// Checks if [element] is valid to perform this refactor.
7981
RefactoringStatus _checkElement() {
82+
if (!workspace.containsElement(element)) {
83+
return RefactoringStatus.fatal(
84+
'Only getters in your workspace can be converted.');
85+
}
86+
8087
if (!element.isGetter || element.isSynthetic) {
8188
return RefactoringStatus.fatal(
8289
'Only explicit getters can be converted to methods.');

pkg/analysis_server/lib/src/services/refactoring/legacy/convert_method_to_getter.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,17 @@ import 'package:analyzer_plugin/utilities/range_factory.dart';
1818
/// [ConvertMethodToGetterRefactoring] implementation.
1919
class ConvertMethodToGetterRefactoringImpl extends RefactoringImpl
2020
implements ConvertMethodToGetterRefactoring {
21+
final RefactoringWorkspace workspace;
2122
final SearchEngine searchEngine;
2223
final AnalysisSessionHelper sessionHelper;
2324
final ExecutableElement element;
2425

2526
late SourceChange change;
2627

2728
ConvertMethodToGetterRefactoringImpl(
28-
this.searchEngine, AnalysisSession session, this.element)
29-
: sessionHelper = AnalysisSessionHelper(session);
29+
this.workspace, AnalysisSession session, this.element)
30+
: sessionHelper = AnalysisSessionHelper(session),
31+
searchEngine = workspace.searchEngine;
3032

3133
@override
3234
String get refactoringName => 'Convert Method To Getter';
@@ -70,6 +72,11 @@ class ConvertMethodToGetterRefactoringImpl extends RefactoringImpl
7072

7173
/// Checks if [element] is valid to perform this refactor.
7274
RefactoringStatus _checkElement() {
75+
if (!workspace.containsElement(element)) {
76+
return RefactoringStatus.fatal(
77+
'Only methods in your workspace can be converted.');
78+
}
79+
7380
// check Element type
7481
if (element is FunctionElement) {
7582
if (element.enclosingElement is! CompilationUnitElement) {

pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ import 'package:analyzer_plugin/protocol/protocol_common.dart'
3838
abstract class ConvertGetterToMethodRefactoring implements Refactoring {
3939
/// Returns a new [ConvertMethodToGetterRefactoring] instance for converting
4040
/// [element] and all the corresponding hierarchy elements.
41-
factory ConvertGetterToMethodRefactoring(SearchEngine searchEngine,
41+
factory ConvertGetterToMethodRefactoring(RefactoringWorkspace workspace,
4242
AnalysisSession session, PropertyAccessorElement element) {
43-
return ConvertGetterToMethodRefactoringImpl(searchEngine, session, element);
43+
return ConvertGetterToMethodRefactoringImpl(workspace, session, element);
4444
}
4545

4646
/// Return `true` if refactoring is available, possibly without checking all
@@ -58,9 +58,9 @@ abstract class ConvertGetterToMethodRefactoring implements Refactoring {
5858
abstract class ConvertMethodToGetterRefactoring implements Refactoring {
5959
/// Returns a new [ConvertMethodToGetterRefactoring] instance for converting
6060
/// [element] and all the corresponding hierarchy elements.
61-
factory ConvertMethodToGetterRefactoring(SearchEngine searchEngine,
61+
factory ConvertMethodToGetterRefactoring(RefactoringWorkspace workspace,
6262
AnalysisSession session, ExecutableElement element) {
63-
return ConvertMethodToGetterRefactoringImpl(searchEngine, session, element);
63+
return ConvertMethodToGetterRefactoringImpl(workspace, session, element);
6464
}
6565

6666
/// Return `true` if refactoring is available, possibly without checking all

pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring_manager.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ class RefactoringManager {
205205
if (element != null) {
206206
if (element is PropertyAccessorElement) {
207207
refactoring = ConvertGetterToMethodRefactoring(
208-
searchEngine, resolvedUnit.session, element);
208+
refactoringWorkspace, resolvedUnit.session, element);
209209
}
210210
}
211211
}
@@ -217,7 +217,7 @@ class RefactoringManager {
217217
if (element != null) {
218218
if (element is ExecutableElement) {
219219
refactoring = ConvertMethodToGetterRefactoring(
220-
searchEngine, resolvedUnit.session, element);
220+
refactoringWorkspace, resolvedUnit.session, element);
221221
}
222222
}
223223
}

pkg/analysis_server/test/abstract_context.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,9 @@ class AbstractContextTest with ResourceProviderMixin {
166166
return context.driver;
167167
}
168168

169+
Future<ResolvedUnitResult> getResolvedUnit(String path) async =>
170+
await (await session).getResolvedUnit(path) as ResolvedUnitResult;
171+
169172
@override
170173
File newFile(String path, String content) {
171174
if (_analysisContextCollection != null && !path.endsWith('.dart')) {

pkg/analysis_server/test/abstract_single_unit.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ class AbstractSingleUnitTest extends AbstractContextTest {
6464
useLineEndingsForPlatform ? normalizeNewlinesForPlatform(code) : code;
6565

6666
Future<void> resolveFile2(String path) async {
67-
var result =
68-
await (await session).getResolvedUnit(path) as ResolvedUnitResult;
67+
var result = await getResolvedUnit(path);
6968
testAnalysisResult = result;
7069
testCode = result.content;
7170
testUnit = result.unit;

pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -558,8 +558,7 @@ abstract class _BaseDartCompletionContributorTest extends AbstractContextTest {
558558
DartCompletionRequest request);
559559

560560
Future computeSuggestions({int times = 200}) async {
561-
result =
562-
await (await session).getResolvedUnit(testFile) as ResolvedUnitResult;
561+
result = await getResolvedUnit(testFile);
563562

564563
// Build the request
565564
var request = DartCompletionRequest.forResolvedUnit(

0 commit comments

Comments
 (0)