From 46a72bfdbfbd81f02f1b6f12d52d2379df107dc9 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 16 Jan 2009 16:11:16 +0000 Subject: [PATCH] Make ambiguity resolution part of ASTTranslationUnit, bug 259373. --- .../core/dom/parser/ASTTranslationUnit.java | 11 +++- .../parser/AbstractGNUSourceCodeParser.java | 10 ++-- .../dom/parser/c/CASTTranslationUnit.java | 6 +++ .../parser/cpp/CPPASTAmbiguityResolver.java | 2 +- .../dom/parser/cpp/CPPASTTranslationUnit.java | 6 +++ .../lrparser/action/BuildASTParserAction.java | 8 +-- .../action/c99/C99BuildASTParserAction.java | 16 ++---- .../action/cpp/CPPBuildASTParserAction.java | 53 ++++++++++++++++--- 8 files changed, 75 insertions(+), 37 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTTranslationUnit.java index 4c595e618b0..070a8a02ad2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTTranslationUnit.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTTranslationUnit.java @@ -352,9 +352,16 @@ public abstract class ASTTranslationUnit extends ASTNode implements IASTTranslat } /** - * @since 5.0 + * Must be called by the parser, before the ast is passed to the clients. */ - public void cleanupAfterAmbiguityResolution() { + public void resolveAmbiguities() { + accept(createAmbiguityNodeVisitor()); + cleanupAfterAmbiguityResolution(); + } + + protected abstract ASTVisitor createAmbiguityNodeVisitor(); + + protected void cleanupAfterAmbiguityResolution() { // clear bindings (see bug 232811) accept(new ASTVisitor(){ { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java index 67ae36ce576..663b219f51f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java @@ -78,7 +78,6 @@ import org.eclipse.cdt.core.parser.OffsetLimitReachedException; import org.eclipse.cdt.core.parser.ParseError; import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.util.CharArrayUtils; -import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; import org.eclipse.cdt.internal.core.parser.scanner.ILocationResolver; /** @@ -507,10 +506,9 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { protected void resolveAmbiguities() { final IASTTranslationUnit translationUnit = getTranslationUnit(); - translationUnit.accept(createAmbiguityNodeVisitor()); - if (translationUnit instanceof ASTTranslationUnit) { - ((ASTTranslationUnit)translationUnit).cleanupAfterAmbiguityResolution(); - } + if (translationUnit instanceof ASTTranslationUnit) { + ((ASTTranslationUnit) translationUnit).resolveAmbiguities(); + } } protected abstract ASTVisitor createAmbiguityNodeVisitor(); @@ -1475,7 +1473,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { if (LT(1) != IToken.tLBRACE) throwBacktrack(LA(1)); - final IASTDeclarator fdtor= CVisitor.findTypeRelevantDeclarator(dtor); + final IASTDeclarator fdtor= ASTQueries.findTypeRelevantDeclarator(dtor); if (dtor instanceof IASTFunctionDeclarator == false) throwBacktrack(offset, LA(1).getEndOffset() - offset); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java index 1171a817588..9aa4886f5bb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java @@ -14,6 +14,7 @@ package org.eclipse.cdt.internal.core.dom.parser.c; import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.IName; +import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.EScopeKind; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; @@ -87,4 +88,9 @@ public class CASTTranslationUnit extends ASTTranslationUnit { public ILinkage getLinkage() { return Linkage.C_LINKAGE; } + + @Override + protected ASTVisitor createAmbiguityNodeVisitor() { + return new CASTAmbiguityResolver(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguityResolver.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguityResolver.java index 752bac3bc70..780843abfd5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguityResolver.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguityResolver.java @@ -34,7 +34,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; /** * Visitor to resolve ast ambiguities in the right order */ -public final class CPPASTAmbiguityResolver extends ASTVisitor { +final class CPPASTAmbiguityResolver extends ASTVisitor { private static class ClassContext { ArrayList fDeferredNodes; final IASTNode fNode; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java index 20c9408ab37..2f5ecb9ed1c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ILinkage; +import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTName; @@ -190,4 +191,9 @@ public class CPPASTTranslationUnit extends ASTTranslationUnit implements ICPPAST public void handleAdditionalDirectives(ICPPNamespaceScope scope) { fScopeMapper.handleAdditionalDirectives(scope); } + + @Override + protected ASTVisitor createAmbiguityNodeVisitor() { + return new CPPASTAmbiguityResolver(); + } } diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/BuildASTParserAction.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/BuildASTParserAction.java index 94df5f97748..401388ec4da 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/BuildASTParserAction.java +++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/BuildASTParserAction.java @@ -18,7 +18,6 @@ import java.util.List; import lpg.lpgjavaruntime.IToken; -import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration; import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator; import org.eclipse.cdt.core.dom.ast.IASTArrayModifier; @@ -160,16 +159,11 @@ public abstract class BuildASTParserAction extends AbstractParserAction { * @see AbstractGNUSourceCodeParser#resolveAmbiguities() */ private void resolveAmbiguityNodes() { - tu.accept(createAmbiguityNodeVisitor()); if (tu instanceof ASTTranslationUnit) { - ((ASTTranslationUnit)tu).cleanupAfterAmbiguityResolution(); + ((ASTTranslationUnit)tu).resolveAmbiguities(); } } - - protected abstract ASTVisitor createAmbiguityNodeVisitor(); - - /** * Consumes a single identifier token. */ 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 cdb81619f88..825794313e3 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 @@ -11,18 +11,17 @@ package org.eclipse.cdt.core.dom.lrparser.action.c99; -import static org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parsersym.*; import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.endOffset; import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.length; -import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.offset; import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.matchTokens; +import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.offset; +import static org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parsersym.*; import java.util.Collections; import java.util.List; import lpg.lpgjavaruntime.IToken; -import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; @@ -50,7 +49,6 @@ import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTWhileStatement; -import org.eclipse.cdt.core.dom.ast.c.ICNodeFactory; import org.eclipse.cdt.core.dom.ast.c.ICASTArrayDesignator; import org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier; import org.eclipse.cdt.core.dom.ast.c.ICASTCompositeTypeSpecifier; @@ -62,6 +60,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTPointer; import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTTypeIdInitializerExpression; import org.eclipse.cdt.core.dom.ast.c.ICASTTypedefNameSpecifier; +import org.eclipse.cdt.core.dom.ast.c.ICNodeFactory; import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator; import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; @@ -75,11 +74,9 @@ import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99ExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99NoCastExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parsersym; import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99SizeofExpressionParser; -import org.eclipse.cdt.internal.core.dom.parser.ASTAmbiguousNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousExpression; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement; -import org.eclipse.cdt.internal.core.dom.parser.c.CASTAmbiguityResolver; import org.eclipse.cdt.internal.core.dom.parser.c.CASTAmbiguousExpression; import org.eclipse.cdt.internal.core.dom.parser.c.CASTAmbiguousStatement; @@ -740,11 +737,4 @@ public class C99BuildASTParserAction extends BuildASTParserAction { protected IASTAmbiguousStatement createAmbiguousStatement(IASTStatement... statements) { return new CASTAmbiguousStatement(statements); } - - @Override - protected ASTVisitor createAmbiguityNodeVisitor() { - return new CASTAmbiguityResolver(); - } - - } \ No newline at end of file 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 aa5d43d261f..a80fead2b3e 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 @@ -16,7 +16,51 @@ import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.matchTokens; import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.offset; 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.cpp.CPPParsersym.*; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_ColonColon; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_Completion; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_EndOfCompletion; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_GT; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_LT; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_LeftBracket; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_LeftParen; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_RightBracket; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_RightParen; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_Tilde; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_auto; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_bool; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_char; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_class; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_const; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_delete; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_double; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_enum; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_explicit; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_extern; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_float; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_for; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_friend; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_identifier; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_inline; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_int; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_long; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_mutable; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_new; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_private; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_protected; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_public; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_register; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_short; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_signed; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_static; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_struct; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_typedef; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_typename; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_union; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_unsigned; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_virtual; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_void; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_volatile; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_wchar_t; import java.util.Arrays; import java.util.Collections; @@ -25,7 +69,6 @@ import java.util.List; import lpg.lpgjavaruntime.IToken; -import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; @@ -111,7 +154,6 @@ import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPTemplateTypeParameterPa import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousExpression; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguityResolver; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousDeclarator; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousExpression; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousStatement; @@ -1792,9 +1834,4 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { protected IASTAmbiguousStatement createAmbiguousStatement(IASTStatement... statements) { return new CPPASTAmbiguousStatement(statements); } - - @Override - protected ASTVisitor createAmbiguityNodeVisitor() { - return new CPPASTAmbiguityResolver(); - } } \ No newline at end of file