1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

Bug 558923: Syntax coloring for binary integer literals from C++14

Change-Id: Ib3b260b6638e689884a28037d1a814b737846867
Signed-off-by: Andrey Mozzhuhin <amozzhuhin@yandex.ru>
This commit is contained in:
Andrey Mozzhuhin 2020-01-08 16:18:27 +03:00 committed by Jonah Graham
parent 4ec47dbc35
commit 69a1589726
3 changed files with 32 additions and 2 deletions

View file

@ -1195,9 +1195,10 @@ public class CPartitionerTest extends TestCase {
public void testNumberSeparators() { public void testNumberSeparators() {
try { try {
fDocument.replace(0, fDocument.getLength(), "1'123'456\n0x1000'1000\n0111'1000\n0xAABB'CCDD"); fDocument.replace(0, fDocument.getLength(),
"0b1'100'100'100\n1'123'456\n0x1000'1000\n0111'1000\n0xAABB'CCDD");
ITypedRegion[] result = fDocument.computePartitioning(0, fDocument.getLength()); ITypedRegion[] result = fDocument.computePartitioning(0, fDocument.getLength());
TypedRegion[] expectation = { new TypedRegion(0, 43, IDocument.DEFAULT_CONTENT_TYPE) }; TypedRegion[] expectation = { new TypedRegion(0, fDocument.getLength(), IDocument.DEFAULT_CONTENT_TYPE) };
checkPartitioning(expectation, result); checkPartitioning(expectation, result);
} catch (BadLocationException x) { } catch (BadLocationException x) {
assertTrue(false); assertTrue(false);

View file

@ -68,6 +68,15 @@ public class NumberRuleTest extends TestCase {
assertNumber("-123456789"); assertNumber("-123456789");
assertNumber("+123456789"); assertNumber("+123456789");
// binary numbers (C++14)
assertNumber("0b0");
assertNumber("-0b0");
assertNumber("+0b1");
assertNumber("-0B0");
assertNumber("+0B1");
assertNumber("+0b01010101");
assertNumber("+0b10101010");
// hex numbers // hex numbers
assertNumber("0xaffe"); assertNumber("0xaffe");
assertNumber("-0xaffe"); assertNumber("-0xaffe");
@ -104,6 +113,9 @@ public class NumberRuleTest extends TestCase {
assertNoNumber("."); assertNoNumber(".");
assertNoNumber("-."); assertNoNumber("-.");
assertNoNumber("+."); assertNoNumber("+.");
assertNoNumber("b");
assertNoNumber(".b");
assertNoNumber("-b");
assertNoNumber("x"); assertNoNumber("x");
assertNoNumber(".x"); assertNoNumber(".x");
assertNoNumber("-x"); assertNoNumber("-x");
@ -126,6 +138,7 @@ public class NumberRuleTest extends TestCase {
} }
public void testSeparators() { public void testSeparators() {
assertNumber("0b1'100'100'100");
assertNumber("1'123'456"); assertNumber("1'123'456");
assertNumber("0x1000'1000"); assertNumber("0x1000'1000");
assertNumber("0111'1000"); assertNumber("0111'1000");

View file

@ -61,6 +61,13 @@ public class NumberRule implements IRule {
} while (isHexDigitOrSeparator(ch)); } while (isHexDigitOrSeparator(ch));
scanner.unread(); scanner.unread();
return token; return token;
} else if (xCh == 'b' || xCh == 'B') {
// binary number starting with [+-]?0[bB]
do {
ch = scanner.read();
} while (isBinDigitOrSeparator(ch));
scanner.unread();
return token;
} }
scanner.unread(); scanner.unread();
// assert ch == '0'; // assert ch == '0';
@ -107,6 +114,15 @@ public class NumberRule implements IRule {
return ch == '-' || ch == '+' || ch == '.' || Character.isDigit((char) ch); return ch == '-' || ch == '+' || ch == '.' || Character.isDigit((char) ch);
} }
/**
* Checks if part of binary number;
* @param ch Char to check.
* @return <b>true</b>
*/
private boolean isBinDigitOrSeparator(int ch) {
return ch == '0' || ch == '1' || ch == '\'';
}
/** /**
* Checks if part of decimal number; * Checks if part of decimal number;
* @param ch Char to check. * @param ch Char to check.