diff options
Diffstat (limited to 'lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPASTAmbiguousDeclarator.java')
-rw-r--r-- | lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPASTAmbiguousDeclarator.java | 138 |
1 files changed, 138 insertions, 0 deletions
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 new file mode 100644 index 00000000000..339d8e3360a --- /dev/null +++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPASTAmbiguousDeclarator.java @@ -0,0 +1,138 @@ +package org.eclipse.cdt.core.dom.lrparser.action.cpp; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IASTDeclarator; +import org.eclipse.cdt.core.dom.ast.IASTInitializer; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IProblemBinding; +import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; +import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguity; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; + + +public class CPPASTAmbiguousDeclarator extends CPPASTAmbiguity implements IASTDeclarator { + + private List<IASTDeclarator> declarators = new ArrayList<IASTDeclarator>(2); + + public CPPASTAmbiguousDeclarator(IASTDeclarator ... ds) { + for(IASTDeclarator declarator : ds) + addDeclarator(declarator); + } + + @Override + protected IASTNode[] getNodes() { + return declarators.toArray(new IASTDeclarator[declarators.size()]); + } + + + + @Override + public boolean accept(ASTVisitor visitor) { + // this code was copied from CPPASTAmbiguity.accept() and slightly modified. + IASTNode nodeToReplace = this; + IASTAmbiguityParent owner = (IASTAmbiguityParent) getParent(); + + IASTNode[] nodez = getNodes(); + int[] problems = new int[nodez.length]; + + for(int i = 0; i < nodez.length; ++i) { + IASTNode node = nodez[i]; + owner.replace(nodeToReplace, node); + nodeToReplace = node; + + node.accept(visitor); + CPPASTNameCollector nameCollector = new CPPASTNameCollector(); + node.accept(nameCollector); + IASTName[] names = nameCollector.getNames(); + for(IASTName name : names) { + try { + IBinding b = name.resolveBinding(); + if(b == null || b instanceof IProblemBinding) + ++problems[i]; + } catch (Exception t) { + t.printStackTrace(); + ++problems[i]; + } + } + if(names.length > 0) { + IScope scope = CPPVisitor.getContainingScope(names[0]); + if( scope != null ) { + try { + ASTInternal.flushCache(scope); + } catch (DOMException de) {} + } + } + } + int bestIndex = 0; + int bestValue = problems[0]; + for (int i = 1; i < problems.length; ++i) { + if (problems[i] < bestValue) { + bestIndex = i; + bestValue = problems[i]; + } + } + + //IASTAmbiguityParent owner = (IASTAmbiguityParent) getParent(); + owner.replace(nodeToReplace, nodez[bestIndex]); + return true; + } + + public void addDeclarator(IASTDeclarator declarator) { + if(declarator != null) { + declarators.add(declarator); + declarator.setParent(this); + declarator.setPropertyInParent(null); // it really doesn't matter + } + } + + private IASTDeclarator getDefaultDeclarator() { + return declarators.get(0); + } + + public void addPointerOperator(IASTPointerOperator operator) { + getDefaultDeclarator().addPointerOperator(operator); + } + + public void setInitializer(IASTInitializer initializer) { + getDefaultDeclarator().setInitializer(initializer); + } + + public void setName(IASTName name) { + getDefaultDeclarator().setName(name); + } + + public void setNestedDeclarator(IASTDeclarator nested) { + getDefaultDeclarator().setNestedDeclarator(nested); + } + + public IASTInitializer getInitializer() { + return getDefaultDeclarator().getInitializer(); + } + + public IASTName getName() { + return getDefaultDeclarator().getName(); + } + + public IASTDeclarator getNestedDeclarator() { + return getDefaultDeclarator().getNestedDeclarator(); + } + + public IASTPointerOperator[] getPointerOperators() { + return getDefaultDeclarator().getPointerOperators(); + } + + public int getRoleForName(IASTName n) { + return getDefaultDeclarator().getRoleForName(n); + } + + +} |