mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-02 22:05:44 +02:00
getSyntax() does not work correctly with newlines, bug 280175
This commit is contained in:
parent
ada1ba048c
commit
14a4c2a8d3
2 changed files with 54 additions and 15 deletions
|
@ -5780,6 +5780,40 @@ public class AST2Tests extends AST2BaseTest {
|
||||||
assertEquals(image.length(), token.getLength());
|
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 a= 1+2-3*4+10/2; // -4
|
||||||
// int b= a+4;
|
// int b= a+4;
|
||||||
// int* c= &b;
|
// int* c= &b;
|
||||||
|
|
|
@ -319,23 +319,28 @@ public abstract class ASTNode implements IASTNode {
|
||||||
char[] txt= lr.getUnpreprocessedSignature(total);
|
char[] txt= lr.getUnpreprocessedSignature(total);
|
||||||
Lexer lex= new Lexer(txt, (LexerOptions) tu.getAdapter(LexerOptions.class), ILexerLog.NULL, null);
|
Lexer lex= new Lexer(txt, (LexerOptions) tu.getAdapter(LexerOptions.class), ILexerLog.NULL, null);
|
||||||
try {
|
try {
|
||||||
Token result= lex.nextToken();
|
Token result= null;
|
||||||
if (result.getType() == IToken.tEND_OF_INPUT)
|
Token last= null;
|
||||||
return null;
|
|
||||||
|
|
||||||
Token last= result;
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
int offset= last.getOffset() + adjustment;
|
|
||||||
int endOffset= last.getEndOffset() + adjustment;
|
|
||||||
last.setOffset(offset, endOffset);
|
|
||||||
|
|
||||||
Token t= lex.nextToken();
|
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;
|
break;
|
||||||
last.setNext(t);
|
default:
|
||||||
last= t;
|
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) {
|
} catch (OffsetLimitReachedException e) {
|
||||||
// does not happen without using content assist limit
|
// does not happen without using content assist limit
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue