Skip to content

Commit fbf62c1

Browse files
srawlinsCommit Queue
authored and
Commit Queue
committed
DAS: Add assist to remove digit separators from number literal
Fixes #56467 Cq-Include-Trybots: luci.dart.try:flutter-analyze-try,analyzer-win-release-try,pkg-win-release-try Change-Id: I711d0d483db0e61f907c884e33fb7511168dde2d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/380686 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 6bace69 commit fbf62c1

File tree

5 files changed

+127
-1
lines changed

5 files changed

+127
-1
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ abstract final class DartAssistKind {
4848
'Add a debug reference to this property',
4949
);
5050
static const ADD_DIGIT_SEPARATORS = AssistKind(
51-
'dart.assist.add.addDigitSeparators',
51+
'dart.assist.add.digitSeparators',
5252
DartAssistKindPriority.DEFAULT,
5353
'Add digit separators',
5454
);
@@ -362,6 +362,11 @@ abstract final class DartAssistKind {
362362
DartAssistKindPriority.DEFAULT,
363363
'Join variable declaration',
364364
);
365+
static const REMOVE_DIGIT_SEPARATORS = AssistKind(
366+
'dart.assist.remove.digitSeparators',
367+
DartAssistKindPriority.DEFAULT,
368+
'Remove digit separators',
369+
);
365370
static const REMOVE_TYPE_ANNOTATION = AssistKind(
366371
// TODO(pq): unify w/ fix
367372
'dart.assist.remove.typeAnnotation',

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import 'package:analysis_server/src/services/correction/dart/invert_if_statement
6262
import 'package:analysis_server/src/services/correction/dart/join_if_with_inner.dart';
6363
import 'package:analysis_server/src/services/correction/dart/join_if_with_outer.dart';
6464
import 'package:analysis_server/src/services/correction/dart/join_variable_declaration.dart';
65+
import 'package:analysis_server/src/services/correction/dart/remove_digit_separators.dart';
6566
import 'package:analysis_server/src/services/correction/dart/remove_type_annotation.dart';
6667
import 'package:analysis_server/src/services/correction/dart/replace_conditional_with_if_else.dart';
6768
import 'package:analysis_server/src/services/correction/dart/replace_if_else_with_conditional.dart';
@@ -147,6 +148,7 @@ class AssistProcessor {
147148
JoinIfWithInner.new,
148149
JoinIfWithOuter.new,
149150
JoinVariableDeclaration.new,
151+
RemoveDigitSeparators.new,
150152
RemoveTypeAnnotation.other,
151153
ReplaceConditionalWithIfElse.new,
152154
ReplaceIfElseWithConditional.new,
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:_fe_analyzer_shared/src/parser/util.dart';
6+
import 'package:analysis_server/src/services/correction/assist.dart';
7+
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
8+
import 'package:analyzer/dart/ast/ast.dart';
9+
import 'package:analyzer_plugin/utilities/assist/assist.dart';
10+
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
11+
import 'package:analyzer_plugin/utilities/range_factory.dart';
12+
13+
class RemoveDigitSeparators extends ResolvedCorrectionProducer {
14+
RemoveDigitSeparators({required super.context});
15+
16+
@override
17+
CorrectionApplicability get applicability =>
18+
CorrectionApplicability.automatically;
19+
20+
@override
21+
AssistKind get assistKind => DartAssistKind.REMOVE_DIGIT_SEPARATORS;
22+
23+
@override
24+
Future<void> compute(ChangeBuilder builder) async {
25+
if (node case IntegerLiteral(:var literal) || DoubleLiteral(:var literal)) {
26+
var source = literal.lexeme;
27+
28+
var withoutSeparators = stripSeparators(source);
29+
// Don't offer the correction if the result is unchanged.
30+
if (withoutSeparators == source) return;
31+
await builder.addDartFileEdit(file, (builder) {
32+
builder.addSimpleReplacement(range.node(node), withoutSeparators);
33+
});
34+
}
35+
}
36+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:analysis_server/src/services/correction/assist.dart';
6+
import 'package:analyzer_plugin/utilities/assist/assist.dart';
7+
import 'package:test_reflective_loader/test_reflective_loader.dart';
8+
9+
import 'assist_processor.dart';
10+
11+
void main() {
12+
defineReflectiveSuite(() {
13+
defineReflectiveTests(RemoveDigitSeparatorsTest);
14+
});
15+
}
16+
17+
@reflectiveTest
18+
class RemoveDigitSeparatorsTest extends AssistProcessorTest {
19+
@override
20+
AssistKind get kind => DartAssistKind.REMOVE_DIGIT_SEPARATORS;
21+
22+
Future<void> test_double_noSeparators() async {
23+
await resolveTestCode('var i = /*caret*/123456.78;');
24+
await assertNoAssist();
25+
}
26+
27+
Future<void> test_double_separators() async {
28+
await resolveTestCode('var i = /*caret*/111_222.333_444;');
29+
await assertHasAssist('var i = 111222.333444;');
30+
}
31+
32+
Future<void> test_doubleScientific_fractional_separators() async {
33+
await resolveTestCode('var i = /*caret*/1_2.3_4e5_6;');
34+
await assertHasAssist('var i = 12.34e56;');
35+
}
36+
37+
Future<void> test_doubleScientific_negative_separators() async {
38+
await resolveTestCode('var i = /*caret*/12_34e-56_78;');
39+
await assertHasAssist('var i = 1234e-5678;');
40+
}
41+
42+
Future<void> test_doubleScientific_noSeparators() async {
43+
await resolveTestCode('var i = /*caret*/123e456;');
44+
await assertNoAssist();
45+
}
46+
47+
Future<void> test_doubleScientific_separators() async {
48+
await resolveTestCode('var i = /*caret*/12_34e56_78;');
49+
await assertHasAssist('var i = 1234e5678;');
50+
}
51+
52+
Future<void> test_intDecimal_negative_separators() async {
53+
await resolveTestCode('var i = -/*caret*/12___34__56_78;');
54+
await assertHasAssist('var i = -12345678;');
55+
}
56+
57+
Future<void> test_intDecimal_noSeparators() async {
58+
await resolveTestCode('var i = /*caret*/123456;');
59+
await assertNoAssist();
60+
}
61+
62+
Future<void> test_intDecimal_separators() async {
63+
await resolveTestCode('var i = /*caret*/123__456_78;');
64+
await assertHasAssist('var i = 12345678;');
65+
}
66+
67+
Future<void> test_intHex_noSeparators() async {
68+
await resolveTestCode('var i = /*caret*/0x123456;');
69+
await assertNoAssist();
70+
}
71+
72+
Future<void> test_intHex_separators() async {
73+
await resolveTestCode('var i = /*caret*/0x1___234__5_6;');
74+
await assertHasAssist('var i = 0x123456;');
75+
}
76+
77+
Future<void> test_intHex_upperCase_separators() async {
78+
await resolveTestCode('var i = /*caret*/0X12_34_56;');
79+
await assertHasAssist('var i = 0X123456;');
80+
}
81+
}

pkg/analysis_server/test/src/services/correction/assist/test_all.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ import 'invert_if_statement_test.dart' as invert_if_statement;
7777
import 'join_if_with_inner_test.dart' as join_if_with_inner;
7878
import 'join_if_with_outer_test.dart' as join_if_with_outer;
7979
import 'join_variable_declaration_test.dart' as join_variable_declaration;
80+
import 'remove_digit_separators_test.dart' as remove_digit_separators;
8081
import 'remove_type_annotation_test.dart' as remove_type_annotation;
8182
import 'replace_conditional_with_if_else_test.dart'
8283
as replace_conditional_with_if_else;
@@ -162,6 +163,7 @@ void main() {
162163
join_if_with_inner.main();
163164
join_if_with_outer.main();
164165
join_variable_declaration.main();
166+
remove_digit_separators.main();
165167
remove_type_annotation.main();
166168
replace_conditional_with_if_else.main();
167169
replace_if_else_with_conditional.main();

0 commit comments

Comments
 (0)