diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/LanguageExtensionsTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/LanguageExtensionsTest.java
index 4d0f757c191..5e01ac1dfcc 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/LanguageExtensionsTest.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/LanguageExtensionsTest.java
@@ -12,6 +12,7 @@ package org.eclipse.cdt.core.parser.tests.ast2;
import junit.framework.TestSuite;
+import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
@@ -47,6 +48,7 @@ public class LanguageExtensionsTest extends AST2BaseTest {
protected static final int SIZEOF_EXTENSION = 0x1;
protected static final int FUNCTION_STYLE_ASM = 0x2;
+ protected static final int SLASH_PERCENT_COMMENT = 0x4;
public static TestSuite suite() {
return suite(LanguageExtensionsTest.class);
@@ -87,7 +89,13 @@ public class LanguageExtensionsTest extends AST2BaseTest {
}
protected IASTTranslationUnit parseCPPWithExtension(String code, final int extensions) throws Exception {
- return parse(code, GPPScannerExtensionConfiguration.getInstance(),
+ return parse(code,
+ new GPPScannerExtensionConfiguration() {
+ @Override
+ public boolean supportSlashPercentComments() {
+ return (extensions & SLASH_PERCENT_COMMENT) != 0;
+ }
+ },
new GPPParserExtensionConfiguration() {
@Override
public boolean supportExtendedSizeofOperator() {
@@ -102,7 +110,13 @@ public class LanguageExtensionsTest extends AST2BaseTest {
}
protected IASTTranslationUnit parseCWithExtension(String code, final int extensions) throws Exception {
- return parse(code, GCCScannerExtensionConfiguration.getInstance(),
+ return parse(code,
+ new GCCScannerExtensionConfiguration() {
+ @Override
+ public boolean supportSlashPercentComments() {
+ return (extensions & SLASH_PERCENT_COMMENT) != 0;
+ }
+ },
new GCCParserExtensionConfiguration() {
@Override
public boolean supportExtendedSizeofOperator() {
@@ -217,4 +231,13 @@ public class LanguageExtensionsTest extends AST2BaseTest {
fdef= getDeclaration(tu, 2);
fdef= getDeclaration(tu, 3);
}
+
+ // /% a comment %/
+ // int a;
+ public void testSlashPercentComment() throws Exception {
+ IASTTranslationUnit tu= parseCWithExtension(getAboveComment(), SLASH_PERCENT_COMMENT);
+
+ IASTDeclaration d= getDeclaration(tu, 0);
+ assertEquals("int a;", d.getRawSignature());
+ }
}
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/LexerTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/LexerTests.java
index 182af970e23..cec6d72b88b 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/LexerTests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/LexerTests.java
@@ -23,6 +23,16 @@ import org.eclipse.cdt.internal.core.parser.scanner.Lexer.LexerOptions;
public class LexerTests extends BaseTestCase {
+ private static final LexerOptions DEFAULT_OPTIONS = new LexerOptions();
+ private static final LexerOptions NO_DOLLAR = new LexerOptions();
+ private static final LexerOptions NO_MINMAX = new LexerOptions();
+ private static final LexerOptions SLASH_PERCENT = new LexerOptions();
+ static {
+ NO_DOLLAR.fSupportDollarInIdentifiers= false;
+ NO_MINMAX.fSupportMinAndMax= false;
+ SLASH_PERCENT.fSupportSlashPercentComments= true;
+ }
+
static String TRIGRAPH_REPLACES_CHARS= "#^[]|{}~\\";
static String TRIGRAPH_CHARS= "='()!<>-/";
@@ -43,19 +53,13 @@ public class LexerTests extends BaseTestCase {
}
private void init(String input) throws Exception {
- fLog.clear();
- fLexer= new Lexer(input.toCharArray(), new LexerOptions(), fLog, null);
- fLog.setInput(input);
- fLexer.nextToken();
- fLastEndOffset= 0;
+ init(input, DEFAULT_OPTIONS);
}
- private void init(String input, boolean dollar, boolean minmax) throws Exception {
+ private void init(String input, LexerOptions options) throws Exception {
fLog.clear();
- final LexerOptions lexerOptions = new LexerOptions();
- lexerOptions.fSupportDollarInIdentifiers= dollar;
- lexerOptions.fSupportMinAndMax= minmax;
- fLexer= new Lexer(input.toCharArray(), lexerOptions, fLog, null);
+ fLexer= new Lexer(input.toCharArray(), options, fLog, null);
+ fLog.setInput(input);
fLexer.nextToken();
fLastEndOffset= 0;
}
@@ -278,6 +282,19 @@ public class LexerTests extends BaseTestCase {
eof();
}
+ public void testSlashPercentComments() throws Exception {
+ init("// /%\na", SLASH_PERCENT);
+ comment("// /%");
+ nl();
+ id("a");
+ eof();
+
+ init("/% // /% \n xxx%/a", SLASH_PERCENT);
+ comment("/% // /% \n xxx%/");
+ id("a");
+ eof();
+ }
+
public void testMinimalComment() throws Exception {
init("a/**/b/**/");
id("a");
@@ -331,7 +348,7 @@ public class LexerTests extends BaseTestCase {
eof();
}
- init(ident, false, true);
+ init(ident, NO_DOLLAR);
final int idxDollar = ident.indexOf('$');
id(ident.substring(0, idxDollar));
token(Lexer.tOTHER_CHARACTER, "$");
@@ -470,7 +487,7 @@ public class LexerTests extends BaseTestCase {
eof();
assertEquals(ops, buf.toString()); // check token image
- init(input, true, false);
+ init(input, NO_MINMAX);
for (int i = 0; i < tokens.length; i++) {
switch (tokens[i]) {
case IGCCToken.tMIN:
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/AbstractScannerExtensionConfiguration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/AbstractScannerExtensionConfiguration.java
index 2056e23c943..489d3e22412 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/AbstractScannerExtensionConfiguration.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/AbstractScannerExtensionConfiguration.java
@@ -62,6 +62,14 @@ public abstract class AbstractScannerExtensionConfiguration implements IScannerE
public boolean supportAtSignInIdentifiers() {
return false;
}
+
+ /**
+ * {@inheritDoc}
+ * @since 5.1
+ */
+ public boolean supportSlashPercentComments() {
+ return false;
+ }
/*
* @see org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration#supportAdditionalNumericLiteralSuffixes()
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/IScannerExtensionConfiguration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/IScannerExtensionConfiguration.java
index c1fa5024e59..2f70e1ad471 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/IScannerExtensionConfiguration.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/IScannerExtensionConfiguration.java
@@ -48,6 +48,14 @@ public interface IScannerExtensionConfiguration {
*/
public boolean supportAtSignInIdentifiers();
+ /**
+ * Support for block-comments comments using /% %/.
+ * @return true
, if /% should be interpreted as the start of a block-comment which is
+ * ended by %/
+ * @since 5.1
+ */
+ public boolean supportSlashPercentComments();
+
/**
* Support for (deprecated) GNU minimum and maximum operators (<?
* and >?
).
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java
index 00fbff1eed0..43774647f4e 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java
@@ -150,6 +150,7 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
fLexOptions.fSupportDollarInIdentifiers= configuration.support$InIdentifiers();
fLexOptions.fSupportAtSignInIdentifiers= configuration.supportAtSignInIdentifiers();
fLexOptions.fSupportMinAndMax = configuration.supportMinAndMaxOperators();
+ fLexOptions.fSupportSlashPercentComments= configuration.supportSlashPercentComments();
fKeywords= new CharArrayIntMap(40, -1);
fPPKeywords= new CharArrayIntMap(40, -1);
configureKeywords(language, configuration);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java
index 16356d36c4f..fd38d974bc7 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java
@@ -50,6 +50,7 @@ final public class Lexer {
public boolean fSupportAtSignInIdentifiers= true;
public boolean fSupportMinAndMax= true;
public boolean fCreateImageLocations= true;
+ public boolean fSupportSlashPercentComments= false;
@Override
public Object clone() {
@@ -267,7 +268,12 @@ final public class Lexer {
lineComment(start);
continue;
case '*':
- blockComment(start);
+ blockComment(start, '*');
+ continue;
+ case '%':
+ if (fOptions.fSupportSlashPercentComments) {
+ blockComment(start, '%');
+ }
continue;
}
continue;
@@ -485,8 +491,14 @@ final public class Lexer {
lineComment(start);
continue;
case '*':
- blockComment(start);
+ blockComment(start, '*');
continue;
+ case '%':
+ if (fOptions.fSupportSlashPercentComments) {
+ blockComment(start, '%');
+ continue;
+ }
+ break;
}
return newToken(IToken.tDIV, start);
@@ -681,11 +693,11 @@ final public class Lexer {
return newToken((expectQuotes ? tQUOTE_HEADER_NAME : tSYSTEM_HEADER_NAME), start, length);
}
- private void blockComment(final int start) {
+ private void blockComment(final int start, final char trigger) {
// we can ignore line-splices, trigraphs and windows newlines when searching for the '*'
int pos= fEndOffset;
while(pos < fLimit) {
- if (fInput[pos++] == '*') {
+ if (fInput[pos++] == trigger) {
fEndOffset= pos;
if (nextCharPhase3() == '/') {
nextCharPhase3();