1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-09-01 20:53:12 +02:00

Fixed Bug 71530 [Scanner] CModel Line Numbers are incorrect w/Scanner2

This commit is contained in:
John Camelon 2004-08-16 19:54:13 +00:00
parent 3640141887
commit 219b499fc9
3 changed files with 63 additions and 27 deletions

View file

@ -507,8 +507,8 @@ public class CModelElementsTests extends TestCase {
}
private void checkLineNumbers(CElement element, int startLine, int endLine){
// assertEquals(startLine, element.getStartLine());
// assertEquals(endLine, element.getEndLine());
assertEquals(startLine, element.getStartLine());
assertEquals(endLine, element.getEndLine());
}
private void checkElementOffset(CElement element) throws CModelException{
if(element.getElementName().length() > 0 ){

View file

@ -515,8 +515,8 @@ public class StructuralCModelElementsTests extends TestCase {
}
private void checkLineNumbers(CElement element, int startLine, int endLine){
// assertEquals(startLine, element.getStartLine());
// assertEquals(endLine, element.getEndLine());
assertEquals(startLine, element.getStartLine());
assertEquals(endLine, element.getEndLine());
}
private void checkElementOffset(CElement element) throws CModelException{

View file

@ -99,7 +99,8 @@ public class Scanner2 implements IScanner, IScannerData {
private Object[] bufferData = new Object[bufferInitialSize];
private int[] bufferPos = new int[bufferInitialSize];
private int[] bufferLimit = new int[bufferInitialSize];
private int[] bufferLineNums = new int[bufferInitialSize];
private int[] lineNumbers = new int[bufferInitialSize];
private int[] lineOffsets = new int[bufferInitialSize];
//branch tracking
private int branchStackPos = -1;
@ -191,23 +192,28 @@ public class Scanner2 implements IScanner, IScannerData {
bufferLimit = new int[size];
System.arraycopy(oldBufferLimit, 0, bufferLimit, 0, oldBufferLimit.length);
int [] oldBufferLineNums = bufferLineNums;
bufferLineNums = new int[size];
System.arraycopy( oldBufferLineNums, 0, bufferLineNums, 0, oldBufferLineNums.length);
int [] oldLineNumbers = lineNumbers;
lineNumbers = new int[size];
System.arraycopy( oldLineNumbers, 0, lineNumbers, 0, oldLineNumbers.length );
int [] oldLineOffsets = lineOffsets;
lineOffsets = new int[size];
System.arraycopy( oldLineOffsets, 0, lineOffsets, 0, oldLineOffsets.length );
}
bufferStack[bufferStackPos] = buffer;
bufferPos[bufferStackPos] = -1;
bufferLineNums[ bufferStackPos ] = 1;
bufferLimit[bufferStackPos] = buffer.length;
lineNumbers[bufferStackPos] = 1;
lineOffsets[bufferStackPos] = 0;
}
private void pushContext(char[] buffer, Object data) {
pushContext(buffer);
bufferData[bufferStackPos] = data;
if( data instanceof InclusionData )
requestor.enterInclusion( ((InclusionData)data).inclusion );
requestor.enterInclusion( ((InclusionData)data).inclusion );
}
private void popContext() {
@ -215,7 +221,6 @@ public class Scanner2 implements IScanner, IScannerData {
if( bufferData[bufferStackPos] instanceof InclusionData )
requestor.exitInclusion( ((InclusionData)bufferData[bufferStackPos]).inclusion );
bufferData[bufferStackPos] = null;
bufferLineNums[bufferStackPos] = 1;
--bufferStackPos;
}
@ -387,7 +392,6 @@ public class Scanner2 implements IScanner, IScannerData {
switch (buffer[pos]) {
case '\n':
++bufferLineNums[bufferStackPos];
continue;
case 'L':
@ -733,7 +737,7 @@ public class Scanner2 implements IScanner, IScannerData {
* @return
*/
private IToken newToken( int signal ) {
return new SimpleToken(signal, bufferPos[bufferStackPos] + 1 , getCurrentFilename(), bufferLineNums[bufferStackPos] );
return new SimpleToken(signal, bufferPos[bufferStackPos] + 1 , getCurrentFilename(), getLineNumber( bufferPos[bufferStackPos] + 1) );
}
private IToken newToken( int signal, char [] buffer )
@ -746,10 +750,10 @@ public class Scanner2 implements IScanner, IScannerData {
if( bufferData[mostRelevant] instanceof InclusionData || bufferData[mostRelevant] instanceof CodeReader )
break;
if( bufferData[bufferStackPos] instanceof ObjectStyleMacro )
return new ImagedExpansionToken( signal, buffer, bufferPos[mostRelevant], ((ObjectStyleMacro)bufferData[bufferStackPos]).name.length, getCurrentFilename(), bufferLineNums[bufferStackPos] );
return new ImagedExpansionToken( signal, buffer, bufferPos[mostRelevant], ((FunctionStyleMacro)bufferData[bufferStackPos]).name.length, getCurrentFilename(), bufferLineNums[bufferStackPos] );
return new ImagedExpansionToken( signal, buffer, bufferPos[mostRelevant], ((ObjectStyleMacro)bufferData[bufferStackPos]).name.length, getCurrentFilename(), getLineNumber( bufferPos[bufferStackPos] + 1) );
return new ImagedExpansionToken( signal, buffer, bufferPos[mostRelevant], ((FunctionStyleMacro)bufferData[bufferStackPos]).name.length, getCurrentFilename(), getLineNumber( bufferPos[bufferStackPos] + 1));
}
return new ImagedToken(signal, buffer, bufferPos[bufferStackPos] + 1 , getCurrentFilename(), bufferLineNums[bufferStackPos] );
return new ImagedToken(signal, buffer, bufferPos[bufferStackPos] + 1 , getCurrentFilename(), getLineNumber( bufferPos[bufferStackPos] + 1));
}
private IToken scanIdentifier() {
@ -770,7 +774,6 @@ public class Scanner2 implements IScanner, IScannerData {
{
// escaped newline
++bufferPos[bufferStackPos];
++bufferLineNums[bufferStackPos];
len += 2;
escapedNewline = true;
continue;
@ -940,11 +943,37 @@ public class Scanner2 implements IScanner, IScannerData {
* @param scanner_bad_character
*/
private void handleProblem(int id, int startOffset, char [] arg ) {
IProblem p = spf.createProblem( id, startOffset, bufferPos[bufferStackPos], bufferLineNums[bufferStackPos], getCurrentFilename(), arg != null ? arg : emptyCharArray, false, true );
if( parserMode == ParserMode.COMPLETION_PARSE ) return;
IProblem p = spf.createProblem( id, startOffset, bufferPos[bufferStackPos], getLineNumber( bufferPos[bufferStackPos] ), getCurrentFilename(), arg != null ? arg : emptyCharArray, false, true );
requestor.acceptProblem( p );
}
/**
* @param i
* @return
*/
protected int getLineNumber(int offset) {
if( parserMode == ParserMode.COMPLETION_PARSE ) return -1;
int index = getCurrentFileIndex();
if( offset >= bufferLimit[ index ]) return -1;
int lineNum = lineNumbers[ index ];
int startingPoint = lineOffsets[ index ];
for( int i = startingPoint; i < offset; ++i )
{
if( bufferStack[ index ][i] == '\n')
++lineNum;
}
if( startingPoint < offset )
{
lineNumbers[ index ] = lineNum;
lineOffsets[ index ] = offset;
}
return lineNum;
}
private IToken scanNumber() {
char[] buffer = bufferStack[bufferStackPos];
int start = bufferPos[bufferStackPos];
@ -1169,7 +1198,7 @@ public class Scanner2 implements IScanner, IScannerData {
private void handlePPDirective(int pos) throws ScannerException, EndOfFileException {
char[] buffer = bufferStack[bufferStackPos];
int limit = bufferLimit[bufferStackPos];
int startingLineNumber = bufferLineNums[ bufferStackPos ];
int startingLineNumber = getLineNumber( pos );
skipOverWhiteSpace();
if( isLimitReached() )
handleCompletionOnPreprocessorDirective( "#" ); //$NON-NLS-1$
@ -1289,7 +1318,7 @@ public class Scanner2 implements IScanner, IScannerData {
char c = buffer[pos];
if( c == '\n') return;
if (c == '"') {
nameLine = bufferLineNums[ bufferStackPos ];
nameLine = getLineNumber( bufferPos[bufferStackPos] );
local = true;
int start = bufferPos[bufferStackPos] + 1;
int length = 0;
@ -1313,7 +1342,7 @@ public class Scanner2 implements IScanner, IScannerData {
nameEndOffset = start + length;
endOffset = start + length + 1;
} else if (c == '<') {
nameLine = bufferLineNums[ bufferStackPos ];
nameLine = getLineNumber( bufferPos[ bufferStackPos ] );
local = false;
int start = bufferPos[bufferStackPos] + 1;
int length = 0;
@ -1343,7 +1372,6 @@ public class Scanner2 implements IScanner, IScannerData {
{
// escaped newline
++bufferPos[bufferStackPos];
++bufferLineNums[bufferStackPos];
len += 2;
continue;
}
@ -1387,7 +1415,7 @@ public class Scanner2 implements IScanner, IScannerData {
}
char [] fileNameArray = filename.toCharArray();
// TODO else we need to do macro processing on the rest of the line
endLine = bufferLineNums[ bufferStackPos ];
endLine = getLineNumber( bufferPos[ bufferStackPos ] );
skipToNewLine();
if( parserMode == ParserMode.QUICK_PARSE )
@ -1487,7 +1515,7 @@ public class Scanner2 implements IScanner, IScannerData {
break;
}
--bufferPos[bufferStackPos];
nameLine = bufferLineNums[ bufferStackPos ];
nameLine = getLineNumber( bufferPos[ bufferStackPos ] );
char[] name = new char[idlen];
System.arraycopy(buffer, idstart, name, 0, idlen);
if (dlog != null) dlog.println("#define " + new String(buffer, idstart, idlen)); //$NON-NLS-1$
@ -1567,7 +1595,7 @@ public class Scanner2 implements IScanner, IScannerData {
}
int textlen = textend - textstart + 1;
endingLine = bufferLineNums[ bufferStackPos ] - 1;
endingLine = getLineNumber( bufferPos[ bufferStackPos ] );
char[] text = emptyCharArray;
if (textlen > 0) {
text = new char[textlen];
@ -2932,7 +2960,15 @@ public class Scanner2 implements IScanner, IScannerData {
return ((CodeReader)bufferData[i]).filename;
}
return emptyCharArray;
}
private final int getCurrentFileIndex() {
for( int i = bufferStackPos; i >= 0; --i )
{
if( bufferData[i] instanceof InclusionData || bufferData[i] instanceof CodeReader )
return i;
}
return 0;
}
private static CharArrayIntMap keywords;