Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Niefer2004-09-20 17:48:32 +0000
committerAndrew Niefer2004-09-20 17:48:32 +0000
commitdbefca11a9a75bb523de52131128939fadae7a84 (patch)
tree5f75f8c810c0423a90415a9a84962ed8e7afe3cb
parenta00354f2d98fd22becd100eb04a4d38f2da0cb55 (diff)
downloadorg.eclipse.cdt-dbefca11a9a75bb523de52131128939fadae7a84.tar.gz
org.eclipse.cdt-dbefca11a9a75bb523de52131128939fadae7a84.tar.xz
org.eclipse.cdt-dbefca11a9a75bb523de52131128939fadae7a84.zip
bug 73492 - [Scanner] Improper offset for particular IProblem
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java23
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java11
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/SimpleToken.java7
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;

Back to the top