diff options
author | Andrew Niefer | 2004-09-20 17:48:32 +0000 |
---|---|---|
committer | Andrew Niefer | 2004-09-20 17:48:32 +0000 |
commit | dbefca11a9a75bb523de52131128939fadae7a84 (patch) | |
tree | 5f75f8c810c0423a90415a9a84962ed8e7afe3cb | |
parent | a00354f2d98fd22becd100eb04a4d38f2da0cb55 (diff) | |
download | org.eclipse.cdt-dbefca11a9a75bb523de52131128939fadae7a84.tar.gz org.eclipse.cdt-dbefca11a9a75bb523de52131128939fadae7a84.tar.xz org.eclipse.cdt-dbefca11a9a75bb523de52131128939fadae7a84.zip |
bug 73492 - [Scanner] Improper offset for particular IProblem
3 files changed, 38 insertions, 3 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java index 58238c0932d..509b2eb5b75 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java @@ -1828,4 +1828,27 @@ public class Scanner2Test extends BaseScanner2Test validateToken( IToken.t_true ); validateToken( IToken.t_false); } + + public void testBug73492() throws Exception{ + String code = "#define PTR void *\n" + //$NON-NLS-1$ + "PTR;\n"; //$NON-NLS-1$ + + int offset = code.indexOf("PTR;"); //$NON-NLS-1$ + initializeScanner( code ); + + IToken t = scanner.nextToken(); + assertEquals( t.getType(), IToken.t_void ); + assertEquals( t.getOffset(), offset ); + assertEquals( t.getLineNumber(), 2 ); + + t = scanner.nextToken(); + assertEquals( t.getType(), IToken.tSTAR ); + assertEquals( t.getOffset(), offset ); + assertEquals( t.getLineNumber(), 2 ); + + t = scanner.nextToken(); + assertEquals( t.getType(), IToken.tSEMI ); + assertEquals( t.getOffset(), offset + 3 ); + assertEquals( t.getLineNumber(), 2 ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java index 782968b6bea..d62486ef454 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java @@ -842,6 +842,15 @@ public class Scanner2 implements IScanner, IScannerData { * @return */ private IToken newToken( int signal ) { + if( bufferData[bufferStackPos] instanceof IMacro ) + { + int mostRelevant; + for( mostRelevant = bufferStackPos; mostRelevant >= 0; --mostRelevant ) + if( bufferData[mostRelevant] instanceof InclusionData || bufferData[mostRelevant] instanceof CodeReader ) + break; + int endOffset = bufferPos[mostRelevant] - ((IMacro)bufferData[bufferStackPos]).getName().length + SimpleToken.getCharImage( signal ).length + 1; + return new SimpleToken( signal, endOffset, getCurrentFilename(), getLineNumber( bufferPos[mostRelevant] + 1)); + } return new SimpleToken(signal, bufferPos[bufferStackPos] + 1 , getCurrentFilename(), getLineNumber( bufferPos[bufferStackPos] + 1) ); } @@ -853,7 +862,7 @@ public class Scanner2 implements IScanner, IScannerData { for( mostRelevant = bufferStackPos; mostRelevant >= 0; --mostRelevant ) if( bufferData[mostRelevant] instanceof InclusionData || bufferData[mostRelevant] instanceof CodeReader ) break; - return new ImagedExpansionToken( signal, buffer, bufferPos[mostRelevant], ((IMacro)bufferData[bufferStackPos]).getName().length, getCurrentFilename(), getLineNumber( bufferPos[bufferStackPos] + 1)); + return new ImagedExpansionToken( signal, buffer, bufferPos[mostRelevant], ((IMacro)bufferData[bufferStackPos]).getName().length, getCurrentFilename(), getLineNumber( bufferPos[mostRelevant] + 1)); } IToken i = new ImagedToken(signal, buffer, bufferPos[bufferStackPos] + 1 , getCurrentFilename(), getLineNumber( bufferPos[bufferStackPos] + 1)); if( buffer != null && buffer.length == 0 ) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/SimpleToken.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/SimpleToken.java index b50e8605d88..397f46e74b9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/SimpleToken.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/SimpleToken.java @@ -315,11 +315,14 @@ public class SimpleToken extends AbstractToken implements IToken { // do nothing } + public char[] getCharImage() { + return getCharImage( getType() ); + } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.IToken#getCharImage() */ - public char[] getCharImage() { - switch ( getType() ) { + static public char[] getCharImage( int type ){ + switch ( type ) { case IToken.tCOLONCOLON : return Keywords.cpCOLONCOLON; case IToken.tCOLON : return Keywords.cpCOLON; case IToken.tSEMI : return Keywords.cpSEMI; |