Skip to content

Commit 1395cbb

Browse files
srawlinsCommit Queue
authored and
Commit Queue
committed
DAS: eight-digit hex: respect x case and expected triplet separators
Cq-Include-Trybots: luci.dart.try:flutter-analyze-try,analyzer-win-release-try,pkg-win-release-try Change-Id: Icc444c1d6ac80e6b5c6c98c1e8d64506fbec5820 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/375723 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]>
1 parent 3e402e2 commit 1395cbb

File tree

2 files changed

+65
-9
lines changed

2 files changed

+65
-9
lines changed

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

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import 'package:analyzer_plugin/utilities/range_factory.dart';
1313
class ReplaceWithEightDigitHex extends ResolvedCorrectionProducer {
1414
static final _underscoresPattern = RegExp('_+');
1515

16+
static final _tripletWithUnderscoresPattern =
17+
RegExp(r'^[0-9a-fA-F]{2}_[0-9a-fA-F]{2}_[0-9a-fA-F]{2}$');
18+
1619
/// The replacement text, used as an argument to the fix message.
1720
String _replacement = '';
1821

@@ -39,14 +42,25 @@ class ReplaceWithEightDigitHex extends ResolvedCorrectionProducer {
3942
// The original string should be a substring of the replacement
4043
// (ignoring the '0x'). If there are existing separators, preserve them.
4144
var originalDigits = literal.lexeme.substring('0x'.length);
42-
var originalWithoutSeparators =
43-
originalDigits.replaceAll(_underscoresPattern, '');
44-
var numberOfDigitsToAdd =
45-
replacementDigits.length - originalWithoutSeparators.length;
46-
var newLeadingDigits = '0' * numberOfDigitsToAdd;
47-
replacementDigits = '$newLeadingDigits$originalDigits';
45+
if (_tripletWithUnderscoresPattern.hasMatch(originalDigits)) {
46+
replacementDigits = '00_$originalDigits';
47+
} else {
48+
var originalWithoutSeparators =
49+
originalDigits.replaceAll(_underscoresPattern, '');
50+
var numberOfDigitsToAdd =
51+
replacementDigits.length - originalWithoutSeparators.length;
52+
var newLeadingDigits = '0' * numberOfDigitsToAdd;
53+
replacementDigits = '$newLeadingDigits$originalDigits';
54+
}
4855
}
49-
_replacement = '0x$replacementDigits';
56+
var hexIndicator = switch (literal.type) {
57+
TokenType.HEXADECIMAL ||
58+
TokenType.HEXADECIMAL_WITH_SEPARATORS =>
59+
literal.lexeme.substring(0, '0x'.length),
60+
// Defalt to lower-case.
61+
_ => '0x',
62+
};
63+
_replacement = '$hexIndicator$replacementDigits';
5064
await builder.addDartFileEdit(file, (builder) {
5165
builder.addSimpleReplacement(range.node(node), _replacement);
5266
});

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

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,49 @@ class Color {
9595
''');
9696
}
9797

98-
Future<void> test_sixDigitHex_withSeparators() async {
98+
Future<void> test_sixDigitHex_capitalX() async {
99+
await resolveTestCode('''
100+
library dart.ui;
101+
102+
var c = Color(0X000001);
103+
104+
class Color {
105+
Color(int value);
106+
}
107+
''');
108+
await assertHasFix('''
109+
library dart.ui;
110+
111+
var c = Color(0X00000001);
112+
113+
class Color {
114+
Color(int value);
115+
}
116+
''');
117+
}
118+
119+
Future<void> test_sixDigitHex_withIrregularSeparators() async {
120+
await resolveTestCode('''
121+
library dart.ui;
122+
123+
var c = Color(0x000__001);
124+
125+
class Color {
126+
Color(int value);
127+
}
128+
''');
129+
await assertHasFix('''
130+
library dart.ui;
131+
132+
var c = Color(0x00000__001);
133+
134+
class Color {
135+
Color(int value);
136+
}
137+
''');
138+
}
139+
140+
Future<void> test_sixDigitHex_withTripletSeparators() async {
99141
await resolveTestCode('''
100142
library dart.ui;
101143
@@ -108,7 +150,7 @@ class Color {
108150
await assertHasFix('''
109151
library dart.ui;
110152
111-
var c = Color(0x0000_00_01);
153+
var c = Color(0x00_00_00_01);
112154
113155
class Color {
114156
Color(int value);

0 commit comments

Comments
 (0)