mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-09 01:05:38 +02:00
Fix for 183930, by Emanuel Graf, comments from inactive code.
This commit is contained in:
parent
0a81ce7c3d
commit
904a9560e3
2 changed files with 82 additions and 4 deletions
|
@ -199,13 +199,13 @@ public class CommentTests extends AST2BaseTest {
|
|||
// #else
|
||||
// // comment2
|
||||
// #endif
|
||||
public void _testCommentsInInactiveCode_bug183930() throws Exception {
|
||||
public void testCommentsInInactiveCode_bug183930() throws Exception {
|
||||
StringBuffer code= getContents(1)[0];
|
||||
IASTTranslationUnit tu = parse(code.toString(), ParserLanguage.CPP, false, true, true);
|
||||
IASTComment[] comments = tu.getComments();
|
||||
|
||||
assertEquals(2, comments.length);
|
||||
assertEquals("// comment1", new String(comments[0].getComment()));
|
||||
assertEquals("// comment2", new String(comments[0].getComment()));
|
||||
assertEquals("// comment2", new String(comments[1].getComment()));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,7 @@ import org.eclipse.cdt.core.parser.ParseError;
|
|||
import org.eclipse.cdt.core.parser.ParserLanguage;
|
||||
import org.eclipse.cdt.core.parser.ParserMode;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
import org.eclipse.cdt.core.parser.util.CharArrayIntMap;
|
||||
import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
|
||||
import org.eclipse.cdt.core.parser.util.CharArraySet;
|
||||
|
@ -198,6 +199,8 @@ abstract class BaseScanner implements IScanner {
|
|||
|
||||
protected boolean scanComments;
|
||||
|
||||
protected IToken[] commentsFromInactiveCode = new IToken[0];
|
||||
|
||||
protected final CharArrayIntMap additionalKeywords;
|
||||
|
||||
protected final CharArrayIntMap additionalPPKeywords;
|
||||
|
@ -662,6 +665,13 @@ abstract class BaseScanner implements IScanner {
|
|||
throw new ParseError(
|
||||
ParseError.ParseErrorKind.TIMEOUT_OR_CANCELLED);
|
||||
|
||||
//return the stored comments
|
||||
if(commentsFromInactiveCode.length > 0 && commentsFromInactiveCode[0] != null){
|
||||
IToken commentToken = commentsFromInactiveCode[0];
|
||||
ArrayUtil.remove(commentsFromInactiveCode, commentToken);
|
||||
return commentToken;
|
||||
}
|
||||
|
||||
// Find the first thing we would care about
|
||||
skipOverWhiteSpaceFetchToken();
|
||||
|
||||
|
@ -2544,7 +2554,7 @@ abstract class BaseScanner implements IScanner {
|
|||
|
||||
while (bufferPos[bufferStackPos] < limit) {
|
||||
|
||||
skipOverWhiteSpace();
|
||||
skipOverWhiteSpaceFetchToken();
|
||||
|
||||
if (++bufferPos[bufferStackPos] >= limit)
|
||||
return;
|
||||
|
@ -2675,7 +2685,11 @@ abstract class BaseScanner implements IScanner {
|
|||
}
|
||||
}
|
||||
} else if (c != '\n')
|
||||
skipToNewLine();
|
||||
if(scanComments){
|
||||
skipToNewLineAndCollectComments();
|
||||
}else{
|
||||
skipToNewLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3170,6 +3184,70 @@ abstract class BaseScanner implements IScanner {
|
|||
bufferPos[bufferStackPos]= pos-1;
|
||||
}
|
||||
|
||||
protected void skipToNewLineAndCollectComments() {
|
||||
char[] buffer = bufferStack[bufferStackPos];
|
||||
int limit = bufferLimit[bufferStackPos];
|
||||
int pos = bufferPos[bufferStackPos];
|
||||
|
||||
boolean escaped = false;
|
||||
boolean insideString= false;
|
||||
boolean insideSingleQuote= false;
|
||||
for (;pos < limit;++pos) {
|
||||
char ch= buffer[pos];
|
||||
switch (ch) {
|
||||
case '/':
|
||||
if (insideString || insideSingleQuote) {
|
||||
break;
|
||||
}
|
||||
if (pos + 1 < limit) {
|
||||
char c= buffer[pos + 1];
|
||||
if (c == '*'||c == '/') {
|
||||
bufferPos[bufferStackPos] = pos;
|
||||
IToken comment = scanComment();
|
||||
commentsFromInactiveCode = (IToken[]) ArrayUtil.append(comment.getClass(), commentsFromInactiveCode, comment);
|
||||
pos = bufferPos[bufferStackPos];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case '\\':
|
||||
escaped = !escaped;
|
||||
continue;
|
||||
case '"':
|
||||
if (!insideSingleQuote) {
|
||||
insideString= insideString ? escaped : true;
|
||||
}
|
||||
break;
|
||||
case '\'':
|
||||
if (!insideString) {
|
||||
insideSingleQuote= insideSingleQuote ? escaped : true;
|
||||
}
|
||||
break;
|
||||
case '\n':
|
||||
if (escaped) {
|
||||
break;
|
||||
}
|
||||
bufferPos[bufferStackPos]= pos;
|
||||
return;
|
||||
case '\r':
|
||||
if (pos+1 < limit && buffer[pos+1] == '\n') {
|
||||
if (escaped) {
|
||||
pos++;
|
||||
break;
|
||||
}
|
||||
bufferPos[bufferStackPos]= pos;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
escaped = false;
|
||||
}
|
||||
bufferPos[bufferStackPos]= pos;
|
||||
|
||||
}
|
||||
|
||||
|
||||
protected char[] handleFunctionStyleMacro(FunctionStyleMacro macro,
|
||||
boolean pushContext) {
|
||||
char[] buffer = bufferStack[bufferStackPos];
|
||||
|
|
Loading…
Add table
Reference in a new issue