1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-01 13:25:45 +02:00

getSyntax() does not work correctly with newlines, bug 280175

This commit is contained in:
Markus Schorn 2009-06-22 13:44:44 +00:00
parent ada1ba048c
commit 14a4c2a8d3
2 changed files with 54 additions and 15 deletions

View file

@ -5780,6 +5780,40 @@ public class AST2Tests extends AST2BaseTest {
assertEquals(image.length(), token.getLength());
}
// void test() {
// int x,y;
// x
// <<
// y;
// }
public void testSyntaxWithNL_Bug280175() throws Exception {
String code= getAboveComment();
int offsetX= code.indexOf('x', code.indexOf('x')+1);
int offsetShift= code.indexOf('<');
int offsetY= code.indexOf('y', offsetX);
IASTTranslationUnit tu= parseAndCheckBindings(code);
IASTFunctionDefinition f= getDeclaration(tu, 0);
IASTExpressionStatement i = getStatement(f, 1);
final IASTBinaryExpression expr = (IASTBinaryExpression) i.getExpression();
IASTExpression x= expr.getOperand1();
IASTExpression y= expr.getOperand2();
IToken syntax= x.getTrailingSyntax();
checkToken(syntax, "<<", offsetShift-offsetX-1); syntax= syntax.getNext();
assertNull(syntax);
syntax= y.getLeadingSyntax();
checkToken(syntax, "<<", offsetShift - offsetY); syntax= syntax.getNext();
assertNull(syntax);
syntax= expr.getSyntax();
checkToken(syntax, "x", 0); syntax= syntax.getNext();
checkToken(syntax, "<<", offsetShift-offsetX); syntax= syntax.getNext();
checkToken(syntax, "y", offsetY-offsetX); syntax= syntax.getNext();
assertNull(syntax);
}
// int a= 1+2-3*4+10/2; // -4
// int b= a+4;
// int* c= &b;
@ -6357,5 +6391,5 @@ public class AST2Tests extends AST2BaseTest {
}
}
}
}

View file

@ -319,23 +319,28 @@ public abstract class ASTNode implements IASTNode {
char[] txt= lr.getUnpreprocessedSignature(total);
Lexer lex= new Lexer(txt, (LexerOptions) tu.getAdapter(LexerOptions.class), ILexerLog.NULL, null);
try {
Token result= lex.nextToken();
if (result.getType() == IToken.tEND_OF_INPUT)
return null;
Token last= result;
for(;;) {
int offset= last.getOffset() + adjustment;
int endOffset= last.getEndOffset() + adjustment;
last.setOffset(offset, endOffset);
Token result= null;
Token last= null;
for(;;) {
Token t= lex.nextToken();
if (t.getType() == IToken.tEND_OF_INPUT)
switch (t.getType()) {
case IToken.tEND_OF_INPUT:
return result;
case Lexer.tNEWLINE:
break;
last.setNext(t);
last= t;
default:
int offset= t.getOffset() + adjustment;
int endOffset= t.getEndOffset() + adjustment;
t.setOffset(offset, endOffset);
if (last == null) {
result= last= t;
} else {
last.setNext(t);
last= t;
}
break;
}
}
return result;
} catch (OffsetLimitReachedException e) {
// does not happen without using content assist limit
}