From 03144000c42a4f600f030b2c1ea190c6b70acd6f Mon Sep 17 00:00:00 2001 From: John Camelon Date: Thu, 22 Apr 2004 02:56:52 +0000 Subject: [PATCH] org.eclipse.cdt.core
 Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39703
 Removed method IScanner.addIncludePath() as it wasn't being used.
 Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39698

org.eclipse.cdt.core.tests
 Moved testBug39703() from ASTFailedTests to QuickParseASTTest.
 Added ScannerTestCase::testBug39698().
 Moved testBug39698A() & testBug39698B() from ASTFailedTests to QuickParseASTTest.
 Added testBug39698A() & testBug39698B() to CompleteParseASTTest. --- core/org.eclipse.cdt.core.tests/ChangeLog | 6 ++ .../parser/failedTests/ASTFailedTests.java | 29 +------ .../parser/tests/CompleteParseASTTest.java | 10 +++ .../core/parser/tests/QuickParseASTTests.java | 27 +++++++ .../core/parser/tests/ScannerTestCase.java | 9 +++ .../parser/ChangeLog-parser | 5 ++ .../eclipse/cdt/core/parser/IGCCToken.java | 2 + .../org/eclipse/cdt/core/parser/IScanner.java | 1 - .../parser/ast/gcc/IASTGCCExpression.java | 2 + .../parser/extension/IParserExtension.java | 4 +- .../parser/extension/IScannerExtension.java | 12 ++- .../core/parser/CompletionParser.java | 1 + .../core/parser/ContextualParser.java | 2 +- .../core/parser/ExpressionParser.java | 15 +++- .../core/parser/GCCParserExtension.java | 80 +++++++++++++++++-- .../cdt/internal/core/parser/IParserData.java | 11 +++ .../cdt/internal/core/parser/Parser.java | 4 +- .../core/parser/ast/GCCASTExtension.java | 12 +-- .../core/parser/scanner/ContextStack.java | 2 +- .../parser/scanner/GCCScannerExtension.java | 54 ++++++++++--- .../internal/core/parser/scanner/Scanner.java | 22 +++-- .../core/parser/scanner/ScannerUtility.java | 2 +- 22 files changed, 246 insertions(+), 66 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/ChangeLog b/core/org.eclipse.cdt.core.tests/ChangeLog index 635bcc4da3b..f91253f2c5b 100644 --- a/core/org.eclipse.cdt.core.tests/ChangeLog +++ b/core/org.eclipse.cdt.core.tests/ChangeLog @@ -1,3 +1,9 @@ +2004-04-21 John Camelon + Moved testBug39703() from ASTFailedTests to QuickParseASTTest. + Added ScannerTestCase::testBug39698(). + Moved testBug39698A() & testBug39698B() from ASTFailedTests to QuickParseASTTest. + Added testBug39698A() & testBug39698B() to CompleteParseASTTest. + 2004-04-21 Andrew Niefer fox bugs 52695 & 45372 added parser/CompleteParseASTSymbolIteratorTest.testUsingDirectives() diff --git a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/ASTFailedTests.java b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/ASTFailedTests.java index 17cce89ba1c..0824378af95 100644 --- a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/ASTFailedTests.java +++ b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/ASTFailedTests.java @@ -13,8 +13,6 @@ import java.io.IOException; import java.io.StringWriter; import java.io.Writer; -import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration; -import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration; import org.eclipse.cdt.core.parser.tests.BaseASTTest; /** @@ -125,14 +123,7 @@ public class ASTFailedTests extends BaseASTTest { assertCodeFailsParse("register int *foo asm (\"a5\");"); } - public void testBug39698A() throws Exception - { - assertCodeFailsParse("int c = a ? b;"); - } + public void testBug39701A() throws Exception { assertCodeFailsParse("extern template int max (int, int);"); @@ -160,24 +151,6 @@ public class ASTFailedTests extends BaseASTTest } assertCodeFailsFullParse(code.toString()); } - public void testBug39703() throws Exception - { - Writer code = new StringWriter(); - try - { - code.write( - "/* __extension__ enables GNU C mode for the duration of the declaration. */\n"); - code.write("__extension__ struct G {\n"); - code.write(" struct { char z; };\n"); - code.write(" char g;\n"); - code.write("};\n"); - } - catch (IOException ioe) - { - } - IASTAbstractTypeSpecifierDeclaration abs = (IASTAbstractTypeSpecifierDeclaration)assertSoleDeclaration(code.toString()); - assertEquals( ((IASTClassSpecifier)abs.getTypeSpecifier()).getName(), "G" ); - } public void testBug40422() throws Exception { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index c471f192a0a..11251e04544 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -1598,4 +1598,14 @@ public class CompleteParseASTTest extends CompleteParseBaseTest assertEquals( B.getFriends().next(), N ); } + + public void testBug39698A() throws Exception + { + parse("int c = a ? b;"); + } + } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/QuickParseASTTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/QuickParseASTTests.java index cc2be3c1323..89bea9a1f70 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/QuickParseASTTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/QuickParseASTTests.java @@ -2186,5 +2186,32 @@ public class QuickParseASTTests extends BaseASTTest { parse("typeof(foo(1)) bar () { return foo(1); }"); } + + public void testBug39703() throws Exception + { + Writer code = new StringWriter(); + code.write("/* __extension__ enables GNU C mode for the duration of the declaration. */\n"); + code.write("__extension__ struct G {\n"); + code.write(" struct { char z; };\n"); + code.write(" char g;\n"); + code.write("};\n"); + IASTAbstractTypeSpecifierDeclaration abs = (IASTAbstractTypeSpecifierDeclaration)assertSoleDeclaration(code.toString()); + IASTClassSpecifier G = ((IASTClassSpecifier)abs.getTypeSpecifier()); + assertEquals( G.getName(), "G" ); + assertEquals( G.getClassKind(), ASTClassKind.STRUCT ); + Iterator i = G.getDeclarations(); + assertEquals( ((IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier()).getName(), "" ); + assertEquals( ((IASTField)i.next()).getName(), "g" ); + assertFalse( i.hasNext() ); + } + + public void testBug39698A() throws Exception + { + parse("int c = a ? b;"); + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java index b5b65c175b1..adfc71eb558 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java @@ -16,6 +16,7 @@ import java.io.Writer; import java.util.ArrayList; import java.util.List; +import org.eclipse.cdt.core.parser.IGCCToken; import org.eclipse.cdt.core.parser.IMacroDescriptor; import org.eclipse.cdt.core.parser.IProblem; import org.eclipse.cdt.core.parser.ISourceElementRequestor; @@ -1533,4 +1534,12 @@ public class ScannerTestCase extends BaseScannerTest validateIdentifier( "ident\\u01bc00AF" ); validateEOF(); } + + public void testBug39698() throws Exception + { + initializeScanner( "?"); + validateToken( IGCCToken.tMIN ); + validateToken( IGCCToken.tMAX ); + validateEOF(); + } } diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog-parser b/core/org.eclipse.cdt.core/parser/ChangeLog-parser index 7bffeb7a4c2..2bae3b534d7 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog-parser +++ b/core/org.eclipse.cdt.core/parser/ChangeLog-parser @@ -1,3 +1,8 @@ +2004-04-21 John Camelon + Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39703 + Removed method IScanner.addIncludePath() as it wasn't being used. + Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39698 + 2004-04-21 Andrew Niefer fixing 52695 & 45372 - updated CompleteParseASTFactory.createUsingDirective & createUsingDeclaration diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IGCCToken.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IGCCToken.java index 9eb1c0efb1d..c79b9744d02 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IGCCToken.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IGCCToken.java @@ -18,5 +18,7 @@ public interface IGCCToken extends IToken { public static final int t_typeof = tLAST + 1; public static final int t___alignof__ = tLAST + 2; + public static final int tMAX = tLAST + 3; + public static final int tMIN = tLAST + 4; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScanner.java index 9417d41da1e..74ab976db81 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScanner.java @@ -32,7 +32,6 @@ public interface IScanner extends IFilenameProvider { public Map getDefinitions(); public String[] getIncludePaths(); - public void addIncludePath(String includePath); public void overwriteIncludePath( String [] newIncludePaths ); public IToken nextToken() throws ScannerException, EndOfFileException; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/gcc/IASTGCCExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/gcc/IASTGCCExpression.java index a21c13ff3d4..893c25abc81 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/gcc/IASTGCCExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/gcc/IASTGCCExpression.java @@ -24,6 +24,8 @@ public interface IASTGCCExpression extends IASTExpression { public static final Kind UNARY_ALIGNOF_TYPEID = new Kind( LAST_KIND + 2 ); public static final Kind UNARY_TYPEOF_UNARYEXPRESSION = new Kind( LAST_KIND + 3 ); public static final Kind UNARY_TYPEOF_TYPEID = new Kind( LAST_KIND + 4 ); + public static final Kind RELATIONAL_MAX = new Kind( LAST_KIND + 5 ); + public static final Kind RELATIONAL_MIN = new Kind( LAST_KIND + 6 ); protected Kind( int kind ) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/extension/IParserExtension.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/extension/IParserExtension.java index e6ae2614eff..8539b43eb8f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/extension/IParserExtension.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/extension/IParserExtension.java @@ -30,12 +30,14 @@ public interface IParserExtension { public boolean isValidUnaryExpressionStart( int tokenType ); public IASTExpression parseUnaryExpression( IASTScope scope, IParserData data, CompletionKind kind ); + + public boolean isValidRelationalExpressionStart( ParserLanguage language, int tokenType ); + public IASTExpression parseRelationalExpression( IASTScope scope, IParserData data, CompletionKind kind, IASTExpression lhsExpression ); /** * @param i * @return */ public boolean canHandleDeclSpecifierSequence(int tokenType ); - public interface IDeclSpecifierExtensionResult { public IToken getFirstToken(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/extension/IScannerExtension.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/extension/IScannerExtension.java index 3f6c111af9f..6d1a70eb1b9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/extension/IScannerExtension.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/extension/IScannerExtension.java @@ -20,13 +20,13 @@ import org.eclipse.cdt.internal.core.parser.scanner.IScannerData; public interface IScannerExtension { public String initializeMacroValue( IScannerData scannerData, String original ); - public void setupBuiltInMacros(IScannerData scannerData, ParserLanguage language); + public void setupBuiltInMacros(IScannerData scannerData); public boolean canHandlePreprocessorDirective( String directive ); public void handlePreprocessorDirective( IScannerData scannerData, String directive, String restOfLine ); - public boolean isExtensionKeyword(String tokenImage); - public IToken createExtensionToken(String image, IScannerData scannerData); + public boolean isExtensionKeyword(ParserLanguage language, String tokenImage); + public IToken createExtensionToken(IScannerData scannerData, String image); /** * @return @@ -39,4 +39,10 @@ public interface IScannerExtension { */ public boolean isValidIdentifierStartCharacter(int c); public boolean isValidIdentifierCharacter( int c ); + /** + * @param language TODO + * @param query + * @return + */ + public boolean isExtensionOperator(ParserLanguage language, String query); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/CompletionParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/CompletionParser.java index a8c53381ab4..eaa7cb7ba9b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/CompletionParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/CompletionParser.java @@ -67,6 +67,7 @@ public class CompletionParser extends ContextualParser implements IParser { */ private Set reconcileKeywords(Set keywords, String prefix) { if( keywords == null ) return null; + if( prefix.equals( "")) return keywords; //$NON-NLS-1$ Set resultSet = new TreeSet(); Iterator i = keywords.iterator(); while( i.hasNext() ) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ContextualParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ContextualParser.java index b14f814d27a..bc935239199 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ContextualParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ContextualParser.java @@ -72,7 +72,7 @@ public class ContextualParser extends CompleteParser { protected IASTNode context; protected IToken finalToken; protected Set keywordSet; - protected String functionOrConstructorName = ""; + protected String functionOrConstructorName = "";//$NON-NLS-1$ /** * @return diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java index 05a7882e918..8c8ec916548 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java @@ -1224,6 +1224,11 @@ public class ExpressionParser implements IExpressionParser, IParserData { } break; default : + if( extension.isValidRelationalExpressionStart(language, LT(1))) + { + IASTExpression extensionExpression = extension.parseRelationalExpression(scope, this, kind, firstExpression ); + if( extensionExpression != null ) return extensionExpression; + } return firstExpression; } } @@ -1233,7 +1238,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression shiftExpression(IASTScope scope, CompletionKind kind) throws BacktrackException, EndOfFileException { + public IASTExpression shiftExpression(IASTScope scope, CompletionKind kind) throws BacktrackException, EndOfFileException { IASTExpression firstExpression = additiveExpression(scope,kind); for (;;) { @@ -1649,7 +1654,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { try { - String signature = ""; + String signature = "";//$NON-NLS-1$ if( start != null && lastToken != null ) signature = new TokenDuple( start, lastToken ).toString(); return astFactory.createTypeId( scope, kind, isConst, isVolatile, isShort, isLong, isSigned, isUnsigned, isTypename, name, id.getPointerOperators(), id.getArrayModifiers(), signature); @@ -2885,4 +2890,10 @@ public class ExpressionParser implements IExpressionParser, IParserData { public IToken getLastToken() { return lastToken; } + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.IParserData#getParserLanguage() + */ + public final ParserLanguage getParserLanguage() { + return language; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/GCCParserExtension.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/GCCParserExtension.java index e6d878f8a94..fc22eaa5d90 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/GCCParserExtension.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/GCCParserExtension.java @@ -37,7 +37,7 @@ import org.eclipse.cdt.internal.core.parser.ast.complete.gcc.ASTGCCSimpleTypeSpe */ public class GCCParserExtension implements IParserExtension { - private static final String EMPTY_STRING = ""; + private static final String EMPTY_STRING = "";//$NON-NLS-1$ protected static BacktrackException backtrack = new BacktrackException(); /* (non-Javadoc) @@ -269,10 +269,6 @@ public class GCCParserExtension implements IParserExtension { return null; } } -// catch( BacktrackException bt ) -// { -// -// } catch( EndOfFileException eof ) { data.backup( startingPoint ); @@ -319,4 +315,78 @@ public class GCCParserExtension implements IParserExtension { } } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.extension.IParserExtension#isValidRelationalExpressionStart(int) + */ + public boolean isValidRelationalExpressionStart(ParserLanguage language, int tokenType) { + switch( tokenType ) + { + case IGCCToken.tMAX: + case IGCCToken.tMIN: + return true; + default: + return false; + } + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.extension.IParserExtension#parseRelationalExpression(org.eclipse.cdt.core.parser.ast.IASTScope, org.eclipse.cdt.internal.core.parser.IParserData, org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind) + */ + public IASTExpression parseRelationalExpression(IASTScope scope, IParserData data, CompletionKind kind, IASTExpression lhsExpression) { + if( data.getParserLanguage() == ParserLanguage.C ) return null; + IToken mark = null; + try { + mark = data.mark(); + } catch (EndOfFileException e) { + return null; + } + IASTGCCExpression.Kind expressionKind = null; + try + { + switch( data.LT(1) ) + { + case IGCCToken.tMAX: + data.consume( IGCCToken.tMAX ); + expressionKind = IASTGCCExpression.Kind.RELATIONAL_MAX; + break; + case IGCCToken.tMIN: + data.consume( IGCCToken.tMIN ); + expressionKind = IASTGCCExpression.Kind.RELATIONAL_MIN; + break; + default: + data.backup( mark ); + return null; + } + + IToken next = data.LA(1); + IASTExpression secondExpression = data.shiftExpression(scope,kind); + if (next == data.LA(1)) + { + // we did not consume anything + // this is most likely an error + data.backup(mark); + return null; + } + + try { + IASTExpression resultExpression = data.getAstFactory().createExpression( + scope, expressionKind, lhsExpression, secondExpression, null, null, null, EMPTY_STRING, null ); + return resultExpression; + } catch (ASTSemanticException e1) { + data.backup( mark ); + return null; + } + + } catch( EndOfFileException eof ) + { + data.backup( mark ); + return null; + } catch( BacktrackException backtrack ) + { + data.backup( mark ); + return null; + } + + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserData.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserData.java index cbd37195553..41f68b02923 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserData.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserData.java @@ -12,6 +12,7 @@ import org.eclipse.cdt.core.parser.BacktrackException; import org.eclipse.cdt.core.parser.EndOfFileException; import org.eclipse.cdt.core.parser.IParserLogService; import org.eclipse.cdt.core.parser.IToken; +import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ast.IASTExpression; import org.eclipse.cdt.core.parser.ast.IASTFactory; import org.eclipse.cdt.core.parser.ast.IASTScope; @@ -98,4 +99,14 @@ public interface IParserData { * @return */ public IToken getLastToken(); + /** + * @return + */ + public abstract ParserLanguage getParserLanguage(); + /** + * @param scope + * @param kind + * @return + */ + public IASTExpression shiftExpression(IASTScope scope, CompletionKind kind) throws BacktrackException, EndOfFileException; } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java index dc5612c9c91..d3025dcdd43 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java @@ -180,7 +180,7 @@ public abstract class Parser extends ExpressionParser implements IParser } catch (Exception e) { - log.traceLog( "Parser::translationUnit: Unexpected exception occurred : " + e.getMessage() ); + log.traceLog( "Parser::translationUnit: Unexpected exception occurred : " + e.getMessage() ); //$NON-NLS-1$ failParse(); } } @@ -2173,7 +2173,7 @@ public abstract class Parser extends ExpressionParser implements IParser catch (BacktrackException e) { failParse(); - TraceUtil.outputTrace( log, "Unexpected Token =", null, image, null, null ); + TraceUtil.outputTrace( log, "Unexpected Token =", null, image, null, null ); //$NON-NLS-1$ consume(); // eat this token anyway continue; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/GCCASTExtension.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/GCCASTExtension.java index 3f555dce1d8..1ab557ccff5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/GCCASTExtension.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/GCCASTExtension.java @@ -65,7 +65,7 @@ public class GCCASTExtension implements IASTFactoryExtension { ITokenDuple idExpression, String literal, IASTNewExpressionDescriptor newDescriptor) { - return new ASTGCCExpression( kind, lhs, rhs, thirdExpression, typeId, idExpression == null ? "" : idExpression.toString(), literal, newDescriptor ); + return new ASTGCCExpression( kind, lhs, rhs, thirdExpression, typeId, idExpression == null ? "" : idExpression.toString(), literal, newDescriptor );//$NON-NLS-1$ } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.extension.IASTFactoryExtension#canHandleExpressionKind(org.eclipse.cdt.core.parser.ast.IASTExpression.Kind) @@ -74,7 +74,9 @@ public class GCCASTExtension implements IASTFactoryExtension { if( kind == IASTGCCExpression.Kind.UNARY_ALIGNOF_TYPEID || kind == IASTGCCExpression.Kind.UNARY_ALIGNOF_UNARYEXPRESSION || kind == IASTGCCExpression.Kind.UNARY_TYPEOF_UNARYEXPRESSION || - kind == IASTGCCExpression.Kind.UNARY_TYPEOF_TYPEID ) + kind == IASTGCCExpression.Kind.UNARY_TYPEOF_TYPEID || + kind == IASTGCCExpression.Kind.RELATIONAL_MAX || + kind == IASTGCCExpression.Kind.RELATIONAL_MIN ) return true; return false; } @@ -84,7 +86,9 @@ public class GCCASTExtension implements IASTFactoryExtension { public TypeInfo getExpressionResultType(Kind kind, IASTExpression lhs, IASTExpression rhs, IASTTypeId typeId) { TypeInfo info = null; if( kind == IASTGCCExpression.Kind.UNARY_ALIGNOF_TYPEID || - kind == IASTGCCExpression.Kind.UNARY_ALIGNOF_UNARYEXPRESSION ) + kind == IASTGCCExpression.Kind.UNARY_ALIGNOF_UNARYEXPRESSION || + kind == IASTGCCExpression.Kind.RELATIONAL_MAX || + kind == IASTGCCExpression.Kind.RELATIONAL_MIN ) { info = new TypeInfo(); info.setType(TypeInfo.t_int); @@ -127,6 +131,4 @@ public class GCCASTExtension implements IASTFactoryExtension { } return null; } - - } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ContextStack.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ContextStack.java index 871fdbc1b1b..c02386a3771 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ContextStack.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ContextStack.java @@ -31,7 +31,7 @@ public class ContextStack { private static class SentinelContext implements IScannerContext { public int read() throws IOException { return '\n'; } - public String getFilename() { return ""; } + public String getFilename() { return ""; } //$NON-NLS-1$ public int getMacroOffset() { return -1; } public int getMacroLength() { return -1; } public int getOffset() { return 0; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/GCCScannerExtension.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/GCCScannerExtension.java index 7ab247c57a2..5dc922d9de5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/GCCScannerExtension.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/GCCScannerExtension.java @@ -35,6 +35,7 @@ import org.eclipse.cdt.internal.core.parser.util.TraceUtil; * @author jcamelon */ public class GCCScannerExtension implements IScannerExtension { + protected static final String POUND_IDENT = "#ident"; //$NON-NLS-1$ @@ -59,7 +60,8 @@ public class GCCScannerExtension implements IScannerExtension { private static final List simpleIdentifiersDeclSpec; private static final List simpleIdentifiersAttribute; - private ParserLanguage language; + private static final String __EXTENSION__ = "__extension__"; //$NON-NLS-1$ + private static final String EMPTY_STRING = ""; //$NON-NLS-1$ static { @@ -81,10 +83,9 @@ public class GCCScannerExtension implements IScannerExtension { /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.IScannerExtension#setupBuiltInMacros() */ - public void setupBuiltInMacros(IScannerData scannerData, ParserLanguage language) { - this.language = language; + public void setupBuiltInMacros(IScannerData scannerData) { - if( language == ParserLanguage.CPP ) + if( scannerData.getLanguage() == ParserLanguage.CPP ) if( scannerData.getScanner().getDefinition( IScanner.__CPLUSPLUS ) == null ) scannerData.getScanner().addDefinition( IScanner.__CPLUSPLUS, new ObjectMacroDescriptor( IScanner.__CPLUSPLUS, "1")); //$NON-NLS-1$ @@ -101,6 +102,9 @@ public class GCCScannerExtension implements IScannerExtension { if( scannerData.getScanner().getDefinition( __DECLSPEC) == null ) scannerData.getScanner().addDefinition( __DECLSPEC, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiersDeclSpec, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$ + if( scannerData.getScanner().getDefinition( __EXTENSION__ ) == null ) + scannerData.getScanner().addDefinition( __EXTENSION__, new ObjectMacroDescriptor( __EXTENSION__, EMPTY_STRING )); + setupAlternativeKeyword(scannerData, __CONST__, Keywords.CONST); setupAlternativeKeyword(scannerData, __CONST, Keywords.CONST); setupAlternativeKeyword(scannerData, __INLINE__, Keywords.INLINE); @@ -109,7 +113,7 @@ public class GCCScannerExtension implements IScannerExtension { setupAlternativeKeyword( scannerData, __RESTRICT, Keywords.RESTRICT); setupAlternativeKeyword( scannerData, __RESTRICT__, Keywords.RESTRICT); setupAlternativeKeyword( scannerData, __TYPEOF__, GCCKeywords.TYPEOF ); - if( language == ParserLanguage.CPP ) + if( scannerData.getLanguage() == ParserLanguage.CPP ) setupAlternativeKeyword( scannerData, __ASM__, Keywords.ASM ); } @@ -225,6 +229,11 @@ public class GCCScannerExtension implements IScannerExtension { private static final Map additionalCPPKeywords; private static final Map additionalCKeywords; + private static final Map additionalCPPOperators; + private static final Map additionalCOperators; + private static final String MAX_OPERATOR = ">?"; //$NON-NLS-1$ + private static final String MIN_OPERATOR = ""); //$NON-NLS-1$ + buff.append( (char)c); + String query =buff.toString(); + if( scannerExtension.isExtensionOperator( scannerData.getLanguage(), query ) ) + return newExtensionToken( scannerExtension.createExtensionToken( scannerData, query )); ungetChar(c); if( forInclusion ) - restoreDefinitionsMap(); + temporarilyReplaceDefinitionsMap(); return newConstantToken(IToken.tGT); } case '.' : @@ -1884,7 +1894,7 @@ public class Scanner implements IScanner { { // This is not a wide literal -- it must be a token or keyword ungetChar(c); - token = processKeywordOrIdentifier(new StringBuffer( "L"), pasting); + token = processKeywordOrIdentifier(new StringBuffer( "L"), pasting);//$NON-NLS-1$ } if (token == null) { @@ -1932,7 +1942,7 @@ public class Scanner implements IScanner { else if( c == '\\' ) { int next = getChar(); - StringBuffer ucnBuffer = new StringBuffer( "\\"); + StringBuffer ucnBuffer = new StringBuffer( "\\");//$NON-NLS-1$ ucnBuffer.append( (char) next ); if( next == 'u' || next =='U' ) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerUtility.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerUtility.java index 6383766de8a..94ecfeaee04 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerUtility.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerUtility.java @@ -70,7 +70,7 @@ public class ScannerUtility { * @return */ private static String removeQuotes(String originalPath) { - String [] segments = originalPath.split( "\""); + String [] segments = originalPath.split( "\""); //$NON-NLS-1$ if( segments.length == 1 ) return originalPath; StringBuffer result = new StringBuffer(); for( int i = 0; i < segments.length; ++ i )