From fb57293d470c0087b6edd9673084d38ceb95e5c2 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Wed, 2 Jun 2004 23:14:20 +0000 Subject: [PATCH] Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=52988
Moved KeywordSets.Key to its own class and thus removing the dependency between the Scanner/Parser to the static Keyword Set tables (improves footprint).
Updated CompletionEngine to not set the parser timeout if the value entered is <= 0 (to allow for easier debugging and profiling). --- .../parser/tests/CompletionParseTest.java | 50 ++++++ .../parser/extension/IParserExtension.java | 8 +- .../core/parser/CompletionParser.java | 8 +- .../core/parser/ContextualParser.java | 16 +- .../core/parser/ExpressionParser.java | 111 ++++++------ .../core/parser/GCCParserExtension.java | 15 +- .../core/parser/IExpressionParser.java | 4 +- .../cdt/internal/core/parser/IParserData.java | 7 +- .../cdt/internal/core/parser/Parser.java | 164 +++++++++--------- .../internal/core/parser/scanner/Scanner.java | 9 +- .../core/parser/token/KeywordSetKey.java | 37 ++++ .../core/parser/token/KeywordSets.java | 94 +++++----- .../text/contentassist/CompletionEngine.java | 3 +- 13 files changed, 314 insertions(+), 212 deletions(-) create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSetKey.java diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java index 3fb746bccb6..a40bd8b7b8e 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java @@ -29,6 +29,8 @@ import org.eclipse.cdt.core.parser.ast.IASTVariable; import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind; import org.eclipse.cdt.core.parser.ast.IASTNode.ILookupResult; import org.eclipse.cdt.core.parser.ast.IASTNode.LookupKind; +import org.eclipse.cdt.internal.core.parser.token.KeywordSetKey; +import org.eclipse.cdt.internal.core.parser.token.KeywordSets; /** * @author jcamelon @@ -1146,4 +1148,52 @@ public class CompletionParseTest extends CompletionParseBaseTest { assertNotNull( result ); assertEquals( result.getResultsSize(), 3 ); } + + public void testBug52988() throws Exception + { + for( int i = 0; i < 2; ++i ) + { + ParserLanguage language = ( i == 0 ) ? ParserLanguage.C : ParserLanguage.CPP; + String code = "void foo() { "; //$NON-NLS-1$ + Set kset = KeywordSets.getKeywords( KeywordSetKey.STATEMENT, language ); + + validateAllKeywordsAndPrefixes( code, kset, language ); + } + } + + /** + * @param startingCode + * @param keywordsToTry + * @param language + * @throws Exception + */ + private void validateAllKeywordsAndPrefixes(String startingCode, Set keywordsToTry, ParserLanguage language) throws Exception { + Iterator keywordIterator = keywordsToTry.iterator(); + while( keywordIterator.hasNext() ) + { + String keyword = (String) keywordIterator.next(); + for( int i = 0; i < keyword.length(); ++i ) + { + String substring = keyword.subSequence( 0, i ).toString(); + String totalCode = (startingCode + substring); + IASTCompletionNode node = parse( totalCode, totalCode.length() - 1, language ); + assertNotNull( node ); + assertTrue( "Failure on keyword=" + keyword + " prefix=" + substring, setContainsKeyword( node.getKeywords(), keyword )); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + } + + /** + * @param keywords + * @param keyword + * @return + */ + private boolean setContainsKeyword(Iterator keywords, String keyword) { + while( keywords.hasNext() ) + { + if( keywords.next().equals( keyword )) return true; + } + return false; + } } 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 45c9702a417..06789b9797f 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 @@ -20,7 +20,7 @@ import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind; import org.eclipse.cdt.internal.core.parser.DeclarationWrapper; import org.eclipse.cdt.internal.core.parser.IParserData; import org.eclipse.cdt.internal.core.parser.Parser; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets.Key; +import org.eclipse.cdt.internal.core.parser.token.KeywordSetKey; /** @@ -32,10 +32,10 @@ public interface IParserExtension { public ASTPointerOperator getPointerOperator( ParserLanguage language, int tokenType ); public boolean isValidUnaryExpressionStart( int tokenType ); - public IASTExpression parseUnaryExpression( IASTScope scope, IParserData data, CompletionKind kind, Key key ); + public IASTExpression parseUnaryExpression( IASTScope scope, IParserData data, CompletionKind kind, KeywordSetKey key ); public boolean isValidRelationalExpressionStart( ParserLanguage language, int tokenType ); - public IASTExpression parseRelationalExpression( IASTScope scope, IParserData data, CompletionKind kind, Key key, IASTExpression lhsExpression ); + public IASTExpression parseRelationalExpression( IASTScope scope, IParserData data, CompletionKind kind, KeywordSetKey key, IASTExpression lhsExpression ); /** * @param i * @return @@ -55,7 +55,7 @@ public interface IParserExtension { * @param key TODO * @return TODO */ - public IDeclSpecifierExtensionResult parseDeclSpecifierSequence(IParserData parser, Parser.Flags flags, DeclarationWrapper sdw, CompletionKind kind, Key key ); + public IDeclSpecifierExtensionResult parseDeclSpecifierSequence(IParserData parser, Parser.Flags flags, DeclarationWrapper sdw, CompletionKind kind, KeywordSetKey key ); /** * @param i * @return 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 b8d97ef2033..603c340030c 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 @@ -33,7 +33,7 @@ import org.eclipse.cdt.core.parser.ast.IASTScope; import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind; import org.eclipse.cdt.core.parser.extension.IParserExtension; import org.eclipse.cdt.internal.core.parser.ast.ASTCompletionNode; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets.Key; +import org.eclipse.cdt.internal.core.parser.token.KeywordSetKey; /** * @author jcamelon @@ -135,13 +135,13 @@ public class CompletionParser extends ContextualParser implements IParser { while (LT(1) == IToken.t_catch) { consume(IToken.t_catch); - setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,Key.EMPTY ); + setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,KeywordSetKey.EMPTY ); consume(IToken.tLPAREN); - setCompletionValues(scope,CompletionKind.EXCEPTION_REFERENCE,Key.DECL_SPECIFIER_SEQUENCE); + setCompletionValues(scope,CompletionKind.EXCEPTION_REFERENCE,KeywordSetKey.DECL_SPECIFIER_SEQUENCE); if( LT(1) == IToken.tELLIPSIS ) consume( IToken.tELLIPSIS ); else - simpleDeclarationStrategyUnion( scope, null, CompletionKind.EXCEPTION_REFERENCE, Key.DECLARATION); // was exceptionDeclaration + simpleDeclarationStrategyUnion( scope, null, CompletionKind.EXCEPTION_REFERENCE, KeywordSetKey.DECLARATION); // was exceptionDeclaration consume(IToken.tRPAREN); catchBlockCompoundStatement(scope); 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 d5294d0e8ff..dd43b138da4 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 @@ -28,9 +28,9 @@ import org.eclipse.cdt.core.parser.ast.IASTScope; import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind; import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind; import org.eclipse.cdt.core.parser.extension.IParserExtension; +import org.eclipse.cdt.internal.core.parser.token.KeywordSetKey; import org.eclipse.cdt.internal.core.parser.token.KeywordSets; import org.eclipse.cdt.internal.core.parser.token.TokenFactory; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets.Key; /** * @author jcamelon @@ -120,7 +120,7 @@ public class ContextualParser extends CompleteParser { - protected void setCompletionKeywords(KeywordSets.Key key) { + protected void setCompletionKeywords(KeywordSetKey key) { this.keywordSet = KeywordSets.getKeywords( key, language ); } @@ -128,18 +128,18 @@ public class ContextualParser extends CompleteParser { finalToken = token; } - protected void setCompletionValues(IASTScope scope, CompletionKind kind, Key key, IASTNode node, String prefix) throws EndOfFileException { + protected void setCompletionValues(IASTScope scope, CompletionKind kind, KeywordSetKey key, IASTNode node, String prefix) throws EndOfFileException { setCompletionToken( TokenFactory.createStandAloneToken( IToken.tIDENTIFIER, prefix ) ); setCompletionValues(scope, kind, key, node ); } - protected void setCompletionValues(IASTScope scope, CompletionKind kind, Key key) throws EndOfFileException { + protected void setCompletionValues(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException { setCompletionValues(scope, kind, key, null ); } - protected void setCompletionValues(IASTScope scope, CompletionKind kind, Key key, IASTNode node) throws EndOfFileException { + protected void setCompletionValues(IASTScope scope, CompletionKind kind, KeywordSetKey key, IASTNode node) throws EndOfFileException { setCompletionScope(scope); setCompletionKeywords(key); setCompletionKind(kind); @@ -150,7 +150,7 @@ public class ContextualParser extends CompleteParser { - protected void setCompletionValues( IASTScope scope, CompletionKind kind, IToken first, IToken last, Key key ) throws EndOfFileException{ + protected void setCompletionValues( IASTScope scope, CompletionKind kind, IToken first, IToken last, KeywordSetKey key ) throws EndOfFileException{ setCompletionScope( scope ); setCompletionKind( kind ); setCompletionKeywords(key); @@ -167,7 +167,7 @@ public class ContextualParser extends CompleteParser { - protected void setCompletionValues(IASTScope scope, CompletionKind kind, Key key, IASTExpression firstExpression, Kind expressionKind) throws EndOfFileException { + protected void setCompletionValues(IASTScope scope, CompletionKind kind, KeywordSetKey key, IASTExpression firstExpression, Kind expressionKind) throws EndOfFileException { IASTNode node = astFactory.expressionToMostPreciseASTNode( scope, firstExpression ); if( kind == CompletionKind.MEMBER_REFERENCE ) { @@ -250,7 +250,7 @@ public class ContextualParser extends CompleteParser { * @see org.eclipse.cdt.internal.core.parser.ExpressionParser#setCompletionValuesNoContext(org.eclipse.cdt.core.parser.ast.IASTScope, org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind, org.eclipse.cdt.internal.core.parser.token.KeywordSets.Key) */ protected void setCompletionValuesNoContext(IASTScope scope, - CompletionKind kind, Key key) throws EndOfFileException { + CompletionKind kind, KeywordSetKey key) throws EndOfFileException { setCompletionScope(scope); setCompletionKeywords(key); setCompletionKind(kind); 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 d5cd7d1183e..3b4b267b959 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 @@ -40,9 +40,8 @@ import org.eclipse.cdt.core.parser.ast.IASTTypeId; import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind; import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind; import org.eclipse.cdt.core.parser.extension.IParserExtension; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets; +import org.eclipse.cdt.internal.core.parser.token.KeywordSetKey; import org.eclipse.cdt.internal.core.parser.token.TokenFactory; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets.Key; import org.eclipse.cdt.internal.core.parser.util.TraceUtil; /** @@ -308,7 +307,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { if( ! completedArg ){ try{ - expression = assignmentExpression( scope, CompletionKind.VARIABLE_TYPE, Key.EXPRESSION ); + expression = assignmentExpression( scope, CompletionKind.VARIABLE_TYPE, KeywordSetKey.EXPRESSION ); if( expression.getExpressionKind() == IASTExpression.Kind.PRIMARY_EMPTY ){ throw backtrack; } @@ -320,7 +319,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { } if( !completedArg ){ try{ - ITokenDuple nameDuple = name( scope, null, Key.EMPTY ); + ITokenDuple nameDuple = name( scope, null, KeywordSetKey.EMPTY ); expression = astFactory.createExpression( scope, IASTExpression.Kind.ID_EXPRESSION, null, null, null, null, nameDuple, EMPTY_STRING, null); list.add( expression ); @@ -371,7 +370,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @throws BacktrackException request a backtrack */ protected IToken templateId(IASTScope scope, CompletionKind kind) throws EndOfFileException, BacktrackException { - ITokenDuple duple = name(scope, kind, Key.EMPTY ); + ITokenDuple duple = name(scope, kind, KeywordSetKey.EMPTY ); //IToken last = consumeTemplateParameters(duple.getLastToken()); return duple.getLastToken();//last; } @@ -389,7 +388,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param key TODO * @throws BacktrackException request a backtrack */ - protected ITokenDuple name(IASTScope scope, IASTCompletionNode.CompletionKind kind, Key key ) throws BacktrackException, EndOfFileException { + protected ITokenDuple name(IASTScope scope, IASTCompletionNode.CompletionKind kind, KeywordSetKey key ) throws BacktrackException, EndOfFileException { TemplateParameterManager argumentList = TemplateParameterManager.getInstance(); @@ -406,7 +405,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { if (LT(1) == IToken.tCOLONCOLON){ argumentList.addSegment( null ); last = consume( IToken.tCOLONCOLON ); - setCompletionValues( scope, kind, Key.EMPTY, getCompliationUnit() ); + setCompletionValues( scope, kind, KeywordSetKey.EMPTY, getCompliationUnit() ); startsWithColonColon = true; } @@ -421,7 +420,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { if( startsWithColonColon ) setCompletionValues( scope, kind, getCompliationUnit() ); else if( prev != null ) - setCompletionValues(scope, kind, first, prev, Key.EMPTY ); + setCompletionValues(scope, kind, first, prev, KeywordSetKey.EMPTY ); else setCompletionValuesNoContext(scope, kind, key ); @@ -439,7 +438,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { { IToken prev = last; last = consume(IToken.tCOLONCOLON); - setCompletionValues( scope, kind, first, prev, Key.EMPTY ); + setCompletionValues( scope, kind, first, prev, KeywordSetKey.EMPTY ); if (queryLookaheadCapability() && LT(1) == IToken.t_template) consume(); @@ -455,7 +454,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { case IToken.tIDENTIFIER : prev = last; last = consume(); - setCompletionValues( scope, kind, first, prev, Key.EMPTY ); + setCompletionValues( scope, kind, first, prev, KeywordSetKey.EMPTY ); last = consumeTemplateArguments(scope, last, argumentList, kind); if( last.getType() == IToken.tGT ) hasTemplateId = true; @@ -478,7 +477,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param kind * @param key */ - protected void setCompletionValuesNoContext(IASTScope scope, CompletionKind kind, Key key) throws EndOfFileException { + protected void setCompletionValuesNoContext(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException { } /** * @param tokenDuple @@ -514,7 +513,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param key * @param node */ - protected void setCompletionValues(IASTScope scope, CompletionKind kind, Key key, IASTNode node) throws EndOfFileException + protected void setCompletionValues(IASTScope scope, CompletionKind kind, KeywordSetKey key, IASTNode node) throws EndOfFileException { } @@ -604,7 +603,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { IASTExpression exp = null; if (LT(1) != IToken.tRBRACKET) { - exp = constantExpression(scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION ); + exp = constantExpression(scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION ); } consume(IToken.tRBRACKET); IASTArrayModifier arrayMod; @@ -719,7 +718,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { { try { - nameDuple = name(d.getScope(), CompletionKind.SINGLE_NAME_REFERENCE, Key.EMPTY ); + nameDuple = name(d.getScope(), CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EMPTY ); } catch( OffsetLimitReachedException olre ) { @@ -765,11 +764,11 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression constantExpression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException { + protected IASTExpression constantExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException { return conditionalExpression(scope,kind,key); } - public IASTExpression expression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException { + public IASTExpression expression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException { IASTExpression assignmentExpression = assignmentExpression(scope,kind,key); while (LT(1) == IToken.tCOMMA) { @@ -810,8 +809,8 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression assignmentExpression(IASTScope scope, CompletionKind kind, Key key) throws EndOfFileException, BacktrackException { - setCompletionValues(scope, kind, Key.EXPRESSION ); + protected IASTExpression assignmentExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException, BacktrackException { + setCompletionValues(scope, kind, key ); if (LT(1) == IToken.t_throw) { return throwExpression(scope,key); } @@ -885,9 +884,9 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression throwExpression(IASTScope scope, Key key) throws EndOfFileException, BacktrackException { + protected IASTExpression throwExpression(IASTScope scope, KeywordSetKey key) throws EndOfFileException, BacktrackException { consume(IToken.t_throw); - setCompletionValues( scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION ); + setCompletionValues( scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION ); IASTExpression throwExpression = null; try { @@ -922,7 +921,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @return * @throws BacktrackException */ - protected IASTExpression conditionalExpression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException { + protected IASTExpression conditionalExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException { IASTExpression firstExpression = logicalOrExpression(scope,kind,key); if (LT(1) == IToken.tQUESTION) { @@ -957,7 +956,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression logicalOrExpression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException { + protected IASTExpression logicalOrExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException { IASTExpression firstExpression = logicalAndExpression(scope,kind,key); while (LT(1) == IToken.tOR) { @@ -992,7 +991,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression logicalAndExpression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException { + protected IASTExpression logicalAndExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException { IASTExpression firstExpression = inclusiveOrExpression( scope,kind,key ); while (LT(1) == IToken.tAND) { @@ -1026,7 +1025,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression inclusiveOrExpression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException { + protected IASTExpression inclusiveOrExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException { IASTExpression firstExpression = exclusiveOrExpression(scope,kind,key); while (LT(1) == IToken.tBITOR) { @@ -1061,7 +1060,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression exclusiveOrExpression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException { + protected IASTExpression exclusiveOrExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException { IASTExpression firstExpression = andExpression( scope,kind, key ); while (LT(1) == IToken.tXOR) { @@ -1097,7 +1096,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression andExpression(IASTScope scope, CompletionKind kind, Key key) throws EndOfFileException, BacktrackException { + protected IASTExpression andExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException, BacktrackException { IASTExpression firstExpression = equalityExpression(scope,kind, key); while (LT(1) == IToken.tAMPER) { @@ -1153,7 +1152,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression equalityExpression(IASTScope scope, CompletionKind kind, Key key) throws EndOfFileException, BacktrackException { + protected IASTExpression equalityExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException, BacktrackException { IASTExpression firstExpression = relationalExpression(scope,kind,key); for (;;) { @@ -1198,7 +1197,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression relationalExpression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException { + protected IASTExpression relationalExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException { IASTExpression firstExpression = shiftExpression(scope,kind, key); for (;;) { @@ -1280,7 +1279,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - public IASTExpression shiftExpression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException { + public IASTExpression shiftExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException { IASTExpression firstExpression = additiveExpression(scope,kind,key); for (;;) { @@ -1324,7 +1323,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression additiveExpression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException { + protected IASTExpression additiveExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException { IASTExpression firstExpression = multiplicativeExpression( scope, kind, key ); for (;;) { @@ -1368,7 +1367,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression multiplicativeExpression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException { + protected IASTExpression multiplicativeExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException { IASTExpression firstExpression = pmExpression(scope,kind,key); for (;;) { @@ -1424,7 +1423,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression pmExpression(IASTScope scope, CompletionKind kind, Key key) throws EndOfFileException, BacktrackException { + protected IASTExpression pmExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException, BacktrackException { IASTExpression firstExpression = castExpression(scope,kind,key); for (;;) { @@ -1469,7 +1468,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * : unaryExpression * | "(" typeId ")" castExpression */ - protected IASTExpression castExpression(IASTScope scope, CompletionKind kind, Key key) throws EndOfFileException, BacktrackException { + protected IASTExpression castExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException, BacktrackException { // TO DO: we need proper symbol checkint to ensure type name if (LT(1) == IToken.tLPAREN) { @@ -1552,7 +1551,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { { try { - name = name(scope, completionKind, Key.DECL_SPECIFIER_SEQUENCE ); + name = name(scope, completionKind, KeywordSetKey.DECL_SPECIFIER_SEQUENCE ); kind = IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME; break; } @@ -1599,7 +1598,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { case IToken.tIDENTIFIER : if( encounteredType ) break simpleMods; encounteredType = true; - name = name(scope, completionKind, Key.EMPTY ); + name = name(scope, completionKind, KeywordSetKey.EMPTY ); kind = IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME; break; @@ -1683,7 +1682,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { consume(); try { - name = name(scope, completionKind, Key.EMPTY ); + name = name(scope, completionKind, KeywordSetKey.EMPTY ); kind = IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME; } catch( BacktrackException b ) { @@ -1744,7 +1743,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression deleteExpression(IASTScope scope, CompletionKind kind, Key key) throws EndOfFileException, BacktrackException { + protected IASTExpression deleteExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException, BacktrackException { if (LT(1) == IToken.tCOLONCOLON) { // global scope @@ -1801,8 +1800,8 @@ public class ExpressionParser implements IExpressionParser, IParserData { * directnewdeclarator [ constantexpression ] * newinitializer: ( expressionlist? ) */ - protected IASTExpression newExpression(IASTScope scope, Key key) throws BacktrackException, EndOfFileException { - setCompletionValues(scope, CompletionKind.NEW_TYPE_REFERENCE, Key.EMPTY); + protected IASTExpression newExpression(IASTScope scope, KeywordSetKey key) throws BacktrackException, EndOfFileException { + setCompletionValues(scope, CompletionKind.NEW_TYPE_REFERENCE, KeywordSetKey.EMPTY); if (LT(1) == IToken.tCOLONCOLON) { // global scope @@ -1913,7 +1912,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { // new-expression ends here. try { - setCompletionValues(scope, CompletionKind.NO_SUCH_KIND, Key.EMPTY); + setCompletionValues(scope, CompletionKind.NO_SUCH_KIND, KeywordSetKey.EMPTY); return astFactory.createExpression( scope, IASTExpression.Kind.NEW_TYPEID, null, null, null, typeId, null, @@ -1973,7 +1972,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { consume(IToken.tRPAREN); if( templateIdScopes != null ){ templateIdScopes.pop(); } } - setCompletionValues(scope, CompletionKind.NO_SUCH_KIND, Key.EMPTY); + setCompletionValues(scope, CompletionKind.NO_SUCH_KIND, KeywordSetKey.EMPTY); try { return astFactory.createExpression( @@ -2002,7 +2001,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - public IASTExpression unaryExpression(IASTScope scope, CompletionKind kind, Key key) throws EndOfFileException, BacktrackException { + public IASTExpression unaryExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException, BacktrackException { switch (LT(1)) { case IToken.tSTAR : @@ -2130,16 +2129,16 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression postfixExpression(IASTScope scope, CompletionKind kind, Key key) throws EndOfFileException, BacktrackException { + protected IASTExpression postfixExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException, BacktrackException { IASTExpression firstExpression = null; boolean isTemplate = false; - setCompletionValues( scope, kind, Key.EXPRESSION ); + setCompletionValues( scope, kind, key ); switch (LT(1)) { case IToken.t_typename : consume(IToken.t_typename); - ITokenDuple nestedName = name(scope, CompletionKind.TYPE_REFERENCE, Key.EMPTY); + ITokenDuple nestedName = name(scope, CompletionKind.TYPE_REFERENCE, KeywordSetKey.EMPTY); boolean templateTokenConsumed = false; if( LT(1) == IToken.t_template ) { @@ -2440,7 +2439,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { ? IASTExpression.Kind.POSTFIX_DOT_TEMPL_IDEXPRESS : IASTExpression.Kind.POSTFIX_DOT_IDEXPRESSION); - setCompletionValues(scope, CompletionKind.MEMBER_REFERENCE, KeywordSets.Key.EMPTY, firstExpression, memberCompletionKind ); + setCompletionValues(scope, CompletionKind.MEMBER_REFERENCE, KeywordSetKey.EMPTY, firstExpression, memberCompletionKind ); secondExpression = primaryExpression(scope, CompletionKind.MEMBER_REFERENCE, key); if( secondExpression != null && secondExpression.getExpressionKind() == Kind.ID_EXPRESSION && secondExpression.getIdExpression().indexOf( '~') != -1 ) memberCompletionKind = Kind.POSTFIX_DOT_DESTRUCTOR; @@ -2482,7 +2481,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { ? IASTExpression.Kind.POSTFIX_ARROW_TEMPL_IDEXP : IASTExpression.Kind.POSTFIX_ARROW_IDEXPRESSION); - setCompletionValues(scope, CompletionKind.MEMBER_REFERENCE, KeywordSets.Key.EMPTY, firstExpression, arrowCompletionKind ); + setCompletionValues(scope, CompletionKind.MEMBER_REFERENCE, KeywordSetKey.EMPTY, firstExpression, arrowCompletionKind ); secondExpression = primaryExpression(scope, CompletionKind.MEMBER_REFERENCE, key); if( secondExpression != null && secondExpression.getExpressionKind() == Kind.ID_EXPRESSION && secondExpression.getIdExpression().indexOf( '~') != -1 ) @@ -2541,7 +2540,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { LA(1); } - protected IASTExpression simpleTypeConstructorExpression(IASTScope scope, Kind type, Key key ) throws EndOfFileException, BacktrackException { + protected IASTExpression simpleTypeConstructorExpression(IASTScope scope, Kind type, KeywordSetKey key ) throws EndOfFileException, BacktrackException { String typeName = consume().getImage(); consume(IToken.tLPAREN); setCurrentFunctionName( typeName ); @@ -2574,7 +2573,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @param expression * @throws BacktrackException */ - protected IASTExpression primaryExpression(IASTScope scope, CompletionKind kind, Key key) throws EndOfFileException, BacktrackException { + protected IASTExpression primaryExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException, BacktrackException { IToken t = null; switch (LT(1)) { @@ -2857,7 +2856,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { throw new EndOfFileException(); } - protected IASTExpression assignmentOperatorExpression(IASTScope scope, IASTExpression.Kind kind, IASTExpression lhs, CompletionKind completionKind, Key key) throws EndOfFileException, BacktrackException { + protected IASTExpression assignmentOperatorExpression(IASTScope scope, IASTExpression.Kind kind, IASTExpression lhs, CompletionKind completionKind, KeywordSetKey key) throws EndOfFileException, BacktrackException { consume(); IASTExpression assignmentExpression = assignmentExpression(scope,completionKind, key); @@ -2882,20 +2881,20 @@ public class ExpressionParser implements IExpressionParser, IParserData { } } - protected void setCompletionValues(IASTScope scope, IASTCompletionNode.CompletionKind kind, KeywordSets.Key key) throws EndOfFileException { + protected void setCompletionValues(IASTScope scope, IASTCompletionNode.CompletionKind kind, KeywordSetKey key) throws EndOfFileException { } - protected void setCompletionValues(IASTScope scope, IASTCompletionNode.CompletionKind kind, KeywordSets.Key key, IASTNode node, String prefix) throws EndOfFileException { + protected void setCompletionValues(IASTScope scope, IASTCompletionNode.CompletionKind kind, KeywordSetKey key, IASTNode node, String prefix) throws EndOfFileException { } - protected void setCompletionValues(IASTScope scope, CompletionKind kind, Key key, IASTExpression firstExpression, Kind expressionKind) throws EndOfFileException { + protected void setCompletionValues(IASTScope scope, CompletionKind kind, KeywordSetKey key, IASTExpression firstExpression, Kind expressionKind) throws EndOfFileException { } - protected void setCompletionValues( IASTScope scope, CompletionKind kind, IToken first, IToken last, Key key ) throws EndOfFileException { + protected void setCompletionValues( IASTScope scope, CompletionKind kind, IToken first, IToken last, KeywordSetKey key ) throws EndOfFileException { } - protected IASTExpression unaryOperatorCastExpression(IASTScope scope, IASTExpression.Kind kind, CompletionKind completionKind, Key key) throws EndOfFileException, BacktrackException { + protected IASTExpression unaryOperatorCastExpression(IASTScope scope, IASTExpression.Kind kind, CompletionKind completionKind, KeywordSetKey key) throws EndOfFileException, BacktrackException { IASTExpression castExpression = castExpression(scope,completionKind,key); try { @@ -2918,7 +2917,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { } } - protected IASTExpression specialCastExpression(IASTScope scope, IASTExpression.Kind kind, Key key) throws EndOfFileException, BacktrackException { + protected IASTExpression specialCastExpression(IASTScope scope, IASTExpression.Kind kind, KeywordSetKey key) throws EndOfFileException, BacktrackException { consume(); consume(IToken.tLT); IASTTypeId duple = typeId(scope, false, CompletionKind.TYPE_REFERENCE); 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 41b7205d8c8..021c09875cc 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 @@ -32,8 +32,7 @@ import org.eclipse.cdt.core.parser.ast.gcc.IASTGCCExpression; import org.eclipse.cdt.core.parser.ast.gcc.IASTGCCSimpleTypeSpecifier; import org.eclipse.cdt.core.parser.extension.IParserExtension; import org.eclipse.cdt.internal.core.parser.Parser.Flags; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets.Key; +import org.eclipse.cdt.internal.core.parser.token.KeywordSetKey; /** @@ -78,7 +77,7 @@ public class GCCParserExtension implements IParserExtension { /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.extension.IParserExtension#parseUnaryExpression(org.eclipse.cdt.internal.core.parser.IParserData) */ - public IASTExpression parseUnaryExpression(IASTScope scope, IParserData data, IASTCompletionNode.CompletionKind kind, KeywordSets.Key key) { + public IASTExpression parseUnaryExpression(IASTScope scope, IParserData data, IASTCompletionNode.CompletionKind kind, KeywordSetKey key) { try { switch( data.LT(1)) { @@ -117,7 +116,7 @@ public class GCCParserExtension implements IParserExtension { * @param type TODO * @return */ - protected IASTExpression performUnaryExpression(IParserData data, IASTScope scope, CompletionKind kind, KeywordSets.Key key, UnaryExpressionKind type) { + protected IASTExpression performUnaryExpression(IParserData data, IASTScope scope, CompletionKind kind, KeywordSetKey key, UnaryExpressionKind type) { IToken startingPoint = null; try { @@ -241,7 +240,7 @@ public class GCCParserExtension implements IParserExtension { /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.extension.IParserExtension#handleDeclSpecifierSequence(org.eclipse.cdt.internal.core.parser.IParserData, org.eclipse.cdt.core.model.Flags, org.eclipse.cdt.internal.core.parser.DeclarationWrapper) */ - public IDeclSpecifierExtensionResult parseDeclSpecifierSequence(IParserData data, Parser.Flags flags, DeclarationWrapper sdw, CompletionKind kind, Key key) { + public IDeclSpecifierExtensionResult parseDeclSpecifierSequence(IParserData data, Parser.Flags flags, DeclarationWrapper sdw, CompletionKind kind, KeywordSetKey key) { IToken startingPoint = null; try { @@ -336,7 +335,7 @@ public class GCCParserExtension implements IParserExtension { /* (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, KeywordSets.Key key, IASTExpression lhsExpression) { + public IASTExpression parseRelationalExpression(IASTScope scope, IParserData data, CompletionKind kind, KeywordSetKey key, IASTExpression lhsExpression) { if( data.getParserLanguage() == ParserLanguage.C ) return null; IToken mark = null; try { @@ -429,9 +428,9 @@ public class GCCParserExtension implements IParserExtension { if( parserData.LT(1) == IToken.tLBRACKET ) { parserData.consume( IToken.tLBRACKET ); - IASTExpression constantExpression1 = parserData.expression( scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION ); + IASTExpression constantExpression1 = parserData.expression( scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION ); parserData.consume( IToken.tELLIPSIS ); - IASTExpression constantExpression2 = parserData.expression( scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION ); + IASTExpression constantExpression2 = parserData.expression( scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION ); parserData.consume(IToken.tRBRACKET ); Map extensionParms = new Hashtable(); extensionParms.put( IASTGCCDesignator.SECOND_EXRESSION, constantExpression2 ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IExpressionParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IExpressionParser.java index 8c2826a3c81..c5b1a902376 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IExpressionParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IExpressionParser.java @@ -16,7 +16,7 @@ import org.eclipse.cdt.core.parser.IFilenameProvider; import org.eclipse.cdt.core.parser.ast.IASTCompletionNode; import org.eclipse.cdt.core.parser.ast.IASTExpression; import org.eclipse.cdt.core.parser.ast.IASTScope; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets.Key; +import org.eclipse.cdt.internal.core.parser.token.KeywordSetKey; /** * @author jcamelon @@ -32,6 +32,6 @@ public interface IExpressionParser extends IFilenameProvider { * @throws BacktrackException thrown if the Scanner/Stream provided does not yield a valid * expression */ - public IASTExpression expression(IASTScope scope, IASTCompletionNode.CompletionKind kind, Key key) throws BacktrackException, EndOfFileException; + public IASTExpression expression(IASTScope scope, IASTCompletionNode.CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException; } 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 25c0453db37..7e14f52e2c5 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 @@ -18,8 +18,7 @@ import org.eclipse.cdt.core.parser.ast.IASTFactory; import org.eclipse.cdt.core.parser.ast.IASTScope; import org.eclipse.cdt.core.parser.ast.IASTTypeId; import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets.Key; +import org.eclipse.cdt.internal.core.parser.token.KeywordSetKey; /** * @author jcamelon * @@ -97,7 +96,7 @@ public interface IParserData extends IExpressionParser { * @param key TODO * @return */ - public IASTExpression unaryExpression(IASTScope scope, CompletionKind kind, KeywordSets.Key key) throws EndOfFileException, BacktrackException; + public IASTExpression unaryExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws EndOfFileException, BacktrackException; /** * @return */ @@ -112,7 +111,7 @@ public interface IParserData extends IExpressionParser { * @param key TODO * @return */ - public IASTExpression shiftExpression(IASTScope scope, CompletionKind kind, Key key) throws BacktrackException, EndOfFileException; + public IASTExpression shiftExpression(IASTScope scope, CompletionKind kind, KeywordSetKey key) throws BacktrackException, EndOfFileException; public IToken identifier() throws EndOfFileException, BacktrackException; } \ 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 ed3a814b6f1..7be052930b0 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 @@ -59,9 +59,8 @@ import org.eclipse.cdt.core.parser.ast.IASTUsingDirective; import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier.ClassNameType; import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind; import org.eclipse.cdt.core.parser.extension.IParserExtension; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets; +import org.eclipse.cdt.internal.core.parser.token.KeywordSetKey; import org.eclipse.cdt.internal.core.parser.token.TokenFactory; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets.Key; /** * This is our first implementation of the IParser interface, serving as a parser for @@ -134,7 +133,7 @@ public abstract class Parser extends ExpressionParser implements IParser compilationUnit.enterScope( requestor, astFactory.getReferenceManager() ); try { - setCompletionValues(compilationUnit, CompletionKind.VARIABLE_TYPE, Key.DECLARATION ); + setCompletionValues(compilationUnit, CompletionKind.VARIABLE_TYPE, KeywordSetKey.DECLARATION ); } catch (EndOfFileException e1) { compilationUnit.exitScope( requestor, astFactory.getReferenceManager() ); return; @@ -147,7 +146,7 @@ public abstract class Parser extends ExpressionParser implements IParser try { int checkOffset = LA(1).hashCode(); - declaration(compilationUnit, null, null); + declaration(compilationUnit, null, null, KeywordSetKey.DECLARATION); if (LA(1).hashCode() == checkOffset) errorHandling(); } @@ -235,18 +234,18 @@ public abstract class Parser extends ExpressionParser implements IParser throws EndOfFileException, BacktrackException { IToken firstToken = consume(IToken.t_using); - setCompletionValues(scope, CompletionKind.TYPE_REFERENCE, Key.POST_USING ); + setCompletionValues(scope, CompletionKind.TYPE_REFERENCE, KeywordSetKey.POST_USING ); if (LT(1) == IToken.t_namespace) { // using-directive consume(IToken.t_namespace); - setCompletionValues(scope, CompletionKind.NAMESPACE_REFERENCE, Key.EMPTY ); + setCompletionValues(scope, CompletionKind.NAMESPACE_REFERENCE, KeywordSetKey.EMPTY ); // optional :: and nested classes handled in name ITokenDuple duple = null; if (LT(1) == IToken.tIDENTIFIER || LT(1) == IToken.tCOLONCOLON) - duple = name(scope, CompletionKind.NAMESPACE_REFERENCE, Key.EMPTY); + duple = name(scope, CompletionKind.NAMESPACE_REFERENCE, KeywordSetKey.EMPTY); else throw backtrack; if (LT(1) == IToken.tSEMI) @@ -269,7 +268,7 @@ public abstract class Parser extends ExpressionParser implements IParser throw backtrack; } boolean typeName = false; - setCompletionValues(scope, CompletionKind.TYPE_REFERENCE, Key.POST_USING ); + setCompletionValues(scope, CompletionKind.TYPE_REFERENCE, KeywordSetKey.POST_USING ); if (LT(1) == IToken.t_typename) { @@ -277,12 +276,12 @@ public abstract class Parser extends ExpressionParser implements IParser consume(IToken.t_typename); } - setCompletionValues(scope, CompletionKind.TYPE_REFERENCE, Key.NAMESPACE_ONLY ); + setCompletionValues(scope, CompletionKind.TYPE_REFERENCE, KeywordSetKey.NAMESPACE_ONLY ); ITokenDuple name = null; if (LT(1) == IToken.tIDENTIFIER || LT(1) == IToken.tCOLONCOLON) { // optional :: and nested classes handled in name - name = name(scope, CompletionKind.TYPE_REFERENCE, Key.EMPTY); + name = name(scope, CompletionKind.TYPE_REFERENCE, KeywordSetKey.POST_USING); } else { @@ -308,7 +307,7 @@ public abstract class Parser extends ExpressionParser implements IParser throw backtrack; } declaration.acceptElement( requestor, astFactory.getReferenceManager() ); - setCompletionValues(scope, getCompletionKindForDeclaration(scope, null), Key.DECLARATION ); + setCompletionValues(scope, getCompletionKindForDeclaration(scope, null), KeywordSetKey.DECLARATION ); return declaration; } throw backtrack; @@ -363,7 +362,7 @@ public abstract class Parser extends ExpressionParser implements IParser default : try { - declaration(linkage, null, null); + declaration(linkage, null, null, KeywordSetKey.DECLARATION); } catch (BacktrackException bt) { @@ -398,7 +397,7 @@ public abstract class Parser extends ExpressionParser implements IParser throw backtrack; } linkage.enterScope( requestor, astFactory.getReferenceManager() ); - declaration(linkage, null, null); + declaration(linkage, null, null, KeywordSetKey.DECLARATION); linkage.exitScope( requestor, astFactory.getReferenceManager() ); return linkage; @@ -448,7 +447,7 @@ public abstract class Parser extends ExpressionParser implements IParser throw backtrack; } templateInstantiation.enterScope( requestor, astFactory.getReferenceManager() ); - declaration(templateInstantiation, templateInstantiation, null); + declaration(templateInstantiation, templateInstantiation, null, KeywordSetKey.DECLARATION); templateInstantiation.setEndingOffsetAndLineNumber(lastToken.getEndOffset(), lastToken.getLineNumber()); templateInstantiation.exitScope( requestor, astFactory.getReferenceManager() ); @@ -475,7 +474,7 @@ public abstract class Parser extends ExpressionParser implements IParser throw backtrack; } templateSpecialization.enterScope(requestor, astFactory.getReferenceManager()); - declaration(templateSpecialization, templateSpecialization, null); + declaration(templateSpecialization, templateSpecialization, null, KeywordSetKey.DECLARATION); templateSpecialization.setEndingOffsetAndLineNumber( lastToken.getEndOffset(), lastToken.getLineNumber()); templateSpecialization.exitScope(requestor, astFactory.getReferenceManager()); @@ -504,7 +503,7 @@ public abstract class Parser extends ExpressionParser implements IParser } templateDecl.enterScope( requestor, astFactory.getReferenceManager() ); try{ - declaration(templateDecl, templateDecl, null ); + declaration(templateDecl, templateDecl, null, KeywordSetKey.DECLARATION ); } catch( EndOfFileException e ){ templateDecl.setEndingOffsetAndLineNumber( lastToken.getEndOffset(), lastToken.getLineNumber() ); templateDecl.exitScope( requestor, astFactory.getReferenceManager() ); @@ -717,24 +716,25 @@ public abstract class Parser extends ExpressionParser implements IParser * - usingDirective into usingDeclaration * - explicitInstantiation and explicitSpecialization into * templateDeclaration - * + * @param overideKey TODO * @param container IParserCallback object which serves as the owner scope for this declaration. + * * @throws BacktrackException request a backtrack */ protected void declaration( IASTScope scope, - IASTTemplate ownerTemplate, CompletionKind overideKind) + IASTTemplate ownerTemplate, CompletionKind overideKind, KeywordSetKey overideKey) throws EndOfFileException, BacktrackException { IASTCompletionNode.CompletionKind kind = getCompletionKindForDeclaration(scope, overideKind); - setCompletionValues(scope, kind, Key.DECLARATION ); + setCompletionValues(scope, kind, overideKey); IASTDeclaration resultDeclaration = null; switch (LT(1)) { case IToken.t_asm : IToken first = consume(IToken.t_asm); - setCompletionValues( scope, CompletionKind.NO_SUCH_KIND, Key.EMPTY ); + setCompletionValues( scope, CompletionKind.NO_SUCH_KIND, KeywordSetKey.EMPTY ); consume(IToken.tLPAREN); String assembly = consume(IToken.tSTRING).getImage(); consume(IToken.tRPAREN); @@ -757,7 +757,7 @@ public abstract class Parser extends ExpressionParser implements IParser // if we made it this far, then we have all we need // do the callback resultDeclaration.acceptElement(requestor, astFactory.getReferenceManager()); - setCompletionValues(scope, kind, Key.DECLARATION ); + setCompletionValues(scope, kind, KeywordSetKey.DECLARATION ); break; case IToken.t_namespace : resultDeclaration = namespaceDefinition(scope); @@ -776,9 +776,9 @@ public abstract class Parser extends ExpressionParser implements IParser break; } default : - resultDeclaration = simpleDeclarationStrategyUnion(scope, ownerTemplate, overideKind, Key.DECLARATION ); + resultDeclaration = simpleDeclarationStrategyUnion(scope, ownerTemplate, overideKind, overideKey); } - setCompletionValues(scope, kind, Key.DECLARATION ); + setCompletionValues(scope, kind, KeywordSetKey.DECLARATION ); endDeclaration( resultDeclaration ); } @@ -792,7 +792,7 @@ public abstract class Parser extends ExpressionParser implements IParser protected IASTDeclaration simpleDeclarationStrategyUnion( IASTScope scope, - IASTTemplate ownerTemplate, CompletionKind overrideKind, Key overrideKey) + IASTTemplate ownerTemplate, CompletionKind overrideKind, KeywordSetKey overrideKey) throws EndOfFileException, BacktrackException { simpleDeclarationMark = mark(); @@ -859,7 +859,7 @@ public abstract class Parser extends ExpressionParser implements IParser IASTCompletionNode.CompletionKind kind = getCompletionKindForDeclaration(scope, null); - setCompletionValues(scope,CompletionKind.NAMESPACE_REFERENCE, Key.EMPTY ); + setCompletionValues(scope,CompletionKind.NAMESPACE_REFERENCE, KeywordSetKey.EMPTY ); IToken identifier = null; // optional name if (LT(1) == IToken.tIDENTIFIER) @@ -887,7 +887,7 @@ public abstract class Parser extends ExpressionParser implements IParser throw backtrack; } namespaceDefinition.enterScope( requestor, astFactory.getReferenceManager() ); - setCompletionValues(scope,CompletionKind.VARIABLE_TYPE, Key.DECLARATION ); + setCompletionValues(scope,CompletionKind.VARIABLE_TYPE, KeywordSetKey.DECLARATION ); namespaceDeclarationLoop : while (LT(1) != IToken.tRBRACE) { int checkToken = LA(1).hashCode(); @@ -899,7 +899,7 @@ public abstract class Parser extends ExpressionParser implements IParser default : try { - declaration(namespaceDefinition, null, null); + declaration(namespaceDefinition, null, null, KeywordSetKey.DECLARATION); } catch (BacktrackException bt) { @@ -911,27 +911,27 @@ public abstract class Parser extends ExpressionParser implements IParser if (checkToken == LA(1).hashCode()) errorHandling(); } - setCompletionValues(scope, CompletionKind.NO_SUCH_KIND,Key.EMPTY ); + setCompletionValues(scope, CompletionKind.NO_SUCH_KIND,KeywordSetKey.EMPTY ); // consume the } IToken last = consume(IToken.tRBRACE); namespaceDefinition.setEndingOffsetAndLineNumber( last.getOffset() + last.getLength(), last.getLineNumber()); - setCompletionValues(scope, kind, Key.DECLARATION ); + setCompletionValues(scope, kind, KeywordSetKey.DECLARATION ); namespaceDefinition.exitScope( requestor, astFactory.getReferenceManager() ); return namespaceDefinition; } else if( LT(1) == IToken.tASSIGN ) { - setCompletionValues(scope, CompletionKind.NO_SUCH_KIND,Key.EMPTY); + setCompletionValues(scope, CompletionKind.NO_SUCH_KIND,KeywordSetKey.EMPTY); consume( IToken.tASSIGN ); if( identifier == null ) throw backtrack; - ITokenDuple duple = name(scope, CompletionKind.NAMESPACE_REFERENCE, Key.EMPTY); + ITokenDuple duple = name(scope, CompletionKind.NAMESPACE_REFERENCE, KeywordSetKey.EMPTY); consume( IToken.tSEMI ); - setCompletionValues(scope, kind, Key.DECLARATION ); + setCompletionValues(scope, kind, KeywordSetKey.DECLARATION ); IASTNamespaceAlias alias = null; try { @@ -972,7 +972,7 @@ public abstract class Parser extends ExpressionParser implements IParser protected IASTDeclaration simpleDeclaration( SimpleDeclarationStrategy strategy, IASTScope scope, - IASTTemplate ownerTemplate, CompletionKind overideKind, boolean fromCatchHandler, Key overrideKey) + IASTTemplate ownerTemplate, CompletionKind overideKind, boolean fromCatchHandler, KeywordSetKey overrideKey) throws BacktrackException, EndOfFileException { IToken firstToken = LA(1); @@ -982,7 +982,7 @@ public abstract class Parser extends ExpressionParser implements IParser firstToken = null; // necessary for scalability CompletionKind completionKindForDeclaration = getCompletionKindForDeclaration(scope, overideKind); - setCompletionValues( scope, completionKindForDeclaration, Key.DECL_SPECIFIER_SEQUENCE ); + setCompletionValues( scope, completionKindForDeclaration, KeywordSetKey.DECL_SPECIFIER_SEQUENCE ); declSpecifierSeq(sdw, false, strategy == SimpleDeclarationStrategy.TRY_CONSTRUCTOR, completionKindForDeclaration, overrideKey ); IASTSimpleTypeSpecifier simpleTypeSpecifier = null; if (sdw.getTypeSpecifier() == null && sdw.getSimpleType() != IASTSimpleTypeSpecifier.Type.UNSPECIFIED ) @@ -1209,12 +1209,12 @@ public abstract class Parser extends ExpressionParser implements IParser break; - ITokenDuple duple = name(scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EMPTY ); + ITokenDuple duple = name(scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EMPTY ); consume(IToken.tLPAREN); IASTExpression expressionList = null; - expressionList = expression(d.getDeclarationWrapper().getScope(), CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION); + expressionList = expression(d.getDeclarationWrapper().getScope(), CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION); consume(IToken.tRPAREN); @@ -1259,7 +1259,7 @@ public abstract class Parser extends ExpressionParser implements IParser DeclarationWrapper sdw = new DeclarationWrapper(scope, current.getOffset(), current.getLineNumber(), null); - declSpecifierSeq(sdw, true, false, CompletionKind.ARGUMENT_TYPE, Key.DECL_SPECIFIER_SEQUENCE ); + declSpecifierSeq(sdw, true, false, CompletionKind.ARGUMENT_TYPE, KeywordSetKey.DECL_SPECIFIER_SEQUENCE ); if (sdw.getTypeSpecifier() == null && sdw.getSimpleType() != IASTSimpleTypeSpecifier.Type.UNSPECIFIED) @@ -1289,7 +1289,7 @@ public abstract class Parser extends ExpressionParser implements IParser throw backtrack; } - setCompletionValues(scope,CompletionKind.SINGLE_NAME_REFERENCE,Key.EMPTY ); + setCompletionValues(scope,CompletionKind.SINGLE_NAME_REFERENCE,KeywordSetKey.EMPTY ); if (LT(1) != IToken.tSEMI) initDeclarator(sdw, SimpleDeclarationStrategy.TRY_FUNCTION, CompletionKind.VARIABLE_TYPE, constructInitializersInParameters ); @@ -1482,7 +1482,7 @@ public abstract class Parser extends ExpressionParser implements IParser protected void declSpecifierSeq( DeclarationWrapper sdw, boolean parm, - boolean tryConstructor, CompletionKind kind, Key key ) + boolean tryConstructor, CompletionKind kind, KeywordSetKey key ) throws BacktrackException, EndOfFileException { Flags flags = new Flags(parm, tryConstructor); @@ -1661,7 +1661,7 @@ public abstract class Parser extends ExpressionParser implements IParser consume(IToken.t_typename ); IToken first = LA(1); IToken last = null; - last = name(sdw.getScope(), CompletionKind.TYPE_REFERENCE, Key.EMPTY).getLastToken(); + last = name(sdw.getScope(), CompletionKind.TYPE_REFERENCE, KeywordSetKey.EMPTY).getLastToken(); if (LT(1) == IToken.t_template) { consume(IToken.t_template); @@ -1806,7 +1806,7 @@ public abstract class Parser extends ExpressionParser implements IParser throw backtrack; } - ITokenDuple d = name(sdw.getScope(), completionKind, Key.EMPTY); + ITokenDuple d = name(sdw.getScope(), completionKind, KeywordSetKey.EMPTY); IASTTypeSpecifier elaboratedTypeSpec = null; final boolean isForewardDecl = ( LT(1) == IToken.tSEMI ); @@ -1872,24 +1872,24 @@ public abstract class Parser extends ExpressionParser implements IParser { // handle initializer final IASTScope scope = d.getDeclarationWrapper().getScope(); - setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,Key.EMPTY); + setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,KeywordSetKey.EMPTY); if (LT(1) == IToken.tASSIGN) { consume(IToken.tASSIGN); - setCompletionValues(scope,CompletionKind.SINGLE_NAME_REFERENCE,Key.EMPTY); + setCompletionValues(scope,CompletionKind.SINGLE_NAME_REFERENCE,KeywordSetKey.EMPTY); throwAwayMarksForInitializerClause(d); IASTInitializerClause clause = initializerClause(scope,constructInitializers); d.setInitializerClause(clause); - setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,Key.EMPTY); + setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,KeywordSetKey.EMPTY); } else if (LT(1) == IToken.tLPAREN ) { // initializer in constructor consume(IToken.tLPAREN); // EAT IT! - setCompletionValues(scope,CompletionKind.SINGLE_NAME_REFERENCE,Key.EMPTY); + setCompletionValues(scope,CompletionKind.SINGLE_NAME_REFERENCE,KeywordSetKey.EMPTY); IASTExpression astExpression = null; - astExpression = expression(scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION); - setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,Key.EMPTY); + astExpression = expression(scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION); + setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,KeywordSetKey.EMPTY); consume(IToken.tRPAREN); d.setConstructorExpression(astExpression); } @@ -1910,14 +1910,14 @@ public abstract class Parser extends ExpressionParser implements IParser protected void optionalCInitializer( Declarator d, boolean constructInitializers ) throws EndOfFileException, BacktrackException { final IASTScope scope = d.getDeclarationWrapper().getScope(); - setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,Key.EMPTY); + setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,KeywordSetKey.EMPTY); if( LT(1) == IToken.tASSIGN ) { consume( IToken.tASSIGN ); throwAwayMarksForInitializerClause(d); - setCompletionValues(scope,CompletionKind.SINGLE_NAME_REFERENCE,Key.EMPTY); + setCompletionValues(scope,CompletionKind.SINGLE_NAME_REFERENCE,KeywordSetKey.EMPTY); d.setInitializerClause( cInitializerClause(scope, Collections.EMPTY_LIST, constructInitializers ) ); - setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,Key.EMPTY); + setCompletionValues(scope,CompletionKind.NO_SUCH_KIND,KeywordSetKey.EMPTY); } } /** @@ -1973,7 +1973,7 @@ public abstract class Parser extends ExpressionParser implements IParser // assignmentExpression try { - IASTExpression assignmentExpression = assignmentExpression(scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION); + IASTExpression assignmentExpression = assignmentExpression(scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION); try { return createInitializerClause( @@ -2058,7 +2058,7 @@ public abstract class Parser extends ExpressionParser implements IParser try { IASTExpression assignmentExpression = - assignmentExpression(scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION); + assignmentExpression(scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION); try { @@ -2118,7 +2118,7 @@ public abstract class Parser extends ExpressionParser implements IParser else if( LT(1) == IToken.tLBRACKET ) { IToken mark = consume( IToken.tLBRACKET ); - constantExpression = expression( scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION ); + constantExpression = expression( scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION ); if( LT(1) != IToken.tRBRACKET ) { backup( mark ); @@ -2223,7 +2223,7 @@ public abstract class Parser extends ExpressionParser implements IParser { try { - queryName = name(parameterScope, CompletionKind.TYPE_REFERENCE, Key.EMPTY ); + queryName = name(parameterScope, CompletionKind.TYPE_REFERENCE, KeywordSetKey.EMPTY ); if( ! astFactory.queryIsTypeName( parameterScope, queryName ) ) failed = true; } @@ -2248,7 +2248,7 @@ public abstract class Parser extends ExpressionParser implements IParser d.setIsFunction(true); // TODO need to create a temporary scope object here consume(IToken.tLPAREN); - setCompletionValues( scope, CompletionKind.ARGUMENT_TYPE, Key.DECL_SPECIFIER_SEQUENCE ); + setCompletionValues( scope, CompletionKind.ARGUMENT_TYPE, KeywordSetKey.DECL_SPECIFIER_SEQUENCE ); boolean seenParameter = false; parameterDeclarationLoop : for (;;) { @@ -2256,7 +2256,7 @@ public abstract class Parser extends ExpressionParser implements IParser { case IToken.tRPAREN : consume(); - setCompletionValues( parameterScope, CompletionKind.NO_SUCH_KIND, KeywordSets.Key.FUNCTION_MODIFIER ); + setCompletionValues( parameterScope, CompletionKind.NO_SUCH_KIND, KeywordSetKey.FUNCTION_MODIFIER ); break parameterDeclarationLoop; case IToken.tELLIPSIS : consume(); @@ -2264,7 +2264,7 @@ public abstract class Parser extends ExpressionParser implements IParser break; case IToken.tCOMMA : consume(); - setCompletionValues( parameterScope, CompletionKind.ARGUMENT_TYPE, Key.DECL_SPECIFIER_SEQUENCE ); + setCompletionValues( parameterScope, CompletionKind.ARGUMENT_TYPE, KeywordSetKey.DECL_SPECIFIER_SEQUENCE ); seenParameter = false; break; default : @@ -2381,7 +2381,7 @@ public abstract class Parser extends ExpressionParser implements IParser continue; case IToken.tCOLON : consume(IToken.tCOLON); - IASTExpression exp = constantExpression(scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION ); + IASTExpression exp = constantExpression(scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION ); d.setBitFieldExpression(exp); default : break; @@ -2410,7 +2410,7 @@ public abstract class Parser extends ExpressionParser implements IParser { try { - ITokenDuple duple = name(d.getDeclarationWrapper().getScope(), kind, Key.EMPTY ); + ITokenDuple duple = name(d.getDeclarationWrapper().getScope(), kind, KeywordSetKey.EMPTY ); d.setName(duple); } @@ -2531,7 +2531,7 @@ public abstract class Parser extends ExpressionParser implements IParser if (LT(1) == IToken.tASSIGN) { consume(IToken.tASSIGN); - initialValue = constantExpression(sdw.getScope(), CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION); + initialValue = constantExpression(sdw.getScope(), CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION); } IASTEnumerator enumerator = null; if (LT(1) == IToken.tRBRACE) @@ -2643,10 +2643,10 @@ public abstract class Parser extends ExpressionParser implements IParser ITokenDuple duple = null; - setCompletionValues(sdw.getScope(), completionKind, Key.EMPTY ); + setCompletionValues(sdw.getScope(), completionKind, KeywordSetKey.EMPTY ); // class name if (LT(1) == IToken.tIDENTIFIER) - duple = name( sdw.getScope(), completionKind, Key.EMPTY ); + duple = name( sdw.getScope(), completionKind, KeywordSetKey.EMPTY ); if (duple != null && !duple.isIdentifier()) nameType = ClassNameType.TEMPLATE; if (LT(1) != IToken.tCOLON && LT(1) != IToken.tLBRACE) @@ -2690,7 +2690,7 @@ public abstract class Parser extends ExpressionParser implements IParser if (LT(1) == IToken.tLBRACE) { consume(IToken.tLBRACE); - setCompletionValues(astClassSpecifier, CompletionKind.FIELD_TYPE, Key.DECLARATION ); + setCompletionValues(astClassSpecifier, CompletionKind.FIELD_TYPE, KeywordSetKey.MEMBER ); astClassSpecifier.enterScope( requestor, astFactory.getReferenceManager() ); handleClassSpecifier( astClassSpecifier ); memberDeclarationLoop : while (LT(1) != IToken.tRBRACE) @@ -2720,7 +2720,7 @@ public abstract class Parser extends ExpressionParser implements IParser default : try { - declaration(astClassSpecifier, null, null); + declaration(astClassSpecifier, null, null, KeywordSetKey.MEMBER); } catch (BacktrackException bt) { @@ -2770,7 +2770,7 @@ public abstract class Parser extends ExpressionParser implements IParser { consume(IToken.tCOLON); - setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSets.Key.BASE_SPECIFIER ); + setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSetKey.BASE_SPECIFIER ); boolean isVirtual = false; ASTAccessVisibility visibility = ASTAccessVisibility.PUBLIC; ITokenDuple nameDuple = null; @@ -2781,26 +2781,26 @@ public abstract class Parser extends ExpressionParser implements IParser { case IToken.t_virtual : consume(IToken.t_virtual); - setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSets.Key.EMPTY ); + setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSetKey.EMPTY ); isVirtual = true; break; case IToken.t_public : consume(); - setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSets.Key.EMPTY ); + setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSetKey.EMPTY ); break; case IToken.t_protected : consume(); visibility = ASTAccessVisibility.PROTECTED; - setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSets.Key.EMPTY ); + setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSetKey.EMPTY ); break; case IToken.t_private : visibility = ASTAccessVisibility.PRIVATE; consume(); - setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSets.Key.EMPTY ); + setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSetKey.EMPTY ); break; case IToken.tCOLONCOLON : case IToken.tIDENTIFIER : - nameDuple = name(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, Key.BASE_SPECIFIER ); + nameDuple = name(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSetKey.BASE_SPECIFIER ); break; case IToken.tCOMMA : try @@ -2824,7 +2824,7 @@ public abstract class Parser extends ExpressionParser implements IParser visibility = ASTAccessVisibility.PUBLIC; nameDuple = null; consume(); - setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSets.Key.BASE_SPECIFIER ); + setCompletionValues(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSetKey.BASE_SPECIFIER ); continue baseSpecifierLoop; default : break baseSpecifierLoop; @@ -2866,13 +2866,13 @@ public abstract class Parser extends ExpressionParser implements IParser protected void statement(IASTCodeScope scope) throws EndOfFileException, BacktrackException { - setCompletionValues(scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.STATEMENT); + setCompletionValues(scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.STATEMENT); switch (LT(1)) { case IToken.t_case : consume(IToken.t_case); - IASTExpression constant_expression = constantExpression(scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION ); + IASTExpression constant_expression = constantExpression(scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION ); constant_expression.acceptElement(requestor, astFactory.getReferenceManager()); endExpression(constant_expression); consume(IToken.tCOLON); @@ -2952,7 +2952,7 @@ public abstract class Parser extends ExpressionParser implements IParser consume(IToken.tSEMI); if (LT(1) != IToken.tRPAREN) { - IASTExpression finalExpression = expression(scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.DECLARATION); + IASTExpression finalExpression = expression(scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.DECLARATION); finalExpression.acceptElement(requestor, astFactory.getReferenceManager()); endExpression(finalExpression); } @@ -2974,7 +2974,7 @@ public abstract class Parser extends ExpressionParser implements IParser consume(); if (LT(1) != IToken.tSEMI) { - IASTExpression retVal = expression(scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION); + IASTExpression retVal = expression(scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION); retVal.acceptElement(requestor, astFactory.getReferenceManager()); endExpression(retVal); } @@ -3016,7 +3016,7 @@ public abstract class Parser extends ExpressionParser implements IParser IASTExpression expressionStatement = null; try { - expressionStatement = expression(scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.STATEMENT); + expressionStatement = expression(scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.STATEMENT); consume(IToken.tSEMI); expressionStatement.acceptElement( requestor, astFactory.getReferenceManager() ); endExpression(expressionStatement); @@ -3030,7 +3030,7 @@ public abstract class Parser extends ExpressionParser implements IParser } // declarationStatement - declaration(scope, null, null); + declaration(scope, null, null, KeywordSetKey.STATEMENT); } } @@ -3045,7 +3045,7 @@ public abstract class Parser extends ExpressionParser implements IParser if( LT(1) == IToken.tELLIPSIS ) consume( IToken.tELLIPSIS ); else - simpleDeclaration( SimpleDeclarationStrategy.TRY_VARIABLE, scope, null, CompletionKind.EXCEPTION_REFERENCE, true, Key.DECL_SPECIFIER_SEQUENCE ); + simpleDeclaration( SimpleDeclarationStrategy.TRY_VARIABLE, scope, null, CompletionKind.EXCEPTION_REFERENCE, true, KeywordSetKey.DECL_SPECIFIER_SEQUENCE ); consume(IToken.tRPAREN); catchBlockCompoundStatement(scope); @@ -3083,7 +3083,7 @@ public abstract class Parser extends ExpressionParser implements IParser */ protected void condition( IASTScope scope ) throws BacktrackException, EndOfFileException { - IASTExpression someExpression = expression( scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION ); + IASTExpression someExpression = expression( scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION ); someExpression.acceptElement(requestor, astFactory.getReferenceManager()); endExpression(someExpression); @@ -3097,7 +3097,7 @@ public abstract class Parser extends ExpressionParser implements IParser IToken mark = mark(); try { - IASTExpression e = expression( scope, CompletionKind.SINGLE_NAME_REFERENCE, Key.DECLARATION ); + IASTExpression e = expression( scope, CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.DECLARATION ); consume( IToken.tSEMI ); e.acceptElement(requestor, astFactory.getReferenceManager()); @@ -3143,7 +3143,7 @@ public abstract class Parser extends ExpressionParser implements IParser setCompletionValues( (createNewScope ? newScope : scope ), CompletionKind.SINGLE_NAME_REFERENCE, - KeywordSets.Key.STATEMENT ); + KeywordSetKey.STATEMENT ); while (LT(1) != IToken.tRBRACE) { @@ -3159,7 +3159,7 @@ public abstract class Parser extends ExpressionParser implements IParser errorHandling(); } setCompletionValues(((createNewScope ? newScope : scope )), CompletionKind.SINGLE_NAME_REFERENCE, - KeywordSets.Key.STATEMENT ); + KeywordSetKey.STATEMENT ); } consume(IToken.tRBRACE); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java index e1688c135eb..d61d2b6fb7b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java @@ -60,6 +60,7 @@ import org.eclipse.cdt.internal.core.parser.InternalParserUtil; import org.eclipse.cdt.internal.core.parser.ast.ASTCompletionNode; import org.eclipse.cdt.internal.core.parser.ast.EmptyIterator; import org.eclipse.cdt.internal.core.parser.problem.IProblemFactory; +import org.eclipse.cdt.internal.core.parser.token.KeywordSetKey; import org.eclipse.cdt.internal.core.parser.token.KeywordSets; import org.eclipse.cdt.internal.core.parser.token.SimpleToken; import org.eclipse.cdt.internal.core.parser.token.TokenFactory; @@ -2116,7 +2117,7 @@ public final class Scanner implements IScanner, IScannerData { */ protected void handleCompletionOnDefinition(String definition) throws EndOfFileException { IASTCompletionNode node = new ASTCompletionNode( IASTCompletionNode.CompletionKind.MACRO_REFERENCE, - null, null, definition, KeywordSets.getKeywords(KeywordSets.Key.EMPTY, language), EMPTY_STRING, null ); + null, null, definition, KeywordSets.getKeywords(KeywordSetKey.EMPTY, language), EMPTY_STRING, null ); throwEOF( node ); } @@ -2175,7 +2176,7 @@ public final class Scanner implements IScanner, IScannerData { IASTCompletionNode node = new ASTCompletionNode( kind, null, null, prefix, - KeywordSets.getKeywords(((kind == IASTCompletionNode.CompletionKind.NO_SUCH_KIND )? KeywordSets.Key.EMPTY : KeywordSets.Key.MACRO), language), EMPTY_STRING, null ); + KeywordSets.getKeywords(((kind == IASTCompletionNode.CompletionKind.NO_SUCH_KIND )? KeywordSetKey.EMPTY : KeywordSetKey.MACRO), language), EMPTY_STRING, null ); throwEOF( node ); } @@ -2190,12 +2191,12 @@ public final class Scanner implements IScanner, IScannerData { protected void handleInvalidCompletion() throws EndOfFileException { - throwEOF( new ASTCompletionNode( IASTCompletionNode.CompletionKind.UNREACHABLE_CODE, null, null, EMPTY_STRING, KeywordSets.getKeywords(KeywordSets.Key.EMPTY, language ) , EMPTY_STRING, null)); + throwEOF( new ASTCompletionNode( IASTCompletionNode.CompletionKind.UNREACHABLE_CODE, null, null, EMPTY_STRING, KeywordSets.getKeywords(KeywordSetKey.EMPTY, language ) , EMPTY_STRING, null)); } protected void handleCompletionOnPreprocessorDirective( String prefix ) throws EndOfFileException { - throwEOF( new ASTCompletionNode( IASTCompletionNode.CompletionKind.NO_SUCH_KIND, null, null, prefix, KeywordSets.getKeywords(KeywordSets.Key.PP_DIRECTIVE, language ), EMPTY_STRING, null)); + throwEOF( new ASTCompletionNode( IASTCompletionNode.CompletionKind.NO_SUCH_KIND, null, null, prefix, KeywordSets.getKeywords(KeywordSetKey.PP_DIRECTIVE, language ), EMPTY_STRING, null)); } /** * @param key diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSetKey.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSetKey.java new file mode 100644 index 00000000000..58d630df330 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSetKey.java @@ -0,0 +1,37 @@ +/********************************************************************** + * Copyright (c) 2002-2004 Rational Software Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v0.5 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v05.html + * + * Contributors: + * IBM Rational Software - Initial API and implementation +***********************************************************************/ +package org.eclipse.cdt.internal.core.parser.token; + +import org.eclipse.cdt.core.parser.Enum; + + +public class KeywordSetKey extends Enum +{ + public static final KeywordSetKey EMPTY = new KeywordSetKey( 0 ); + public static final KeywordSetKey DECL_SPECIFIER_SEQUENCE = new KeywordSetKey( 1 ); + public static final KeywordSetKey DECLARATION = new KeywordSetKey( 2 ); + public static final KeywordSetKey STATEMENT = new KeywordSetKey(3); + public static final KeywordSetKey BASE_SPECIFIER = new KeywordSetKey(4); + public static final KeywordSetKey POST_USING = new KeywordSetKey( 5 ); + public static final KeywordSetKey FUNCTION_MODIFIER = new KeywordSetKey( 6 ); + public static final KeywordSetKey NAMESPACE_ONLY = new KeywordSetKey(6); + public static final KeywordSetKey MACRO = new KeywordSetKey( 7 ); + public static final KeywordSetKey PP_DIRECTIVE = new KeywordSetKey( 8 ); + public static final KeywordSetKey EXPRESSION = new KeywordSetKey( 9 ); + public static final KeywordSetKey MEMBER = new KeywordSetKey(10); + /** + * @param enumValue + */ + protected KeywordSetKey(int enumValue) { + super(enumValue); + } + +} \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java index aac39a4c27f..8cbfcfb4d65 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java @@ -16,7 +16,6 @@ import java.util.Set; import java.util.TreeSet; import org.eclipse.cdt.core.parser.Directives; -import org.eclipse.cdt.core.parser.Enum; import org.eclipse.cdt.core.parser.Keywords; import org.eclipse.cdt.core.parser.ParserLanguage; @@ -26,51 +25,35 @@ import org.eclipse.cdt.core.parser.ParserLanguage; public class KeywordSets { - public static class Key extends Enum + public static Set getKeywords( KeywordSetKey kind, ParserLanguage language ) { - public static final Key EMPTY = new Key( 0 ); - public static final Key DECL_SPECIFIER_SEQUENCE = new Key( 1 ); - public static final Key DECLARATION = new Key( 2 ); - public static final Key STATEMENT = new Key(3); - public static final Key BASE_SPECIFIER = new Key(4); - public static final Key POST_USING = new Key( 5 ); - public static final Key FUNCTION_MODIFIER = new Key( 6 ); - public static final Key NAMESPACE_ONLY = new Key(6); - public static final Key MACRO = new Key( 7 ); - public static final Key PP_DIRECTIVE = new Key( 8 ); - public static final Key EXPRESSION = new Key( 9 ); - /** - * @param enumValue - */ - protected Key(int enumValue) { - super(enumValue); - } - - } - - public static Set getKeywords( Key kind, ParserLanguage language ) - { - if( kind == Key.EMPTY ) + if( kind == KeywordSetKey.EMPTY ) return EMPTY_TABLE; - if( kind == Key.DECL_SPECIFIER_SEQUENCE ) + if( kind == KeywordSetKey.DECL_SPECIFIER_SEQUENCE ) return (Set) DECL_SPECIFIER_SEQUENCE_TABLE.get( language ); - if( kind == Key.DECLARATION ) + if( kind == KeywordSetKey.DECLARATION ) return (Set) DECLARATION_TABLE.get( language ); - if( kind == Key.STATEMENT ) + if( kind == KeywordSetKey.STATEMENT ) return (Set) STATEMENT_TABLE.get( language ); - if( kind == Key.BASE_SPECIFIER ) + if( kind == KeywordSetKey.BASE_SPECIFIER ) return BASE_SPECIFIER_CPP; - if( kind == Key.POST_USING ) + if( kind == KeywordSetKey.MEMBER ) + { + if( language == ParserLanguage.CPP ) + return CLASS_MEMBER; + return EMPTY_TABLE; + } + if( kind == KeywordSetKey.POST_USING ) return POST_USING_CPP; - if( kind == Key.FUNCTION_MODIFIER ) + if( kind == KeywordSetKey.FUNCTION_MODIFIER ) return (Set) FUNCTION_MODIFIER_TABLE.get( language ); - if( kind == Key.NAMESPACE_ONLY ) + if( kind == KeywordSetKey.NAMESPACE_ONLY ) return NAMESPACE_ONLY_SET; - if( kind == Key.MACRO ) + if( kind == KeywordSetKey.MACRO ) return MACRO_ONLY; - if( kind == Key.PP_DIRECTIVE ) + if( kind == KeywordSetKey.PP_DIRECTIVE ) return PP_DIRECTIVES; - if( kind == Key.EXPRESSION ) + if( kind == KeywordSetKey.EXPRESSION ) return (Set) EXPRESSION_TABLE.get( language ); //TODO finish this return null; @@ -157,7 +140,10 @@ public class KeywordSets { DECLARATION_CPP = new TreeSet(); DECLARATION_CPP.addAll( DECL_SPECIFIER_SEQUENCE_CPP ); DECLARATION_CPP.add( Keywords.ASM ); - // more to come + DECLARATION_CPP.add( Keywords.TEMPLATE ); + DECLARATION_CPP.add( Keywords.USING ); + DECLARATION_CPP.add( Keywords.NAMESPACE ); + DECLARATION_CPP.add( Keywords.EXPORT ); } private static final Set DECLARATION_C; @@ -166,7 +152,6 @@ public class KeywordSets { DECLARATION_C = new TreeSet(); DECLARATION_C.addAll(DECL_SPECIFIER_SEQUENCE_C ); DECLARATION_C.add(Keywords.ASM ); - // more to come } private static final Hashtable DECLARATION_TABLE; @@ -229,7 +214,17 @@ public class KeywordSets { STATEMENT_C.addAll( DECLARATION_C ); STATEMENT_C.addAll( EXPRESSION_C ); STATEMENT_C.add( Keywords.FOR ); - // more to come + STATEMENT_C.add( Keywords.BREAK ); + STATEMENT_C.add( Keywords.CASE ); + STATEMENT_C.add( Keywords.GOTO ); + STATEMENT_C.add( Keywords.SWITCH ); + STATEMENT_C.add( Keywords.WHILE ); + STATEMENT_C.add( Keywords.IF); + STATEMENT_C.add( Keywords.CONTINUE); + STATEMENT_C.add( Keywords.DEFAULT); + STATEMENT_C.add( Keywords.RETURN); + STATEMENT_C.add( Keywords.ELSE); + STATEMENT_C.add( Keywords.DO); } private static final Set STATEMENT_CPP; @@ -238,7 +233,19 @@ public class KeywordSets { STATEMENT_CPP = new TreeSet( DECLARATION_CPP ); STATEMENT_CPP.addAll( EXPRESSION_CPP ); STATEMENT_CPP.add( Keywords.TRY ); - //TODO finish this + STATEMENT_CPP.add( Keywords.FOR ); + STATEMENT_CPP.add( Keywords.BREAK ); + STATEMENT_CPP.add( Keywords.CASE ); + STATEMENT_CPP.add( Keywords.CATCH ); + STATEMENT_CPP.add( Keywords.GOTO ); + STATEMENT_CPP.add( Keywords.SWITCH ); + STATEMENT_CPP.add( Keywords.WHILE ); + STATEMENT_CPP.add( Keywords.IF); + STATEMENT_CPP.add( Keywords.CONTINUE); + STATEMENT_CPP.add( Keywords.DEFAULT); + STATEMENT_CPP.add( Keywords.RETURN); + STATEMENT_CPP.add( Keywords.ELSE); + STATEMENT_CPP.add( Keywords.DO); } private static final Hashtable STATEMENT_TABLE; @@ -259,6 +266,15 @@ public class KeywordSets { BASE_SPECIFIER_CPP.add(Keywords.VIRTUAL); } + private static final Set CLASS_MEMBER; + static + { + CLASS_MEMBER = new TreeSet(DECL_SPECIFIER_SEQUENCE_CPP); + CLASS_MEMBER.add(Keywords.PUBLIC); + CLASS_MEMBER.add(Keywords.PROTECTED); + CLASS_MEMBER.add(Keywords.PRIVATE); + } + private static final Set POST_USING_CPP; static { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java index 8c64d8586fb..9b3011c3298 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java @@ -183,7 +183,8 @@ public class CompletionEngine implements RelevanceConstants { // set timeout IPreferenceStore prefStore = CUIPlugin.getDefault().getPreferenceStore(); int timeout = prefStore.getInt(ContentAssistPreference.TIMEOUT_DELAY); - elementRequestor.setTimeout(timeout); + if( timeout > 0 ) + elementRequestor.setTimeout(timeout); // start timer elementRequestor.startTimer();