mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-09-02 05:03:36 +02:00
Fixed Bug 71530 [Scanner] CModel Line Numbers are incorrect w/Scanner2
This commit is contained in:
parent
3640141887
commit
219b499fc9
3 changed files with 63 additions and 27 deletions
|
@ -507,8 +507,8 @@ public class CModelElementsTests extends TestCase {
|
||||||
|
|
||||||
}
|
}
|
||||||
private void checkLineNumbers(CElement element, int startLine, int endLine){
|
private void checkLineNumbers(CElement element, int startLine, int endLine){
|
||||||
// assertEquals(startLine, element.getStartLine());
|
assertEquals(startLine, element.getStartLine());
|
||||||
// assertEquals(endLine, element.getEndLine());
|
assertEquals(endLine, element.getEndLine());
|
||||||
}
|
}
|
||||||
private void checkElementOffset(CElement element) throws CModelException{
|
private void checkElementOffset(CElement element) throws CModelException{
|
||||||
if(element.getElementName().length() > 0 ){
|
if(element.getElementName().length() > 0 ){
|
||||||
|
|
|
@ -515,8 +515,8 @@ public class StructuralCModelElementsTests extends TestCase {
|
||||||
|
|
||||||
}
|
}
|
||||||
private void checkLineNumbers(CElement element, int startLine, int endLine){
|
private void checkLineNumbers(CElement element, int startLine, int endLine){
|
||||||
// assertEquals(startLine, element.getStartLine());
|
assertEquals(startLine, element.getStartLine());
|
||||||
// assertEquals(endLine, element.getEndLine());
|
assertEquals(endLine, element.getEndLine());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkElementOffset(CElement element) throws CModelException{
|
private void checkElementOffset(CElement element) throws CModelException{
|
||||||
|
|
|
@ -99,7 +99,8 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
private Object[] bufferData = new Object[bufferInitialSize];
|
private Object[] bufferData = new Object[bufferInitialSize];
|
||||||
private int[] bufferPos = new int[bufferInitialSize];
|
private int[] bufferPos = new int[bufferInitialSize];
|
||||||
private int[] bufferLimit = 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
|
//branch tracking
|
||||||
private int branchStackPos = -1;
|
private int branchStackPos = -1;
|
||||||
|
@ -191,16 +192,21 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
bufferLimit = new int[size];
|
bufferLimit = new int[size];
|
||||||
System.arraycopy(oldBufferLimit, 0, bufferLimit, 0, oldBufferLimit.length);
|
System.arraycopy(oldBufferLimit, 0, bufferLimit, 0, oldBufferLimit.length);
|
||||||
|
|
||||||
int [] oldBufferLineNums = bufferLineNums;
|
int [] oldLineNumbers = lineNumbers;
|
||||||
bufferLineNums = new int[size];
|
lineNumbers = new int[size];
|
||||||
System.arraycopy( oldBufferLineNums, 0, bufferLineNums, 0, oldBufferLineNums.length);
|
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;
|
bufferStack[bufferStackPos] = buffer;
|
||||||
bufferPos[bufferStackPos] = -1;
|
bufferPos[bufferStackPos] = -1;
|
||||||
bufferLineNums[ bufferStackPos ] = 1;
|
|
||||||
bufferLimit[bufferStackPos] = buffer.length;
|
bufferLimit[bufferStackPos] = buffer.length;
|
||||||
|
lineNumbers[bufferStackPos] = 1;
|
||||||
|
lineOffsets[bufferStackPos] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pushContext(char[] buffer, Object data) {
|
private void pushContext(char[] buffer, Object data) {
|
||||||
|
@ -215,7 +221,6 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
if( bufferData[bufferStackPos] instanceof InclusionData )
|
if( bufferData[bufferStackPos] instanceof InclusionData )
|
||||||
requestor.exitInclusion( ((InclusionData)bufferData[bufferStackPos]).inclusion );
|
requestor.exitInclusion( ((InclusionData)bufferData[bufferStackPos]).inclusion );
|
||||||
bufferData[bufferStackPos] = null;
|
bufferData[bufferStackPos] = null;
|
||||||
bufferLineNums[bufferStackPos] = 1;
|
|
||||||
--bufferStackPos;
|
--bufferStackPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -387,7 +392,6 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
|
|
||||||
switch (buffer[pos]) {
|
switch (buffer[pos]) {
|
||||||
case '\n':
|
case '\n':
|
||||||
++bufferLineNums[bufferStackPos];
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case 'L':
|
case 'L':
|
||||||
|
@ -733,7 +737,7 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private IToken newToken( int signal ) {
|
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 )
|
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 )
|
if( bufferData[mostRelevant] instanceof InclusionData || bufferData[mostRelevant] instanceof CodeReader )
|
||||||
break;
|
break;
|
||||||
if( bufferData[bufferStackPos] instanceof ObjectStyleMacro )
|
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], ((ObjectStyleMacro)bufferData[bufferStackPos]).name.length, getCurrentFilename(), getLineNumber( bufferPos[bufferStackPos] + 1) );
|
||||||
return new ImagedExpansionToken( signal, buffer, bufferPos[mostRelevant], ((FunctionStyleMacro)bufferData[bufferStackPos]).name.length, getCurrentFilename(), bufferLineNums[bufferStackPos] );
|
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() {
|
private IToken scanIdentifier() {
|
||||||
|
@ -770,7 +774,6 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
{
|
{
|
||||||
// escaped newline
|
// escaped newline
|
||||||
++bufferPos[bufferStackPos];
|
++bufferPos[bufferStackPos];
|
||||||
++bufferLineNums[bufferStackPos];
|
|
||||||
len += 2;
|
len += 2;
|
||||||
escapedNewline = true;
|
escapedNewline = true;
|
||||||
continue;
|
continue;
|
||||||
|
@ -940,11 +943,37 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
* @param scanner_bad_character
|
* @param scanner_bad_character
|
||||||
*/
|
*/
|
||||||
private void handleProblem(int id, int startOffset, char [] arg ) {
|
private void handleProblem(int id, int startOffset, char [] arg ) {
|
||||||
|
if( parserMode == ParserMode.COMPLETION_PARSE ) return;
|
||||||
IProblem p = spf.createProblem( id, startOffset, bufferPos[bufferStackPos], bufferLineNums[bufferStackPos], getCurrentFilename(), arg != null ? arg : emptyCharArray, false, true );
|
IProblem p = spf.createProblem( id, startOffset, bufferPos[bufferStackPos], getLineNumber( bufferPos[bufferStackPos] ), getCurrentFilename(), arg != null ? arg : emptyCharArray, false, true );
|
||||||
requestor.acceptProblem( p );
|
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() {
|
private IToken scanNumber() {
|
||||||
char[] buffer = bufferStack[bufferStackPos];
|
char[] buffer = bufferStack[bufferStackPos];
|
||||||
int start = bufferPos[bufferStackPos];
|
int start = bufferPos[bufferStackPos];
|
||||||
|
@ -1169,7 +1198,7 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
private void handlePPDirective(int pos) throws ScannerException, EndOfFileException {
|
private void handlePPDirective(int pos) throws ScannerException, EndOfFileException {
|
||||||
char[] buffer = bufferStack[bufferStackPos];
|
char[] buffer = bufferStack[bufferStackPos];
|
||||||
int limit = bufferLimit[bufferStackPos];
|
int limit = bufferLimit[bufferStackPos];
|
||||||
int startingLineNumber = bufferLineNums[ bufferStackPos ];
|
int startingLineNumber = getLineNumber( pos );
|
||||||
skipOverWhiteSpace();
|
skipOverWhiteSpace();
|
||||||
if( isLimitReached() )
|
if( isLimitReached() )
|
||||||
handleCompletionOnPreprocessorDirective( "#" ); //$NON-NLS-1$
|
handleCompletionOnPreprocessorDirective( "#" ); //$NON-NLS-1$
|
||||||
|
@ -1289,7 +1318,7 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
char c = buffer[pos];
|
char c = buffer[pos];
|
||||||
if( c == '\n') return;
|
if( c == '\n') return;
|
||||||
if (c == '"') {
|
if (c == '"') {
|
||||||
nameLine = bufferLineNums[ bufferStackPos ];
|
nameLine = getLineNumber( bufferPos[bufferStackPos] );
|
||||||
local = true;
|
local = true;
|
||||||
int start = bufferPos[bufferStackPos] + 1;
|
int start = bufferPos[bufferStackPos] + 1;
|
||||||
int length = 0;
|
int length = 0;
|
||||||
|
@ -1313,7 +1342,7 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
nameEndOffset = start + length;
|
nameEndOffset = start + length;
|
||||||
endOffset = start + length + 1;
|
endOffset = start + length + 1;
|
||||||
} else if (c == '<') {
|
} else if (c == '<') {
|
||||||
nameLine = bufferLineNums[ bufferStackPos ];
|
nameLine = getLineNumber( bufferPos[ bufferStackPos ] );
|
||||||
local = false;
|
local = false;
|
||||||
int start = bufferPos[bufferStackPos] + 1;
|
int start = bufferPos[bufferStackPos] + 1;
|
||||||
int length = 0;
|
int length = 0;
|
||||||
|
@ -1343,7 +1372,6 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
{
|
{
|
||||||
// escaped newline
|
// escaped newline
|
||||||
++bufferPos[bufferStackPos];
|
++bufferPos[bufferStackPos];
|
||||||
++bufferLineNums[bufferStackPos];
|
|
||||||
len += 2;
|
len += 2;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1387,7 +1415,7 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
}
|
}
|
||||||
char [] fileNameArray = filename.toCharArray();
|
char [] fileNameArray = filename.toCharArray();
|
||||||
// TODO else we need to do macro processing on the rest of the line
|
// TODO else we need to do macro processing on the rest of the line
|
||||||
endLine = bufferLineNums[ bufferStackPos ];
|
endLine = getLineNumber( bufferPos[ bufferStackPos ] );
|
||||||
skipToNewLine();
|
skipToNewLine();
|
||||||
|
|
||||||
if( parserMode == ParserMode.QUICK_PARSE )
|
if( parserMode == ParserMode.QUICK_PARSE )
|
||||||
|
@ -1487,7 +1515,7 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
--bufferPos[bufferStackPos];
|
--bufferPos[bufferStackPos];
|
||||||
nameLine = bufferLineNums[ bufferStackPos ];
|
nameLine = getLineNumber( bufferPos[ bufferStackPos ] );
|
||||||
char[] name = new char[idlen];
|
char[] name = new char[idlen];
|
||||||
System.arraycopy(buffer, idstart, name, 0, idlen);
|
System.arraycopy(buffer, idstart, name, 0, idlen);
|
||||||
if (dlog != null) dlog.println("#define " + new String(buffer, idstart, idlen)); //$NON-NLS-1$
|
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;
|
int textlen = textend - textstart + 1;
|
||||||
endingLine = bufferLineNums[ bufferStackPos ] - 1;
|
endingLine = getLineNumber( bufferPos[ bufferStackPos ] );
|
||||||
char[] text = emptyCharArray;
|
char[] text = emptyCharArray;
|
||||||
if (textlen > 0) {
|
if (textlen > 0) {
|
||||||
text = new char[textlen];
|
text = new char[textlen];
|
||||||
|
@ -2932,7 +2960,15 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
return ((CodeReader)bufferData[i]).filename;
|
return ((CodeReader)bufferData[i]).filename;
|
||||||
}
|
}
|
||||||
return emptyCharArray;
|
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;
|
private static CharArrayIntMap keywords;
|
||||||
|
|
Loading…
Add table
Reference in a new issue