mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-25 18:05:33 +02:00
Patch from Anton Leherbauer for bug 39521, highlighting of number constants.
This commit is contained in:
parent
d4ee99391a
commit
0ae9539298
3 changed files with 193 additions and 36 deletions
|
@ -13,6 +13,7 @@ package org.eclipse.cdt.ui.tests;
|
|||
import junit.framework.Test;
|
||||
import junit.framework.TestSuite;
|
||||
|
||||
import org.eclipse.cdt.ui.tests.text.NumberRuleTest;
|
||||
import org.eclipse.cdt.ui.tests.text.contentassist.CompletionFailedTest_MemberReference_Arrow_Prefix2;
|
||||
import org.eclipse.cdt.ui.tests.text.contentassist.CompletionTest_ArgumentType_NoPrefix;
|
||||
import org.eclipse.cdt.ui.tests.text.contentassist.CompletionTest_ArgumentType_NoPrefix2;
|
||||
|
@ -79,6 +80,7 @@ public class AutomatedSuite extends TestSuite {
|
|||
|
||||
// Success Tests
|
||||
//addTest(PartitionTokenScannerTest.suite());
|
||||
addTest(NumberRuleTest.suite());
|
||||
// completion tests
|
||||
addTest(CompletionTest_FieldType_Prefix.suite());
|
||||
addTest(CompletionTest_FieldType_NoPrefix.suite());
|
||||
|
|
|
@ -0,0 +1,140 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* Anton Leherbauer - initial API and implementation
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.ui.tests.text;
|
||||
|
||||
import junit.framework.Test;
|
||||
import junit.framework.TestCase;
|
||||
import junit.framework.TestSuite;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.text.NumberRule;
|
||||
import org.eclipse.jface.text.Document;
|
||||
import org.eclipse.jface.text.rules.IRule;
|
||||
import org.eclipse.jface.text.rules.IToken;
|
||||
import org.eclipse.jface.text.rules.RuleBasedScanner;
|
||||
import org.eclipse.jface.text.rules.Token;
|
||||
|
||||
/**
|
||||
* Testing the NumberRule matching integers and floats.
|
||||
*/
|
||||
public class NumberRuleTest extends TestCase {
|
||||
|
||||
private static final Object NUMBER = "number";
|
||||
private RuleBasedScanner fScanner;
|
||||
private Document fDocument;
|
||||
|
||||
/**
|
||||
* @param name
|
||||
*/
|
||||
public NumberRuleTest(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
public static Test suite() {
|
||||
return new TestSuite(NumberRuleTest.class);
|
||||
}
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
fScanner = new RuleBasedScanner() {};
|
||||
fScanner.setRules(new IRule[] {
|
||||
new NumberRule(new Token(NUMBER))
|
||||
});
|
||||
fDocument = new Document();
|
||||
}
|
||||
|
||||
protected void tearDown() throws Exception {
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
public void testIntegers() {
|
||||
// decimal numbers
|
||||
assertNumber("0");
|
||||
assertNumber("-1");
|
||||
assertNumber("+1");
|
||||
assertNumber("123456789");
|
||||
assertNumber("-123456789");
|
||||
assertNumber("+123456789");
|
||||
|
||||
// hex numbers
|
||||
assertNumber("0xaffe");
|
||||
assertNumber("-0xaffe");
|
||||
assertNumber("+0xaffe");
|
||||
assertNumber("0Xaffe");
|
||||
assertNumber("+0XaFFe");
|
||||
assertNumber("0xabcdefABCDEF");
|
||||
assertNumber("0x0123456789");
|
||||
}
|
||||
|
||||
public void testFloats() {
|
||||
assertNumber("0.");
|
||||
assertNumber(".0");
|
||||
assertNumber("-.0");
|
||||
assertNumber("+.0");
|
||||
assertNumber("-0.");
|
||||
assertNumber("+0.");
|
||||
assertNumber("0.123456789");
|
||||
assertNumber("-0.123456789");
|
||||
assertNumber("+12345.6789");
|
||||
assertNumber("1e5");
|
||||
assertNumber("1E5");
|
||||
assertNumber("1.e5");
|
||||
assertNumber("-1e5");
|
||||
assertNumber("-.1e5");
|
||||
assertNumber("1e-5");
|
||||
assertNumber("1e+55");
|
||||
}
|
||||
|
||||
public void testNonNumbers() {
|
||||
// test pathological cases
|
||||
assertNoNumber("-");
|
||||
assertNoNumber("+");
|
||||
assertNoNumber(".");
|
||||
assertNoNumber("-.");
|
||||
assertNoNumber("+.");
|
||||
assertNoNumber("x");
|
||||
assertNoNumber(".x");
|
||||
assertNoNumber("-x");
|
||||
assertNoNumber("e");
|
||||
assertNoNumber(".e");
|
||||
assertNoNumber("-e");
|
||||
assertNoNumber("+e");
|
||||
|
||||
// false positives:
|
||||
// assertNoNumber("0x");
|
||||
// assertNoNumber("1e");
|
||||
// assertNoNumber("1e+");
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that given string is recognized as a number.
|
||||
* @param string
|
||||
*/
|
||||
private void assertNumber(String string) {
|
||||
fDocument.set(string);
|
||||
fScanner.setRange(fDocument, 0, fDocument.getLength());
|
||||
IToken token = fScanner.nextToken();
|
||||
assertSame(NUMBER, token.getData());
|
||||
assertEquals(string.length(), fScanner.getTokenLength());
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that given string is not recognized as a number.
|
||||
* @param string
|
||||
*/
|
||||
private void assertNoNumber(String string) {
|
||||
fDocument.set(string);
|
||||
fScanner.setRange(fDocument, 0, fDocument.getLength());
|
||||
IToken token = fScanner.nextToken();
|
||||
assertNotSame(NUMBER, token.getData());
|
||||
}
|
||||
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2005 QNX Software Systems and others.
|
||||
* Copyright (c) 2005, 2006 QNX Software Systems and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* QNX Software Systems - initial API and implementation
|
||||
* Wind River Systems, Inc. - bug fixes
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.ui.text;
|
||||
|
||||
|
@ -16,7 +17,7 @@ import org.eclipse.jface.text.rules.IToken;
|
|||
import org.eclipse.jface.text.rules.Token;
|
||||
|
||||
/**
|
||||
* Recognizes numbers;
|
||||
* Recognizes integer and float numbers.
|
||||
*
|
||||
* @author P.Tomaszewski
|
||||
*/
|
||||
|
@ -42,46 +43,60 @@ public class NumberRule implements IRule
|
|||
public IToken evaluate(ICharacterScanner scanner)
|
||||
{
|
||||
int startCh = scanner.read();
|
||||
int ch;
|
||||
|
||||
int ch;
|
||||
int unreadCount = 1;
|
||||
|
||||
if (isNumberStart(startCh))
|
||||
{
|
||||
ch = scanner.read();
|
||||
boolean hexNumber = ch == 'x';
|
||||
boolean decNumber = false;
|
||||
if (!hexNumber)
|
||||
{
|
||||
decNumber = Character.isDigit((char)ch);
|
||||
ch = startCh;
|
||||
if (startCh == '-' || startCh == '+') {
|
||||
ch = scanner.read();
|
||||
++unreadCount;
|
||||
}
|
||||
if (!hexNumber && !decNumber)
|
||||
{
|
||||
scanner.unread();
|
||||
// If minus only it should be qualified as operator.
|
||||
if (startCh == '-')
|
||||
{
|
||||
if (ch == '0') {
|
||||
int xCh = scanner.read();
|
||||
++unreadCount;
|
||||
if (xCh == 'x' || xCh == 'X') {
|
||||
// hexnumber starting with [+-]?0[xX]
|
||||
do {
|
||||
ch = scanner.read();
|
||||
} while (isHexNumberPart((char)ch));
|
||||
scanner.unread();
|
||||
return Token.UNDEFINED;
|
||||
}
|
||||
return token;
|
||||
return token;
|
||||
}
|
||||
scanner.unread();
|
||||
// assert ch == '0';
|
||||
} else if (!Character.isDigit((char)ch)) {
|
||||
ch = scanner.read();
|
||||
++unreadCount;
|
||||
}
|
||||
if (hexNumber)
|
||||
{
|
||||
do
|
||||
{
|
||||
ch = scanner.read();
|
||||
} while (isHexNumberPart((char)ch));
|
||||
if (Character.isDigit((char)ch)) {
|
||||
// need at least one digit
|
||||
do {
|
||||
ch = scanner.read();
|
||||
} while (Character.isDigit((char)ch));
|
||||
if (ch == '.' && startCh != '.') {
|
||||
// fraction
|
||||
do {
|
||||
ch = scanner.read();
|
||||
} while (Character.isDigit((char)ch));
|
||||
}
|
||||
if (ch == 'e' || ch == 'E') {
|
||||
// exponent
|
||||
ch = scanner.read();
|
||||
if (ch == '-' || ch == '+' || Character.isDigit((char)ch)) {
|
||||
do {
|
||||
ch = scanner.read();
|
||||
} while (Character.isDigit((char)ch));
|
||||
}
|
||||
}
|
||||
scanner.unread();
|
||||
return token;
|
||||
}
|
||||
else if (decNumber)
|
||||
{
|
||||
do
|
||||
{
|
||||
ch = scanner.read();
|
||||
} while (Character.isDigit((char)ch));
|
||||
}
|
||||
scanner.unread();
|
||||
return token;
|
||||
}
|
||||
scanner.unread();
|
||||
do {
|
||||
scanner.unread();
|
||||
} while (--unreadCount > 0);
|
||||
return Token.UNDEFINED;
|
||||
}
|
||||
|
||||
|
@ -92,7 +107,7 @@ public class NumberRule implements IRule
|
|||
*/
|
||||
private boolean isNumberStart(int ch)
|
||||
{
|
||||
return ch == '-' || Character.isDigit((char)ch);
|
||||
return ch == '-' || ch == '+' || ch == '.' || Character.isDigit((char)ch);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue