From c465508c816765f745cd6e6e771446d676e10fa4 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Wed, 3 Nov 2010 13:49:12 +0000 Subject: [PATCH] Bug 329196 - Incorrect highlighting of strings with #defines inside --- .../cdt/ui/tests/text/CPartitionerTest.java | 18 ++++++++ .../ui/text/FastCPartitionScanner.java | 42 +++++++++++++++---- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CPartitionerTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CPartitionerTest.java index eb54ee197b1..33a4fc9e475 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CPartitionerTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CPartitionerTest.java @@ -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() { try { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/FastCPartitionScanner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/FastCPartitionScanner.java index 2465203afb0..57b18b608ba 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/FastCPartitionScanner.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/FastCPartitionScanner.java @@ -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_BACKSLASH= 7; // postfix for STRING, CHARACTER private static final int RAW_STRING_R= 8; // prefix for RAW_STRING + private static final int IDENT= 9; /** The scanner. */ private final BufferedDocumentScanner fScanner= new BufferedDocumentScanner(1000); // faster implementation @@ -210,13 +211,6 @@ public final class FastCPartitionScanner implements IPartitionTokenScanner, ICPa continue; } - case 'R': - if (fState == CCODE) { - fLast = RAW_STRING_R; - } - fTokenLength++; - continue; - default: if (fLast == CARRIAGE_RETURN) { switch (fState) { @@ -343,6 +337,24 @@ public final class FastCPartitionScanner implements IPartitionTokenScanner, ICPa 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 '"': int newState = STRING; if (fLast == RAW_STRING_R) { @@ -376,7 +388,14 @@ public final class FastCPartitionScanner implements IPartitionTokenScanner, ICPa consume(); break; 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; @@ -509,8 +528,12 @@ public final class FastCPartitionScanner implements IPartitionTokenScanner, ICPa case OPEN_DELIMITER: if (ch == '(') { rawStringState = RawStringState.CONTENT; - } else { + } else if (ch == '"') { + return postFix(RAW_STRING); + } else if (ch != ' ' && ch != '\\' && ch != ')' && fRawStringDelimiter.length() < 12) { fRawStringDelimiter.append((char) ch); + } else { + fState = STRING; } consume(); break; @@ -565,6 +588,7 @@ public final class FastCPartitionScanner implements IPartitionTokenScanner, ICPa return -1; case NONE: + case IDENT: return 0; case CARRIAGE_RETURN: