mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 22:52:11 +02:00
Make ambiguity resolution part of ASTTranslationUnit, bug 259373.
This commit is contained in:
parent
eb5caf452e
commit
46a72bfdbf
8 changed files with 75 additions and 37 deletions
|
@ -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(){
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<IASTNode> fDeferredNodes;
|
||||
final IASTNode fNode;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue