1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

- add IProblem reporting to Scanner2

- modify function macro handling to fix test for bug 62009
- modify Search's use of the scanner to fix FunctionMethodPatternTest::testOperators_bug43063_bug42979
This commit is contained in:
Andrew Niefer 2004-08-06 19:42:57 +00:00
parent d52cfb4834
commit d38225d581
3 changed files with 127 additions and 53 deletions

View file

@ -1188,7 +1188,7 @@ public class Scanner2Test extends BaseScanner2Test
//TODO as in 36701B, whitespace is not properly replaced inside the string, ok for now.
//validateString("strncmp(\\\"abc\\\\0d\\\", \\\"abc\\\", '\\\\4') == 0"); //$NON-NLS-1$
validateString("strncmp(\\\"abc\\\\0d\\\", \\\"abc\\\", '\\\\4')\n == 0"); //$NON-NLS-1$
validateString("strncmp(\\\"abc\\\\0d\\\", \\\"abc\\\", '\\\\4') == 0"); //$NON-NLS-1$
validateToken(IToken.tCOMMA);
validateIdentifier("s"); //$NON-NLS-1$

View file

@ -463,9 +463,7 @@ public class Scanner2 implements IScanner, IScannerData {
continue;
return t;
}
//TODO - handle problem invalid char sequence
//error handling
bufferPos[ bufferStackPos ] += 2;
handleProblem( IProblem.SCANNER_BAD_CHARACTER, bufferPos[ bufferStackPos ], new char[] { '\\' } );
continue;
case '0':
@ -844,17 +842,24 @@ public class Scanner2 implements IScanner, IScannerData {
int stringStart = bufferPos[bufferStackPos] + 1;
int stringLen = 0;
boolean escaped = false;
boolean foundClosingQuote = false;
loop:
while (++bufferPos[bufferStackPos] < bufferLimit[bufferStackPos]) {
++stringLen;
char c = buffer[bufferPos[bufferStackPos]];
if (c == '"') {
if (!escaped)
if (!escaped){
foundClosingQuote = true;
break;
}
}
else if (c == '\\') {
escaped = !escaped;
continue;
} else if(c == '\n'){
//unescaped end of line before end of string
if( !escaped )
break;
}
escaped = false;
}
@ -862,8 +867,11 @@ public class Scanner2 implements IScanner, IScannerData {
// We should really throw an exception if we didn't get the terminating
// quote before the end of buffer
return newToken(tokenType, CharArrayUtils.extract(buffer, stringStart, stringLen));
char[] result = CharArrayUtils.extract(buffer, stringStart, stringLen);
if( !foundClosingQuote ){
handleProblem( IProblem.SCANNER_UNBOUNDED_STRING, stringStart, result );
}
return newToken(tokenType, result);
}
private IToken scanCharLiteral(boolean b) {
@ -955,9 +963,11 @@ public class Scanner2 implements IScanner, IScannerData {
continue;
case '.':
if (isFloat)
if (isFloat){
// second dot
handleProblem( IProblem.SCANNER_BAD_FLOATING_POINT, start, null );
break;
}
isFloat = true;
continue;
@ -1094,9 +1104,13 @@ public class Scanner2 implements IScanner, IScannerData {
--bufferPos[bufferStackPos];
return newToken( isFloat ? IToken.tFLOATINGPT : IToken.tINTEGER,
CharArrayUtils.extract(buffer, start,
bufferPos[bufferStackPos] - start + 1) );
char[] result = CharArrayUtils.extract( buffer, start, bufferPos[bufferStackPos] - start + 1);
int tokenType = isFloat ? IToken.tFLOATINGPT : IToken.tINTEGER;
if( tokenType == IToken.tINTEGER && isHex && result.length == 2 ){
handleProblem( IProblem.SCANNER_BAD_HEX_FORMAT, start, result );
}
return newToken( tokenType, result );
}
private void handlePPDirective(int pos) throws ScannerException, EndOfFileException {
@ -1114,6 +1128,7 @@ public class Scanner2 implements IScanner, IScannerData {
if (start >= limit || buffer[start] == '\n')
return;
boolean problem = false;
char c = buffer[start];
if ((c >= 'a' && c <= 'z')) {
while (++bufferPos[bufferStackPos] < limit) {
@ -1172,10 +1187,19 @@ public class Scanner2 implements IScanner, IScannerData {
return;
case ppError:
throw new ScannerException(null);
case ppEndif:
break;
default:
problem = true;
break;
}
}
}
} else
problem = true;
if( problem )
handleProblem( IProblem.PREPROCESSOR_INVALID_DIRECTIVE, start, null );
// don't know, chew up to the end of line
// includes endif which is immatereal at this point
skipToNewLine();
@ -1295,16 +1319,17 @@ public class Scanner2 implements IScanner, IScannerData {
if( filename == null || filename == EMPTY_STRING )
{
//TODO IProblem
handleProblem( IProblem.PREPROCESSOR_INVALID_DIRECTIVE, startOffset, null );
return;
}
char [] fileNameArray = filename.toCharArray();
// TODO else we need to do macro processing on the rest of the line
endLine = bufferLineNums[ bufferStackPos ];
skipToNewLine();
if( parserMode == ParserMode.QUICK_PARSE )
{
IASTInclusion inclusion = getASTFactory().createInclusion( filename.toCharArray(), EMPTY_STRING_CHAR_ARRAY, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename() );
IASTInclusion inclusion = getASTFactory().createInclusion( fileNameArray, EMPTY_STRING_CHAR_ARRAY, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename() );
requestor.enterInclusion( inclusion );
requestor.exitInclusion( inclusion );
}
@ -1327,7 +1352,7 @@ public class Scanner2 implements IScanner, IScannerData {
if (reader.filename != null)
fileCache.put(reader.filename, reader);
if (dlog != null) dlog.println("#include \"" + finalPath + "\""); //$NON-NLS-1$ //$NON-NLS-2$
IASTInclusion inclusion = getASTFactory().createInclusion( filename.toCharArray(), reader.filename, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename() );
IASTInclusion inclusion = getASTFactory().createInclusion( fileNameArray, reader.filename, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename() );
pushContext(reader.buffer, new InclusionData( reader, inclusion ));
return;
}
@ -1354,16 +1379,16 @@ public class Scanner2 implements IScanner, IScannerData {
if (reader.filename != null)
fileCache.put(reader.filename, reader);
if (dlog != null) dlog.println("#include <" + finalPath + ">"); //$NON-NLS-1$ //$NON-NLS-2$
IASTInclusion inclusion = getASTFactory().createInclusion( filename.toCharArray(), reader.filename, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename() );
IASTInclusion inclusion = getASTFactory().createInclusion( fileNameArray, reader.filename, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename() );
pushContext(reader.buffer, new InclusionData( reader, inclusion ));
return;
}
}
}
// TODO raise a problem
//if (reader == null)
// handleProblem( IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, filename, beginOffset, false, true );
if (reader == null)
handleProblem( IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, startOffset, fileNameArray);
}
}
@ -1383,6 +1408,7 @@ public class Scanner2 implements IScanner, IScannerData {
char c = buffer[idstart];
if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_')) {
handleProblem( IProblem.PREPROCESSOR_INVALID_MACRO_DEFN, idstart, null );
skipToNewLine();
return;
}
@ -1429,6 +1455,7 @@ public class Scanner2 implements IScanner, IScannerData {
arglist[++currarg] = "...".toCharArray(); //$NON-NLS-1$
continue;
} else if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')) {
handleProblem( IProblem.PREPROCESSOR_INVALID_MACRO_DEFN, idstart, name );
// yuck
skipToNewLine();
return;
@ -1455,7 +1482,22 @@ public class Scanner2 implements IScanner, IScannerData {
boolean encounteredMultilineComment = false;
while (bufferPos[bufferStackPos] + 1 < limit
&& buffer[bufferPos[bufferStackPos] + 1] != '\n') {
skipOverNonWhiteSpace();
if( arglist != null && !skipOverNonWhiteSpace( true ) ){
++bufferPos[bufferStackPos];
if( skipOverWhiteSpace() )
encounteredMultilineComment = true;
boolean isArg = false;
for( int i = 0; i < arglist.length && arglist[i] != null; i++ ){
if( CharArrayUtils.equals( buffer, bufferPos[bufferStackPos], arglist[i].length, arglist[i] ) ){
isArg = true;
break;
}
}
if( !isArg )
handleProblem( IProblem.PREPROCESSOR_MACRO_PASTING_ERROR, bufferPos[bufferStackPos], null );
} else {
skipOverNonWhiteSpace();
}
textend = bufferPos[bufferStackPos];
if( skipOverWhiteSpace() )
encounteredMultilineComment = true;
@ -1756,7 +1798,10 @@ public class Scanner2 implements IScanner, IScannerData {
return encounteredMultiLineComment;
}
private void skipOverNonWhiteSpace() {
private void skipOverNonWhiteSpace(){
skipOverNonWhiteSpace( false );
}
private boolean skipOverNonWhiteSpace( boolean stopAtPound ) {
char[] buffer = bufferStack[bufferStackPos];
int limit = bufferLimit[bufferStackPos];
@ -1767,13 +1812,13 @@ public class Scanner2 implements IScanner, IScannerData {
case '\r':
case '\n':
--bufferPos[bufferStackPos];
return;
return true;
case '/':
int pos = bufferPos[bufferStackPos];
if( pos +1 < limit && ( buffer[pos+1] == '/' ) || ( buffer[pos+1] == '*') )
{
--bufferPos[bufferStackPos];
return;
return true;
}
break;
@ -1782,7 +1827,7 @@ public class Scanner2 implements IScanner, IScannerData {
if (pos + 1 < limit && buffer[pos + 1] == '\n') {
// \n is whitespace
--bufferPos[bufferStackPos];
return;
return true;
}
break;
case '"':
@ -1810,7 +1855,7 @@ public class Scanner2 implements IScanner, IScannerData {
buffer[bufferPos[ bufferStackPos ] + 1] == '*' ) )
{
--bufferPos[bufferStackPos];
return;
return true;
}
default:
@ -1837,9 +1882,16 @@ public class Scanner2 implements IScanner, IScannerData {
}
}
break;
case '#' :
if( stopAtPound ){
--bufferPos[bufferStackPos];
return false;
}
break;
}
}
--bufferPos[bufferStackPos];
return true;
}
private void skipOverMacroArg() {
@ -1970,9 +2022,11 @@ public class Scanner2 implements IScanner, IScannerData {
CharArrayObjectMap argmap = new CharArrayObjectMap(arglist.length);
while (bufferPos[bufferStackPos] < limit) {
if (++currarg >= arglist.length || arglist[currarg] == null)
if (++currarg >= arglist.length || arglist[currarg] == null){
// too many args
handleProblem( IProblem.PREPROCESSOR_MACRO_USAGE_ERROR, bufferPos[bufferStackPos], macro.name );
break;
}
skipOverWhiteSpace();
@ -2052,6 +2106,16 @@ public class Scanner2 implements IScanner, IScannerData {
if (c == ')')
break;
}
int numArgs = arglist.length;
for( int i = 0; i < arglist.length; i++ ){
if( arglist[i] == null ){
numArgs = i;
break;
}
}
if( argmap.size() < numArgs ){
handleProblem( IProblem.PREPROCESSOR_MACRO_USAGE_ERROR, bufferPos[bufferStackPos], macro.name );
}
int size = expandFunctionStyleMacro(macro.expansion, argmap, null);
char[] result = new char[size];
@ -2344,7 +2408,10 @@ public class Scanner2 implements IScanner, IScannerData {
for( int i = 0; i < argvalue.length; i++ ){
if( argvalue[i] == '"' || argvalue[i] == '\\' )
result[outpos++] = '\\';
result[outpos++] = argvalue[i];
if( argvalue[i] == '\r' || argvalue[i] == '\n' )
result[outpos++] = ' ';
else
result[outpos++] = argvalue[i];
}
result[outpos++] = '"';
} else {

View file

@ -65,6 +65,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
protected static class Requestor extends NullSourceElementRequestor
{
public int badCharacterOffset = -1;
public Requestor( ParserMode mode )
{
super( mode );
@ -72,12 +73,14 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
public boolean acceptProblem( IProblem problem )
{
if( problem.getID() == IProblem.SCANNER_BAD_CHARACTER ) return false;
if( problem.getID() == IProblem.SCANNER_BAD_CHARACTER ){
badCharacterOffset = problem.getSourceStart();
return false;
}
return super.acceptProblem( problem );
}
}
private static Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
/**
* @param matchMode
* @param caseSensitive
@ -176,7 +179,9 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
}
char [] patternArray = patternString.toCharArray();
IScanner scanner = null;
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
try {
scanner =
ParserFactory.createScanner(
@ -189,7 +194,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
} catch (ParserFactoryError e) {
}
LinkedList list = scanForNames( scanner, null, patternArray );
LinkedList list = scanForNames( scanner, callback, null, patternArray );
char [] name = (char []) list.removeLast();
char [][] qualifications = new char [0][];
@ -247,6 +252,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
}
char [] patternArray = patternString.toCharArray();
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
IScanner scanner=null;
try {
scanner =
@ -259,7 +265,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
} catch (ParserFactoryError e) {
}
LinkedList list = scanForNames( scanner, null, patternArray );
LinkedList list = scanForNames( scanner, callback, null, patternArray );
char [] name = (char []) list.removeLast();
char [][] qualifications = new char[0][];
@ -289,6 +295,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
String nameString = ( index == -1 ) ? patternString : patternString.substring( 0, index );
char [] nameArray = nameString.toCharArray();
IScanner scanner=null;
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
try {
scanner =
ParserFactory.createScanner(
@ -300,7 +307,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
} catch (ParserFactoryError e) {
}
LinkedList names = scanForNames( scanner, null, nameArray );
LinkedList names = scanForNames( scanner, callback, null, nameArray );
LinkedList params = scanForParameters( paramString );
@ -340,6 +347,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
char [] patternArray = patternString.toCharArray();
IScanner scanner =null;
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
try {
scanner =
ParserFactory.createScanner(
@ -380,7 +388,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
}
}
LinkedList list = scanForNames( scanner, token, patternArray );
LinkedList list = scanForNames( scanner, callback, token, patternArray );
char[] name = (char [])list.removeLast();
char [][] qualifications = new char[0][];
@ -393,6 +401,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
char [] patternArray = patternString.toCharArray();
IScanner scanner =null;
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
try {
scanner =
ParserFactory.createScanner(
@ -406,7 +415,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
searchFor = DERIVED;
LinkedList list = scanForNames( scanner, null, patternArray );
LinkedList list = scanForNames( scanner, callback, null, patternArray );
char[] name = (char [])list.removeLast();
char [][] qualifications = new char[0][];
@ -418,6 +427,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
char [] patternArray = patternString.toCharArray();
IScanner scanner =null;
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
try {
scanner =
ParserFactory.createScanner(
@ -431,7 +441,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
searchFor = FRIEND;
LinkedList list = scanForNames( scanner, null, patternArray );
LinkedList list = scanForNames( scanner, callback, null, patternArray );
char[] name = (char [])list.removeLast();
char [][] qualifications = new char[0][];
@ -452,6 +462,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
String functionString = "void f " + paramString + ";"; //$NON-NLS-1$ //$NON-NLS-2$
IScanner scanner=null;
IQuickParseCallback callback = ParserFactory.createQuickParseCallback();
try {
scanner =
ParserFactory.createScanner(
@ -462,7 +473,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
callback,new NullLogService(), null);
} catch (ParserFactoryError e1) {
}
IQuickParseCallback callback = ParserFactory.createQuickParseCallback();
IParser parser=null;
try {
parser =
@ -508,7 +519,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
return list;
}
static private LinkedList scanForNames( IScanner scanner, IToken unusedToken, char[] pattern ){
static private LinkedList scanForNames( IScanner scanner, Requestor callback, IToken unusedToken, char[] pattern ){
LinkedList list = new LinkedList();
String name = new String(""); //$NON-NLS-1$
@ -517,9 +528,7 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
try {
IToken token = ( unusedToken != null ) ? unusedToken : scanner.nextToken();
IToken prev = null;
scanner.setThrowExceptionOnBadCharacterRead( true );
boolean encounteredWild = false;
boolean lastTokenWasOperator = false;
@ -579,19 +588,17 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
token = null;
while( token == null ){
try{
token = scanner.nextToken();
} catch ( ScannerException e ){
if( e.getProblem().getID() == IProblem.SCANNER_BAD_CHARACTER ){
//TODO : This may not be \\, it could be another bad character
if( !encounteredWild && !lastTokenWasOperator && prev.getType() != IToken.tARROW ) name += " "; //$NON-NLS-1$
name += "\\"; //$NON-NLS-1$
idx++;
encounteredWild = true;
lastTokenWasOperator = false;
prev = null;
}
}
token = scanner.nextToken();
if( callback.badCharacterOffset != -1 && token.getOffset() > callback.badCharacterOffset ){
//TODO : This may not be \\, it could be another bad character
if( !encounteredWild && !lastTokenWasOperator && prev.getType() != IToken.tARROW ) name += " "; //$NON-NLS-1$
name += "\\"; //$NON-NLS-1$
idx++;
encounteredWild = true;
lastTokenWasOperator = false;
prev = null;
callback.badCharacterOffset = -1;
}
}
}
} catch (EndOfFileException e) {