From 0700a8fe6898d2f519d40ab5e9c40306d6cb225d Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 11 Nov 2008 12:00:32 +0000 Subject: [PATCH] Fixes remaining recursions in name resolution, bug 252554. --- .../core/testplugin/util/BaseTestCase.java | 2 +- .../core/dom/parser/cpp/CPPASTNameBase.java | 1 + .../core/dom/parser/cpp/CPPClassScope.java | 14 ++++- .../parser/cpp/semantics/CPPSemantics.java | 56 +++++++++++-------- .../dom/parser/cpp/semantics/CPPVisitor.java | 8 +-- 5 files changed, 51 insertions(+), 30 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java index 7da49e55736..096bc7266d0 100644 --- a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java +++ b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java @@ -56,7 +56,7 @@ public class BaseTestCase extends TestCase { @Override protected void setUp() throws Exception { - CPPASTNameBase.sAllowRecursionBindings= true; + CPPASTNameBase.sAllowRecursionBindings= false; } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNameBase.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNameBase.java index 125e32c41a1..f077e6fe967 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNameBase.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNameBase.java @@ -142,6 +142,7 @@ public abstract class CPPASTNameBase extends ASTNode implements IASTName { } fIsFinal= true; + fResolutionDepth= 0; } public void setBinding(IBinding binding) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java index c75ffe2f3bf..ffb1588ffab 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java @@ -170,10 +170,18 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope { @Override public void addName(IASTName name) throws DOMException { if (name instanceof ICPPASTQualifiedName) { - IASTName ln= ((ICPPASTQualifiedName) name).getLastName(); - if (CPPVisitor.getContainingScope(name) != CPPVisitor.getContainingScope(ln)) { - return; + // check whether the qualification matches + IBinding b= getClassType(); + final ICPPASTQualifiedName qname = (ICPPASTQualifiedName) name; + final IASTName[] names= qname.getNames(); + for (int i = names.length-2; i>=0; i--) { + if (b == null || !CharArrayUtils.equals(names[i].toCharArray(), b.getNameCharArray())) + return; + + b= b.getOwner(); } + if (qname.isFullyQualified() && b != null) + return; } IASTNode parent = name.getParent(); if (parent instanceof IASTDeclarator) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index 7cf7bbb7853..347b680899a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -2566,10 +2566,14 @@ public class CPPSemantics { } public static IBinding[] findBindings(IScope scope, String name, boolean qualified) throws DOMException{ - return findBindings(scope, name.toCharArray(), qualified); + return findBindings(scope, name.toCharArray(), qualified, null); } - - public static IBinding[] findBindings(IScope scope, char[] name, boolean qualified) throws DOMException{ + + public static IBinding[] findBindings(IScope scope, char[] name, boolean qualified) throws DOMException { + return findBindings(scope, name, qualified, null); + } + + public static IBinding[] findBindings(IScope scope, char[] name, boolean qualified, IASTNode beforeNode) throws DOMException{ CPPASTName astName = new CPPASTName(); astName.setName(name); astName.setParent(ASTInternal.getPhysicalNodeOfScope(scope)); @@ -2577,7 +2581,7 @@ public class CPPSemantics { LookupData data = new LookupData(astName); data.forceQualified = qualified; - return standardLookup(data, scope); + return standardLookup(data, scope, beforeNode); } public static IBinding[] findBindingsForContentAssist(IASTName name, boolean prefixLookup) { @@ -2628,7 +2632,7 @@ public class CPPSemantics { return (IBinding[]) ArrayUtil.trim(IBinding.class, result); } - private static IBinding[] standardLookup(LookupData data, Object start) { + private static IBinding[] standardLookup(LookupData data, Object start, IASTNode beforeNode) { try { lookup(data, start); } catch (DOMException e) { @@ -2639,26 +2643,34 @@ public class CPPSemantics { if (items == null) return new IBinding[0]; + boolean indexBased= false; + if (beforeNode != null) { + IASTTranslationUnit tu= beforeNode.getTranslationUnit(); + if (tu != null && tu.getIndex() != null) + indexBased= true; + } ObjectSet set = new ObjectSet(items.length); IBinding binding = null; for (Object item : items) { - if (item instanceof IASTName) { - binding = ((IASTName) item).resolveBinding(); - } else if (item instanceof IBinding) { - binding = (IBinding) item; - } else { - binding = null; - } - - if (binding != null) { - if (binding instanceof ICPPUsingDeclaration) { - set.addAll(((ICPPUsingDeclaration) binding).getDelegates()); - } else if (binding instanceof CPPCompositeBinding) { - set.addAll(((CPPCompositeBinding) binding).getBindings()); - } else { - set.put(binding); - } - } + if (beforeNode == null || declaredBefore(item, beforeNode, indexBased)) { + if (item instanceof IASTName) { + binding = ((IASTName) item).resolveBinding(); + } else if (item instanceof IBinding) { + binding = (IBinding) item; + } else { + binding = null; + } + + if (binding != null) { + if (binding instanceof ICPPUsingDeclaration) { + set.addAll(((ICPPUsingDeclaration) binding).getDelegates()); + } else if (binding instanceof CPPCompositeBinding) { + set.addAll(((CPPCompositeBinding) binding).getBindings()); + } else { + set.put(binding); + } + } + } } return set.keyArray(IBinding.class); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index e5042106c2d..d7327833bb3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -185,8 +185,8 @@ import org.eclipse.cdt.internal.core.index.IIndexScope; * @author aniefer */ public class CPPVisitor extends ASTQueries { - public static final String SIZE_T = "size_t"; //$NON-NLS-1$ - public static final String PTRDIFF_T = "ptrdiff_t"; //$NON-NLS-1$ + public static final char[] SIZE_T = "size_t".toCharArray(); //$NON-NLS-1$ + public static final char[] PTRDIFF_T = "ptrdiff_t".toCharArray(); //$NON-NLS-1$ public static final String STD = "std"; //$NON-NLS-1$ public static final String TYPE_INFO= "type_info"; //$NON-NLS-1$ @@ -1895,7 +1895,7 @@ public class CPPVisitor extends ASTQueries { if (SemanticUtil.getUltimateTypeViaTypedefs(t1) instanceof IPointerType) { IScope scope = getContainingScope(expression); try { - IBinding[] bs = scope.find(PTRDIFF_T); + IBinding[] bs= CPPSemantics.findBindings(scope, PTRDIFF_T, false, expression); if (bs.length > 0) { for (IBinding b : bs) { if (b instanceof IType && CPPSemantics.declaredBefore(b, binary, false)) { @@ -2089,7 +2089,7 @@ public class CPPVisitor extends ASTQueries { private static IType get_SIZE_T(IASTNode sizeofExpr) { IScope scope = getContainingScope(sizeofExpr); try { - IBinding[] bs = scope.find(SIZE_T); + IBinding[] bs = CPPSemantics.findBindings(scope, SIZE_T, false, sizeofExpr); if (bs.length > 0 && bs[0] instanceof IType) { return (IType) bs[0]; }