mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 17:56:01 +02:00
Bug 329196 - Incorrect highlighting of strings with #defines inside
This commit is contained in:
parent
63365064b7
commit
c465508c81
2 changed files with 51 additions and 9 deletions
|
@ -1189,6 +1189,24 @@ public class CPartitionerTest extends TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testString2() {
|
||||||
|
try {
|
||||||
|
|
||||||
|
fDocument.replace(0, fDocument.getLength(), "\"string\"RRRRRRRR\"string\"nostring");
|
||||||
|
ITypedRegion[] result= fDocument.computePartitioning(0, fDocument.getLength());
|
||||||
|
TypedRegion[] expectation= {
|
||||||
|
new TypedRegion(0, 8, ICPartitions.C_STRING),
|
||||||
|
new TypedRegion(8, 8, IDocument.DEFAULT_CONTENT_TYPE),
|
||||||
|
new TypedRegion(16, 8, ICPartitions.C_STRING),
|
||||||
|
new TypedRegion(24, 8, IDocument.DEFAULT_CONTENT_TYPE)
|
||||||
|
};
|
||||||
|
checkPartitioning(expectation, result);
|
||||||
|
|
||||||
|
} catch (BadLocationException x) {
|
||||||
|
assertTrue(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void testRawString1() {
|
public void testRawString1() {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ public final class FastCPartitionScanner implements IPartitionTokenScanner, ICPa
|
||||||
private static final int BACKSLASH_CR= 6; // postfix for STRING, CHARACTER and SINGLE_LINE_COMMENT
|
private static final int BACKSLASH_CR= 6; // postfix for STRING, CHARACTER and SINGLE_LINE_COMMENT
|
||||||
private static final int BACKSLASH_BACKSLASH= 7; // postfix for STRING, CHARACTER
|
private static final int BACKSLASH_BACKSLASH= 7; // postfix for STRING, CHARACTER
|
||||||
private static final int RAW_STRING_R= 8; // prefix for RAW_STRING
|
private static final int RAW_STRING_R= 8; // prefix for RAW_STRING
|
||||||
|
private static final int IDENT= 9;
|
||||||
|
|
||||||
/** The scanner. */
|
/** The scanner. */
|
||||||
private final BufferedDocumentScanner fScanner= new BufferedDocumentScanner(1000); // faster implementation
|
private final BufferedDocumentScanner fScanner= new BufferedDocumentScanner(1000); // faster implementation
|
||||||
|
@ -210,13 +211,6 @@ public final class FastCPartitionScanner implements IPartitionTokenScanner, ICPa
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'R':
|
|
||||||
if (fState == CCODE) {
|
|
||||||
fLast = RAW_STRING_R;
|
|
||||||
}
|
|
||||||
fTokenLength++;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (fLast == CARRIAGE_RETURN) {
|
if (fLast == CARRIAGE_RETURN) {
|
||||||
switch (fState) {
|
switch (fState) {
|
||||||
|
@ -343,6 +337,24 @@ public final class FastCPartitionScanner implements IPartitionTokenScanner, ICPa
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'u':
|
||||||
|
case 'U':
|
||||||
|
case 'L':
|
||||||
|
if (fLast != IDENT) {
|
||||||
|
fLast = NONE;
|
||||||
|
}
|
||||||
|
fTokenLength++;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case 'R':
|
||||||
|
if (fLast == RAW_STRING_R) {
|
||||||
|
fLast = IDENT;
|
||||||
|
} else if (fLast != IDENT) {
|
||||||
|
fLast = RAW_STRING_R;
|
||||||
|
}
|
||||||
|
fTokenLength++;
|
||||||
|
continue;
|
||||||
|
|
||||||
case '"':
|
case '"':
|
||||||
int newState = STRING;
|
int newState = STRING;
|
||||||
if (fLast == RAW_STRING_R) {
|
if (fLast == RAW_STRING_R) {
|
||||||
|
@ -376,7 +388,14 @@ public final class FastCPartitionScanner implements IPartitionTokenScanner, ICPa
|
||||||
consume();
|
consume();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
consume();
|
if ('a' <= ch && ch <= 'z' || 'A' <= ch && 'Z' <= ch || ch =='_') {
|
||||||
|
fLast = IDENT;
|
||||||
|
fTokenOffset++;
|
||||||
|
} else if ('0' <= ch && ch <= '9' && fLast == IDENT) {
|
||||||
|
fTokenOffset++;
|
||||||
|
} else {
|
||||||
|
consume();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -509,8 +528,12 @@ public final class FastCPartitionScanner implements IPartitionTokenScanner, ICPa
|
||||||
case OPEN_DELIMITER:
|
case OPEN_DELIMITER:
|
||||||
if (ch == '(') {
|
if (ch == '(') {
|
||||||
rawStringState = RawStringState.CONTENT;
|
rawStringState = RawStringState.CONTENT;
|
||||||
} else {
|
} else if (ch == '"') {
|
||||||
|
return postFix(RAW_STRING);
|
||||||
|
} else if (ch != ' ' && ch != '\\' && ch != ')' && fRawStringDelimiter.length() < 12) {
|
||||||
fRawStringDelimiter.append((char) ch);
|
fRawStringDelimiter.append((char) ch);
|
||||||
|
} else {
|
||||||
|
fState = STRING;
|
||||||
}
|
}
|
||||||
consume();
|
consume();
|
||||||
break;
|
break;
|
||||||
|
@ -565,6 +588,7 @@ public final class FastCPartitionScanner implements IPartitionTokenScanner, ICPa
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
case NONE:
|
case NONE:
|
||||||
|
case IDENT:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case CARRIAGE_RETURN:
|
case CARRIAGE_RETURN:
|
||||||
|
|
Loading…
Add table
Reference in a new issue