Skip to content

Commit 6925623

Browse files
author
Dart CI
committed
Version 2.18.0-224.0.dev
Merge commit '8596955593815cc72f6f65fe1669a63805f0671d' into 'dev'
2 parents 9825550 + 8596955 commit 6925623

11 files changed

+148
-36
lines changed

pkg/analysis_server/test/lsp/code_actions_abstract.dart

+4-1
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ abstract class AbstractCodeActionsTest extends AbstractLspAnalysisServerTest {
1313
Uri uri,
1414
String command,
1515
String title, {
16+
Range? range,
17+
Position? position,
1618
bool asCodeActionLiteral = false,
1719
bool asCommand = false,
1820
}) async {
19-
final codeActions = await getCodeActions(uri.toString());
21+
final codeActions =
22+
await getCodeActions(uri.toString(), range: range, position: position);
2023
final codeAction = findCommand(codeActions, command)!;
2124

2225
codeAction.map(

pkg/analysis_server/test/lsp/code_actions_fixes_test.dart

+4-1
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,10 @@ ProcessInfo b;
463463
emptyTextDocumentClientCapabilities, [CodeActionKind.QuickFix]),
464464
);
465465

466-
final codeActions = await getCodeActions(otherFileUri.toString());
466+
final codeActions = await getCodeActions(
467+
otherFileUri.toString(),
468+
position: startOfDocPos,
469+
);
467470
expect(codeActions, isEmpty);
468471
}
469472

pkg/analysis_server/test/lsp/code_actions_refactor_test.dart

+6-4
Original file line numberDiff line numberDiff line change
@@ -354,10 +354,11 @@ import 'dart:convert';
354354
^
355355
void f() {}
356356
''';
357-
newFile(mainFilePath, content);
357+
newFile(mainFilePath, withoutMarkers(content));
358358
await initialize();
359359

360-
final codeActions = await getCodeActions(mainFileUri.toString());
360+
final codeActions = await getCodeActions(mainFileUri.toString(),
361+
position: positionFromMarker(content));
361362
final codeAction =
362363
findCommand(codeActions, Commands.performRefactor, extractMethodTitle);
363364
expect(codeAction, isNull);
@@ -743,10 +744,11 @@ import 'dart:convert';
743744
^
744745
void f() {}
745746
''';
746-
newFile(mainFilePath, content);
747+
newFile(mainFilePath, withoutMarkers(content));
747748
await initialize();
748749

749-
final codeActions = await getCodeActions(mainFileUri.toString());
750+
final codeActions = await getCodeActions(mainFileUri.toString(),
751+
position: positionFromMarker(content));
750752
final codeAction =
751753
findCommand(codeActions, Commands.performRefactor, extractWidgetTitle);
752754
expect(codeAction, isNull);

pkg/analysis_server/test/lsp/code_actions_source_test.dart

+61-25
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,44 @@ void main() {
1919
});
2020
}
2121

