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:
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());
|
||||
}
|
||||
|
||||
// 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 {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue