From 5ef40f0effd10914e8dab7786da26d787aa06039 Mon Sep 17 00:00:00 2001 From: Mike Kucera Date: Thu, 1 May 2008 15:07:12 +0000 Subject: [PATCH] added token mapping to CPPBuildASTParserAction --- .../lrparser/tests/LRParserTestSuite.java | 1 + .../core/lrparser/tests/LRTemplateTests.java | 37 ++++++++ .../.settings/org.eclipse.jdt.core.prefs | 4 +- .../action/c99/C99BuildASTParserAction.java | 28 +++--- .../action/cpp/CPPASTAmbiguousDeclarator.java | 10 +- .../action/cpp/CPPBuildASTParserAction.java | 92 +++++++++++-------- 6 files changed, 109 insertions(+), 63 deletions(-) create mode 100644 lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRTemplateTests.java diff --git a/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRParserTestSuite.java b/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRParserTestSuite.java index a9985afc113..6d03837e98c 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRParserTestSuite.java +++ b/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRParserTestSuite.java @@ -54,6 +54,7 @@ public class LRParserTestSuite extends TestSuite { addTestSuite(LRCPPSpecTest.class); addTestSuite(LRCPPTests.class); + addTestSuite(LRTemplateTests.class); }}; } diff --git a/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRTemplateTests.java b/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRTemplateTests.java new file mode 100644 index 00000000000..b83019ccc17 --- /dev/null +++ b/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRTemplateTests.java @@ -0,0 +1,37 @@ +package org.eclipse.cdt.core.lrparser.tests; + +import junit.framework.TestSuite; + +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.dom.lrparser.c99.C99Language; +import org.eclipse.cdt.core.dom.lrparser.cpp.ISOCPPLanguage; +import org.eclipse.cdt.core.model.ILanguage; +import org.eclipse.cdt.core.parser.ParserLanguage; +import org.eclipse.cdt.core.parser.tests.ast2.AST2TemplateTests; +import org.eclipse.cdt.internal.core.parser.ParserException; + +@SuppressWarnings("restriction") +public class LRTemplateTests extends AST2TemplateTests { + + + public static TestSuite suite() { + return suite(LRTemplateTests.class); + } + + + @Override + @SuppressWarnings("unused") + protected IASTTranslationUnit parse( String code, ParserLanguage lang, boolean useGNUExtensions, boolean expectNoProblems, boolean parseComments) throws ParserException { + ILanguage language = lang.isCPP() ? getCPPLanguage() : getC99Language(); + return ParseHelper.parse(code, language, expectNoProblems); + } + + protected ILanguage getC99Language() { + return C99Language.getDefault(); + } + + protected ILanguage getCPPLanguage() { + return ISOCPPLanguage.getDefault(); + } + +} diff --git a/lrparser/org.eclipse.cdt.core.lrparser/.settings/org.eclipse.jdt.core.prefs b/lrparser/org.eclipse.cdt.core.lrparser/.settings/org.eclipse.jdt.core.prefs index 60a01491394..4209c5e180c 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/.settings/org.eclipse.jdt.core.prefs +++ b/lrparser/org.eclipse.cdt.core.lrparser/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,4 @@ -#Fri Apr 25 15:09:24 EDT 2008 +#Wed Apr 30 13:42:53 EDT 2008 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 org.eclipse.jdt.core.compiler.compliance=1.5 @@ -52,7 +52,7 @@ org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedImport=error +org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning org.eclipse.jdt.core.compiler.problem.unusedParameter=warning diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/c99/C99BuildASTParserAction.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/c99/C99BuildASTParserAction.java index d608746d8cc..a0236549548 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/c99/C99BuildASTParserAction.java +++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/c99/C99BuildASTParserAction.java @@ -93,18 +93,14 @@ public class C99BuildASTParserAction extends BuildASTParserAction { } + + private int baseKind(IToken token) { + return tokenMap.mapKind(token.getKind()); + } + @Override protected boolean isCompletionToken(IToken token) { - return asC99Kind(token) == TK_Completion; - } - - - private int asC99Kind(IToken token) { - return asC99Kind(token.getKind()); - } - - private int asC99Kind(int tokenKind) { - return tokenMap.mapKind(tokenKind); + return baseKind(token) == TK_Completion; } @@ -203,7 +199,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction { return; IToken token = (IToken)specifier; - int kind = asC99Kind(token); + int kind = baseKind(token); switch(kind){ case TK_typedef: node.setStorageClass(IASTDeclSpecifier.sc_typedef); return; case TK_extern: node.setStorageClass(IASTDeclSpecifier.sc_extern); return; @@ -245,7 +241,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction { */ private void collectArrayModifierTypeQualifiers(ICASTArrayModifier arrayModifier) { for(Object o : astStack.closeScope()) { - switch(asC99Kind((IToken)o)) { + switch(baseKind((IToken)o)) { case TK_const: arrayModifier.setConst(true); break; case TK_restrict: arrayModifier.setRestrict(true); break; case TK_volatile: arrayModifier.setVolatile(true); break; @@ -350,7 +346,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction { for(Object o : astStack.closeScope()) { IToken token = (IToken)o; - switch(asC99Kind(token)) { + switch(baseKind(token)) { default: assert false; case TK_const: pointer.setConst(true); break; case TK_volatile: pointer.setVolatile(true); break; @@ -500,7 +496,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction { if(o instanceof IToken) { IToken token = (IToken) o; // There is one identifier token on the stack - int kind = asC99Kind(token); + int kind = baseKind(token); if(kind == TK_identifier || kind == TK_Completion) { IASTName name = createName(token); //name.setBinding(binding); @@ -532,7 +528,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction { IASTDeclSpecifier declSpecifier = (IASTDeclSpecifier) astStack.pop(); List ruleTokens = parser.getRuleTokens(); - if(ruleTokens.size() == 1 && asC99Kind(ruleTokens.get(0)) == TK_EndOfCompletion) + if(ruleTokens.size() == 1 && baseKind(ruleTokens.get(0)) == TK_EndOfCompletion) return; // do not generate nodes for extra EOC tokens IASTSimpleDeclaration declaration = nodeFactory.newSimpleDeclaration(declSpecifier); @@ -558,7 +554,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction { // Don't generate declaration nodes for extra EOC tokens // TODO: the token type must be converted - if(asC99Kind(parser.getLeftIToken()) == C99Parsersym.TK_EndOfCompletion) + if(baseKind(parser.getLeftIToken()) == C99Parsersym.TK_EndOfCompletion) return; IASTDeclSpecifier declSpecifier = nodeFactory.newCSimpleDeclSpecifier(); diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPASTAmbiguousDeclarator.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPASTAmbiguousDeclarator.java index f7ff4a1def3..972665e459e 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPASTAmbiguousDeclarator.java +++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPASTAmbiguousDeclarator.java @@ -28,6 +28,7 @@ public class CPPASTAmbiguousDeclarator extends CPPASTAmbiguity implements IASTDe public CPPASTAmbiguousDeclarator(IASTDeclarator ... ds) { + System.out.println("CPPASTAmbiguousDeclarator created"); for(IASTDeclarator declarator : ds) addDeclarator(declarator); } @@ -76,11 +77,10 @@ public class CPPASTAmbiguousDeclarator extends CPPASTAmbiguity implements IASTDe if( scope != null ) { try { - ASTInternal.flushCache(scope); - IScope parentScope = scope.getParent(); // needed to fix bugs - if(parentScope != null) { - ASTInternal.flushCache(parentScope); - } + IScope parentScope = scope; + do { + ASTInternal.flushCache(parentScope); + } while((parentScope = parentScope.getParent()) != null); } catch (DOMException de) {} } } diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPBuildASTParserAction.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPBuildASTParserAction.java index 8fc79cf1268..110e6013eab 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPBuildASTParserAction.java +++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPBuildASTParserAction.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.core.dom.lrparser.action.cpp; import static org.eclipse.cdt.core.parser.util.CollectionUtils.findFirstAndRemove; import static org.eclipse.cdt.core.parser.util.CollectionUtils.reverseIterable; +import static org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parsersym.TK_Completion; import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.*; import java.util.Collections; @@ -88,7 +89,10 @@ import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.LPGTokenAdapter; import org.eclipse.cdt.core.dom.lrparser.action.BuildASTParserAction; +import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; +import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.parser.util.DebugUtil; +import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parsersym; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPExpressionStatementParser; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPNoCastExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPNoFunctionDeclaratorParser; @@ -107,6 +111,8 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator; @SuppressWarnings("restriction") public class CPPBuildASTParserAction extends BuildASTParserAction { + /** Allows code in this class to refer to the token kinds in CPPParsersym */ + private final ITokenMap tokenMap; /** Used to create the AST node objects */ protected final ICPPASTNodeFactory nodeFactory; @@ -119,14 +125,21 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { public CPPBuildASTParserAction(ICPPASTNodeFactory nodeFactory, IParserActionTokenProvider parser, IASTTranslationUnit tu) { super(nodeFactory, parser, tu); this.nodeFactory = nodeFactory; + this.tokenMap = new TokenMap(CPPParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols()); } - + + + private int baseKind(IToken token) { + return tokenMap.mapKind(token.getKind()); + } + @Override protected boolean isCompletionToken(IToken token) { - return token.getKind() == CPPParsersym.TK_Completion; + return baseKind(token) == TK_Completion; } + @Override protected IParser getExpressionStatementParser() { return new CPPExpressionStatementParser(parser.getOrderedTerminalSymbols()); @@ -269,10 +282,10 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { } - private static int asICPPASTSimpleTypeConstructorExpressionType(IToken token) { + private int asICPPASTSimpleTypeConstructorExpressionType(IToken token) { assert token != null; - switch(token.getKind()) { + switch(baseKind(token)) { case TK_char : return ICPPASTSimpleTypeConstructorExpression.t_char; case TK_wchar_t : return ICPPASTSimpleTypeConstructorExpression.t_wchar_t; case TK_bool : return ICPPASTSimpleTypeConstructorExpression.t_bool; @@ -765,7 +778,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { } - private static String createStringRepresentation(List nameTokens) { + private String createStringRepresentation(List nameTokens) { StringBuilder sb = new StringBuilder(); IToken prev = null; for(IToken t : nameTokens) { @@ -778,13 +791,13 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { } - private static boolean needSpaceBetween(IToken prev, IToken iter) { + private boolean needSpaceBetween(IToken prev, IToken iter) { // this logic was copied from BasicTokenDuple.createCharArrayRepresentation() if(prev == null) return false; - int prevKind = prev.getKind(); - int iterKind = iter.getKind(); + int prevKind = baseKind(prev); + int iterKind = baseKind(iter); return prevKind != TK_ColonColon && prevKind != TK_identifier && @@ -1047,8 +1060,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { * object to determine how to set a specifier. */ protected void setSpecifier(ICPPASTDeclSpecifier node, IToken token) { - //TODO int kind = asC99Kind(token) - int kind = token.getKind(); + int kind = baseKind(token); switch(kind){ case TK_typedef: node.setStorageClass(IASTDeclSpecifier.sc_typedef); return; case TK_extern: node.setStorageClass(IASTDeclSpecifier.sc_extern); return; @@ -1082,7 +1094,6 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { case TK_short: n.setShort(true); return; } } - } @@ -1171,8 +1182,8 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { } - private static int getElaboratedTypeSpecifier(IToken token) { - int kind = token.getKind(); + private int getElaboratedTypeSpecifier(IToken token) { + int kind = baseKind(token); switch(kind) { default: assert false : "wrong token kind: " + kind; //$NON-NLS-1$ case TK_struct: return IASTElaboratedTypeSpecifier.k_struct; @@ -1213,7 +1224,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { if(declarators.isEmpty() && declSpecifier instanceof ICPPASTNamedTypeSpecifier && ruleTokens.size() >= 2 && - (nameToken = ruleTokens.get(ruleTokens.size() - 2)).getKind() == TK_identifier) { + baseKind(nameToken = ruleTokens.get(ruleTokens.size() - 2)) == TK_identifier) { declSpecifier = nodeFactory.newSimpleDeclSpecifier(); for(IToken t : ruleTokens.subList(0, ruleTokens.size()-1)) @@ -1246,23 +1257,24 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { public void consumeInitDeclaratorComplete() { if(TRACE_ACTIONS) DebugUtil.printMethodTrace(); - - IASTDeclarator declarator = (IASTDeclarator) astStack.peek(); - if(!(declarator instanceof IASTFunctionDeclarator)) - return; - - IParser secondaryParser = new CPPNoFunctionDeclaratorParser(parser.getOrderedTerminalSymbols()); - IASTNode alternateDeclarator = runSecondaryParser(secondaryParser); - - if(alternateDeclarator == null || alternateDeclarator instanceof IASTProblemDeclaration) - return; - - astStack.pop(); - IASTNode ambiguityNode = new CPPASTAmbiguousDeclarator(declarator, (IASTDeclarator)alternateDeclarator); - - setOffsetAndLength(ambiguityNode); - astStack.push(ambiguityNode); +// System.out.println(parser.getRuleTokens()); +// IASTDeclarator declarator = (IASTDeclarator) astStack.peek(); +// if(!(declarator instanceof IASTFunctionDeclarator)) +// return; +// +// IParser secondaryParser = new CPPNoFunctionDeclaratorParser(parser.getOrderedTerminalSymbols()); +// IASTNode alternateDeclarator = runSecondaryParser(secondaryParser); +// +// if(alternateDeclarator == null || alternateDeclarator instanceof IASTProblemDeclaration) +// return; +// +// astStack.pop(); +// IASTNode ambiguityNode = new CPPASTAmbiguousDeclarator(declarator, (IASTDeclarator)alternateDeclarator); +// +// setOffsetAndLength(ambiguityNode); +// astStack.push(ambiguityNode); +// if(TRACE_AST_STACK) System.out.println(astStack); } @@ -1285,8 +1297,8 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { } - private static int getAccessSpecifier(IToken token) { - int kind = token.getKind(); + private int getAccessSpecifier(IToken token) { + int kind = baseKind(token); switch(kind) { default: assert false : "wrong token kind: " + kind; //$NON-NLS-1$ case TK_private: return ICPPASTVisibilityLabel.v_private; @@ -1396,8 +1408,8 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { } - private static int getCompositeTypeSpecifier(IToken token) { - int kind = token.getKind(); + private int getCompositeTypeSpecifier(IToken token) { + final int kind = baseKind(token); switch(kind) { default: assert false : "wrong token kind: " + kind; //$NON-NLS-1$ case TK_struct: return IASTCompositeTypeSpecifier.k_struct; @@ -1424,10 +1436,10 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { } - private static void addCVQualifiersToPointer(IASTPointer pointer, List tokens) { + private void addCVQualifiersToPointer(IASTPointer pointer, List tokens) { for(Object t : tokens) { IToken token = (IToken) t; - int kind = token.getKind(); // TODO this should be asXXXKind + int kind = baseKind(token); switch(kind) { default : assert false; case TK_const: pointer.setConst(true); break; @@ -1468,7 +1480,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { // find the last double colon by searching for it for(IToken t : reverseIterable(parser.getRuleTokens())) { - if(t.getKind() == TK_ColonColon) { + if(baseKind(t) == TK_ColonColon) { endOffset = endOffset(t); break; } @@ -1518,7 +1530,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { } for(Object token : astStack.closeScope()) { - int kind = ((IToken)token).getKind(); + int kind = baseKind((IToken)token); switch(kind) { default: assert false : "wrong token kind: " + kind; //$NON-NLS-1$ case TK_const: declarator.setConst(true); break; @@ -1713,8 +1725,8 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { if(TRACE_AST_STACK) System.out.println(astStack); } - private static int getTemplateParameterType(IToken token) { - int kind = token.getKind(); + private int getTemplateParameterType(IToken token) { + int kind = baseKind(token); switch(kind) { default: assert false : "wrong token kind: " + kind; //$NON-NLS-1$ case TK_class: return ICPPASTSimpleTypeTemplateParameter.st_class;