22+
abstract class AbstractSourceCodeActionsTest extends AbstractCodeActionsTest {
23+
/// Wrapper around [checkCodeActionAvailable] for Source actions where
24+
/// position/range is irrelevant (so uses [startOfDocPos]).
25+
Future<void> checkSourceCodeActionAvailable(
26+
Uri uri,
27+
String command,
28+
String title, {
29+
bool asCodeActionLiteral = false,
30+
bool asCommand = false,
31+
}) async {
32+
return checkCodeActionAvailable(
33+
uri,
34+
command,
35+
title,
36+
position: startOfDocPos,
37+
asCodeActionLiteral: asCodeActionLiteral,
38+
asCommand: asCommand,
39+
);
40+
}
41+
42+
/// Wrapper around [getCodeActions] for Source actions where position/range is
43+
/// irrelevant (so uses [startOfDocPos]).
44+
Future<List<Either2<Command, CodeAction>>> getSourceCodeActions(
45+
String fileUri, {
46+
List<CodeActionKind>? kinds,
47+
CodeActionTriggerKind? triggerKind,
48+
}) {
49+
return getCodeActions(
50+
fileUri,
51+
position: startOfDocPos,
52+
kinds: kinds,
53+
triggerKind: triggerKind,
54+
);
55+
}
56+
}
57+
2258
@reflectiveTest
23-
class FixAllSourceCodeActionsTest extends AbstractCodeActionsTest {
59+
class FixAllSourceCodeActionsTest extends AbstractSourceCodeActionsTest {
2460
Future<void> test_appliesCorrectEdits() async {
2561
const analysisOptionsContent = '''
2662
linter:
@@ -45,15 +81,16 @@ linter:
4581
workspaceCapabilities:
4682
withApplyEditSupport(emptyWorkspaceClientCapabilities));
4783

48-
final codeActions = await getCodeActions(mainFileUri.toString());
84+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
4985
final codeAction = findCommand(codeActions, Commands.fixAll)!;
5086

5187
await verifyCodeActionEdits(codeAction, content, expectedContent);
5288
}
5389
}
5490

5591
@reflectiveTest
56-
class OrganizeImportsSourceCodeActionsTest extends AbstractCodeActionsTest {
92+
class OrganizeImportsSourceCodeActionsTest
93+
extends AbstractSourceCodeActionsTest {
5794
Future<void> test_appliesCorrectEdits_withDocumentChangesSupport() async {
5895
const content = '''
5996
import 'dart:math';
@@ -75,7 +112,7 @@ int minified(int x, int y) => min(x, y);
75112
workspaceCapabilities: withApplyEditSupport(
76113
withDocumentChangesSupport(emptyWorkspaceClientCapabilities)));
77114

78-
final codeActions = await getCodeActions(mainFileUri.toString());
115+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
79116
final codeAction = findCommand(codeActions, Commands.organizeImports)!;
80117

81118
await verifyCodeActionEdits(codeAction, content, expectedContent,
@@ -103,7 +140,7 @@ int minified(int x, int y) => min(x, y);
103140
workspaceCapabilities:
104141
withApplyEditSupport(emptyWorkspaceClientCapabilities));
105142

106-
final codeActions = await getCodeActions(mainFileUri.toString());
143+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
107144
final codeAction = findCommand(codeActions, Commands.organizeImports)!;
108145

109146
await verifyCodeActionEdits(codeAction, content, expectedContent);
@@ -117,7 +154,7 @@ int minified(int x, int y) => min(x, y);
117154
workspaceCapabilities:
118155
withApplyEditSupport(emptyWorkspaceClientCapabilities));
119156

120-
await checkCodeActionAvailable(
157+
await checkSourceCodeActionAvailable(
121158
mainFileUri,
122159
Commands.organizeImports,
123160
'Organize Imports',
@@ -131,7 +168,7 @@ int minified(int x, int y) => min(x, y);
131168
workspaceCapabilities:
132169
withApplyEditSupport(emptyWorkspaceClientCapabilities));
133170

134-
await checkCodeActionAvailable(
171+
await checkSourceCodeActionAvailable(
135172
mainFileUri,
136173
Commands.organizeImports,
137174
'Organize Imports',
@@ -146,7 +183,7 @@ int minified(int x, int y) => min(x, y);
146183
workspaceCapabilities:
147184
withApplyEditSupport(emptyWorkspaceClientCapabilities));
148185

149-
final codeActions = await getCodeActions(
186+
final codeActions = await getSourceCodeActions(
150187
mainFileUri.toString(),
151188
triggerKind: CodeActionTriggerKind.Automatic,
152189
);
@@ -169,7 +206,7 @@ int minified(int x, int y) => min(x, y);
169206
workspaceCapabilities:
170207
withApplyEditSupport(emptyWorkspaceClientCapabilities));
171208

172-
final codeActions = await getCodeActions(mainFileUri.toString());
209+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
173210
final codeAction = findCommand(codeActions, Commands.organizeImports)!;
174211

175212
final command = codeAction.map(
@@ -189,7 +226,7 @@ int minified(int x, int y) => min(x, y);
189226
workspaceCapabilities:
190227
withApplyEditSupport(emptyWorkspaceClientCapabilities));
191228

192-
ofKind(CodeActionKind kind) => getCodeActions(
229+
ofKind(CodeActionKind kind) => getSourceCodeActions(
193230
mainFileUri.toString(),
194231
kinds: [kind],
195232
);
@@ -215,7 +252,7 @@ int minified(int x, int y) => min(x, y);
215252
workspaceCapabilities:
216253
withApplyEditSupport(emptyWorkspaceClientCapabilities));
217254

218-
final codeActions = await getCodeActions(mainFileUri.toString());
255+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
219256
final codeAction = findCommand(codeActions, Commands.organizeImports)!;
220257

221258
final command = codeAction.map(
@@ -238,7 +275,7 @@ int minified(int x, int y) => min(x, y);
238275
workspaceCapabilities:
239276
withApplyEditSupport(emptyWorkspaceClientCapabilities));
240277

241-
final codeActions = await getCodeActions(mainFileUri.toString());
278+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
242279
final codeAction = findCommand(codeActions, Commands.organizeImports);
243280
expect(codeAction, isNull);
244281
}
@@ -247,14 +284,14 @@ int minified(int x, int y) => min(x, y);
247284
newFile(mainFilePath, '');
248285
await initialize();
249286

250-
final codeActions = await getCodeActions(mainFileUri.toString());
287+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
251288
final codeAction = findCommand(codeActions, Commands.organizeImports);
252289
expect(codeAction, isNull);
253290
}
254291
}
255292

256293
@reflectiveTest
257-
class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
294+
class SortMembersSourceCodeActionsTest extends AbstractSourceCodeActionsTest {
258295
Future<void> test_appliesCorrectEdits_withDocumentChangesSupport() async {
259296
const content = '''
260297
String b;
@@ -269,7 +306,7 @@ class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
269306
workspaceCapabilities: withApplyEditSupport(
270307
withDocumentChangesSupport(emptyWorkspaceClientCapabilities)));
271308

272-
final codeActions = await getCodeActions(mainFileUri.toString());
309+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
273310
final codeAction = findCommand(codeActions, Commands.sortMembers)!;
274311

275312
await verifyCodeActionEdits(codeAction, content, expectedContent,
@@ -290,7 +327,7 @@ class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
290327
workspaceCapabilities:
291328
withApplyEditSupport(emptyWorkspaceClientCapabilities));
292329

293-
final codeActions = await getCodeActions(mainFileUri.toString());
330+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
294331
final codeAction = findCommand(codeActions, Commands.sortMembers)!;
295332

296333
await verifyCodeActionEdits(codeAction, content, expectedContent);
@@ -304,7 +341,7 @@ class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
304341
workspaceCapabilities:
305342
withApplyEditSupport(emptyWorkspaceClientCapabilities));
306343

307-
await checkCodeActionAvailable(
344+
await checkSourceCodeActionAvailable(
308345
mainFileUri,
309346
Commands.sortMembers,
310347
'Sort Members',
@@ -318,7 +355,7 @@ class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
318355
workspaceCapabilities:
319356
withApplyEditSupport(emptyWorkspaceClientCapabilities));
320357

321-
await checkCodeActionAvailable(
358+
await checkSourceCodeActionAvailable(
322359
mainFileUri,
323360
Commands.sortMembers,
324361
'Sort Members',
@@ -336,7 +373,7 @@ class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
336373
workspaceCapabilities:
337374
withApplyEditSupport(emptyWorkspaceClientCapabilities));
338375

339-
final codeActions = await getCodeActions(mainFileUri.toString());
376+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
340377
final codeAction = findCommand(codeActions, Commands.sortMembers)!;
341378

342379
final command = codeAction.map(
@@ -369,7 +406,7 @@ class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
369406
workspaceCapabilities:
370407
withApplyEditSupport(emptyWorkspaceClientCapabilities));
371408

372-
final codeActions = await getCodeActions(
409+
final codeActions = await getSourceCodeActions(
373410
mainFileUri.toString(),
374411
triggerKind: CodeActionTriggerKind.Automatic,
375412
);
@@ -392,7 +429,7 @@ class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
392429
workspaceCapabilities:
393430
withApplyEditSupport(emptyWorkspaceClientCapabilities));
394431

395-
final codeActions = await getCodeActions(mainFileUri.toString());
432+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
396433
final codeAction = findCommand(codeActions, Commands.sortMembers)!;
397434

398435
final command = codeAction.map(
@@ -414,8 +451,7 @@ class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
414451
workspaceCapabilities:
415452
withApplyEditSupport(emptyWorkspaceClientCapabilities));
416453

417-
final codeActions =
418-
await getCodeActions(pubspecFileUri.toString(), range: startOfDocRange);
454+
final codeActions = await getSourceCodeActions(pubspecFileUri.toString());
419455
expect(codeActions, isEmpty);
420456
}
421457

@@ -427,7 +463,7 @@ class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
427463
workspaceCapabilities:
428464
withApplyEditSupport(emptyWorkspaceClientCapabilities));
429465

430-
final codeActions = await getCodeActions(mainFileUri.toString());
466+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
431467
final codeAction = findCommand(codeActions, Commands.sortMembers);
432468
expect(codeAction, isNull);
433469
}
@@ -436,7 +472,7 @@ class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
436472
newFile(mainFilePath, '');
437473
await initialize();
438474

439-
final codeActions = await getCodeActions(mainFileUri.toString());
475+
final codeActions = await getSourceCodeActions(mainFileUri.toString());
440476
final codeAction = findCommand(codeActions, Commands.sortMembers);
441477
expect(codeAction, isNull);
442478
}

pkg/analysis_server/test/lsp/server_abstract.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -1016,7 +1016,7 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
10161016
}) {
10171017
range ??= position != null
10181018
? Range(start: position, end: position)
1019-
: startOfDocRange;
1019+
: throw 'Supply either a Range or Position for CodeActions requests';
10201020
final request = makeRequest(
10211021
Method.textDocument_codeAction,
10221022
CodeActionParams(

pkg/dds/CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# 2.2.4
2+
- Fix an issue where DAP adapters could try to remove the same breakpoint multiple times.
3+
14
# 2.2.3
25
- Internal DAP changes.
36

pkg/dds/lib/src/dap/isolate_manager.dart

+6-1
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,12 @@ class IsolateManager {
624624
_vmBreakpointsByIsolateIdAndUri.putIfAbsent(isolateId, () => {});
625625
final existingBreakpointsForIsolateAndUri =
626626
existingBreakpointsForIsolate.putIfAbsent(uri, () => []);
627-
await Future.forEach<vm.Breakpoint>(existingBreakpointsForIsolateAndUri,
627+
// Before doing async work, take a copy of the breakpoints to remove
628+
// and remove them from the list, so any subsequent calls here don't
629+
// try to remove the same ones.
630+
final breakpointsToRemove = existingBreakpointsForIsolateAndUri.toList();
631+
existingBreakpointsForIsolateAndUri.clear();
632+
await Future.forEach<vm.Breakpoint>(breakpointsToRemove,
628633
(bp) => service.removeBreakpoint(isolateId, bp.id!));
629634

630635
// Set new breakpoints.

pkg/dds/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: dds
2-
version: 2.2.3
2+
version: 2.2.4
33
description: >-
44
A library used to spawn the Dart Developer Service, used to communicate with
55
a Dart VM Service instance.

pkg/dds/test/dap/integration/debug_breakpoints_test.dart

+44
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,50 @@ main() {
2727
await client.hitBreakpoint(testFile, breakpointLine);
2828
});
2929

30+
test('does not stop at a removed breakpoint', () async {
31+
final testFile = dap.createTestFile('''
32+
void main(List<String> args) async {
33+
print('Hello!'); $breakpointMarker
34+
print('Hello!'); $breakpointMarker
35+
}
36+
''');
37+
38+
final client = dap.client;
39+
final breakpoint1Line = lineWith(testFile, breakpointMarker);
40+
final breakpoint2Line = breakpoint1Line + 1;
41+
42+
// Hit the first breakpoint.
43+
final stop = await client.hitBreakpoint(testFile, breakpoint1Line,
44+
additionalBreakpoints: [breakpoint2Line]);
45+
46+
// Remove all breakpoints.
47+
await client.setBreakpoints(testFile, []);
48+
49+
// Resume and expect termination (should not hit the second breakpoint).
50+
await Future.wait([
51+
client.event('terminated'),
52+
client.continue_(stop.threadId!),
53+
], eagerError: true);
54+
});
55+
56+
test('does not fail updating breakpoints after a removal', () async {
57+
// https://github.com/flutter/flutter/issues/106369 was caused by us not
58+
// tracking removals correctly, meaning we could try to remove a removed
59+
// breakpoint a second time.
60+
final client = dap.client;
61+
final testFile = dap.createTestFile(simpleBreakpointProgram);
62+
final breakpointLine = lineWith(testFile, breakpointMarker);
63+
64+
await client.hitBreakpoint(testFile, breakpointLine);
65+
66+
// Remove the breakpoint.
67+
await client.setBreakpoints(testFile, []);
68+
69+
// Send another breakpoint update to ensure it doesn't try to re-remove
70+
// the previously removed breakpoint.
71+
await client.setBreakpoints(testFile, []);
72+
});
73+
3074
test('stops at a line breakpoint in the SDK set via local sources',
3175
() async {
3276
final client = dap.client;

0 commit comments

Comments
 (0)