diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index 1c3bf1be1dc..637cc029c5f 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -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 { } } } - + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java index 0117daefe1f..e3e32bb477e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java @@ -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 }