Skip to content

Commit fb3ebe0

Browse files
author
Dart CI
committed
Version 2.14.0-301.0.dev
Merge commit '0cd008082be130eeca8c868bb0a75ee5d07b25e6' into 'dev'
2 parents 40695d9 + 0cd0080 commit fb3ebe0

File tree

3 files changed

+130
-12
lines changed

3 files changed

+130
-12
lines changed

pkg/analysis_server/lib/src/services/correction/dart/add_const.dart

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@
55
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
66
import 'package:analysis_server/src/services/correction/fix.dart';
77
import 'package:analyzer/dart/ast/ast.dart';
8+
import 'package:analyzer/dart/ast/token.dart';
9+
import 'package:analyzer/dart/ast/visitor.dart';
10+
import 'package:analyzer/source/source_range.dart';
811
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
912
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
13+
import 'package:analyzer_plugin/utilities/range_factory.dart';
1014

1115
class AddConst extends CorrectionProducer {
1216
@override
@@ -38,16 +42,17 @@ class AddConst extends CorrectionProducer {
3842
return;
3943
}
4044

41-
Future<void> insertAtOffset(AstNode targetNode) async {
45+
Future<void> insertAtOffset(Expression targetNode) async {
46+
var finder = _ConstRangeFinder();
47+
targetNode.accept(finder);
4248
await builder.addDartFileEdit(file, (builder) {
4349
builder.addSimpleInsertion(targetNode.offset, 'const ');
50+
for (var range in finder.ranges) {
51+
builder.addDeletion(range);
52+
}
4453
});
4554
}
4655

47-
// todo(pq):consider removing nested `const` declarations
48-
// made unnecessary by outer ones in List, Set literal and
49-
// instance creations.
50-
5156
if (targetNode is ListLiteral) {
5257
await insertAtOffset(targetNode);
5358
return;
@@ -82,3 +87,36 @@ class AddConst extends CorrectionProducer {
8287
/// Return an instance of this class. Used as a tear-off in `FixProcessor`.
8388
static AddConst toLiteral() => AddConst(true, true);
8489
}
90+
91+
class _ConstRangeFinder extends RecursiveAstVisitor<void> {
92+
final List<SourceRange> ranges = [];
93+
94+
@override
95+
void visitFunctionExpression(FunctionExpression node) {
96+
// Stop visiting when we get to a closure.
97+
}
98+
99+
@override
100+
void visitInstanceCreationExpression(InstanceCreationExpression node) {
101+
_removeKeyword(node.keyword);
102+
super.visitInstanceCreationExpression(node);
103+
}
104+
105+
@override
106+
void visitListLiteral(ListLiteral node) {
107+
_removeKeyword(node.constKeyword);
108+
super.visitListLiteral(node);
109+
}
110+
111+
@override
112+
void visitSetOrMapLiteral(SetOrMapLiteral node) {
113+
_removeKeyword(node.constKeyword);
114+
super.visitSetOrMapLiteral(node);
115+
}
116+
117+
void _removeKeyword(Token? keyword) {
118+
if (keyword != null && keyword.type == Keyword.CONST) {
119+
ranges.add(range.startStart(keyword, keyword.next!));
120+
}
121+
}
122+
}

pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart

Lines changed: 86 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,27 @@ void f() {
175175
var c = const C();
176176
print(c);
177177
}
178+
''');
179+
}
180+
181+
Future<void> test_withConstList() async {
182+
await resolveTestCode('''
183+
class C {
184+
const C(List<int> l);
185+
}
186+
void f() {
187+
var c = C(const <int>[]);
188+
print(c);
189+
}
190+
''');
191+
await assertHasFix('''
192+
class C {
193+
const C(List<int> l);
194+
}
195+
void f() {
196+
var c = const C(<int>[]);
197+
print(c);
198+
}
178199
''');
179200
}
180201
}
@@ -272,6 +293,27 @@ void f() {
272293
''');
273294
}
274295

296+
Future<void> test_list_list() async {
297+
await resolveTestCode('''
298+
import 'package:meta/meta.dart';
299+
300+
@immutable
301+
class C {
302+
const C(List<C> children);
303+
}
304+
C c = C([C(const [])]);
305+
''');
306+
await assertHasFix('''
307+
import 'package:meta/meta.dart';
308+
309+
@immutable
310+
class C {
311+
const C(List<C> children);
312+
}
313+
C c = C(const [C([])]);
314+
''');
315+
}
316+
275317
Future<void> test_map() async {
276318
await resolveTestCode('''
277319
import 'package:meta/meta.dart';
@@ -282,9 +324,7 @@ class C {
282324
const C({required this.children});
283325
}
284326
void f() {
285-
var c = C(children: {
286-
1 : const {}
287-
});
327+
var c = C(children: {});
288328
print(c);
289329
}
290330
''');
@@ -297,14 +337,33 @@ class C {
297337
const C({required this.children});
298338
}
299339
void f() {
300-
var c = C(children: const {
301-
1 : const {}
302-
});
340+
var c = C(children: const {});
303341
print(c);
304342
}
305343
''');
306344
}
307345

346+
Future<void> test_map_map() async {
347+
await resolveTestCode('''
348+
import 'package:meta/meta.dart';
349+
350+
@immutable
351+
class C {
352+
const C(Map<String, C> children);
353+
}
354+
C c = C({'c': C(const {})});
355+
''');
356+
await assertHasFix('''
357+
import 'package:meta/meta.dart';
358+
359+
@immutable
360+
class C {
361+
const C(Map<String, C> children);
362+
}
363+
C c = C(const {'c': C({})});
364+
''');
365+
}
366+
308367
Future<void> test_set() async {
309368
await resolveTestCode('''
310369
import 'package:meta/meta.dart';
@@ -331,6 +390,27 @@ void f() {
331390
var c = C(children: const {});
332391
print(c);
333392
}
393+
''');
394+
}
395+
396+
Future<void> test_set_set() async {
397+
await resolveTestCode('''
398+
import 'package:meta/meta.dart';
399+
400+
@immutable
401+
class C {
402+
const C(Set<C> children);
403+
}
404+
C c = C({C(const {})});
405+
''');
406+
await assertHasFix('''
407+
import 'package:meta/meta.dart';
408+
409+
@immutable
410+
class C {
411+
const C(Set<C> children);
412+
}
413+
C c = C(const {C({})});
334414
''');
335415
}
336416
}

tools/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@ CHANNEL dev
2727
MAJOR 2
2828
MINOR 14
2929
PATCH 0
30-
PRERELEASE 300
30+
PRERELEASE 301
3131
PRERELEASE_PATCH 0

0 commit comments

Comments
 (0)