mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Fixes remaining recursions in name resolution, bug 252554.
This commit is contained in:
parent
c656d4d2ee
commit
0700a8fe68
5 changed files with 51 additions and 30 deletions
|
@ -56,7 +56,7 @@ public class BaseTestCase extends TestCase {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void setUp() throws Exception {
|
protected void setUp() throws Exception {
|
||||||
CPPASTNameBase.sAllowRecursionBindings= true;
|
CPPASTNameBase.sAllowRecursionBindings= false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -142,6 +142,7 @@ public abstract class CPPASTNameBase extends ASTNode implements IASTName {
|
||||||
}
|
}
|
||||||
|
|
||||||
fIsFinal= true;
|
fIsFinal= true;
|
||||||
|
fResolutionDepth= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBinding(IBinding binding) {
|
public void setBinding(IBinding binding) {
|
||||||
|
|
|
@ -170,10 +170,18 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope {
|
||||||
@Override
|
@Override
|
||||||
public void addName(IASTName name) throws DOMException {
|
public void addName(IASTName name) throws DOMException {
|
||||||
if (name instanceof ICPPASTQualifiedName) {
|
if (name instanceof ICPPASTQualifiedName) {
|
||||||
IASTName ln= ((ICPPASTQualifiedName) name).getLastName();
|
// check whether the qualification matches
|
||||||
if (CPPVisitor.getContainingScope(name) != CPPVisitor.getContainingScope(ln)) {
|
IBinding b= getClassType();
|
||||||
return;
|
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();
|
IASTNode parent = name.getParent();
|
||||||
if (parent instanceof IASTDeclarator) {
|
if (parent instanceof IASTDeclarator) {
|
||||||
|
|
|
@ -2566,10 +2566,14 @@ public class CPPSemantics {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IBinding[] findBindings(IScope scope, String name, boolean qualified) throws DOMException{
|
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();
|
CPPASTName astName = new CPPASTName();
|
||||||
astName.setName(name);
|
astName.setName(name);
|
||||||
astName.setParent(ASTInternal.getPhysicalNodeOfScope(scope));
|
astName.setParent(ASTInternal.getPhysicalNodeOfScope(scope));
|
||||||
|
@ -2577,7 +2581,7 @@ public class CPPSemantics {
|
||||||
|
|
||||||
LookupData data = new LookupData(astName);
|
LookupData data = new LookupData(astName);
|
||||||
data.forceQualified = qualified;
|
data.forceQualified = qualified;
|
||||||
return standardLookup(data, scope);
|
return standardLookup(data, scope, beforeNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IBinding[] findBindingsForContentAssist(IASTName name, boolean prefixLookup) {
|
public static IBinding[] findBindingsForContentAssist(IASTName name, boolean prefixLookup) {
|
||||||
|
@ -2628,7 +2632,7 @@ public class CPPSemantics {
|
||||||
return (IBinding[]) ArrayUtil.trim(IBinding.class, result);
|
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 {
|
try {
|
||||||
lookup(data, start);
|
lookup(data, start);
|
||||||
} catch (DOMException e) {
|
} catch (DOMException e) {
|
||||||
|
@ -2639,26 +2643,34 @@ public class CPPSemantics {
|
||||||
if (items == null)
|
if (items == null)
|
||||||
return new IBinding[0];
|
return new IBinding[0];
|
||||||
|
|
||||||
|
boolean indexBased= false;
|
||||||
|
if (beforeNode != null) {
|
||||||
|
IASTTranslationUnit tu= beforeNode.getTranslationUnit();
|
||||||
|
if (tu != null && tu.getIndex() != null)
|
||||||
|
indexBased= true;
|
||||||
|
}
|
||||||
ObjectSet<IBinding> set = new ObjectSet<IBinding>(items.length);
|
ObjectSet<IBinding> set = new ObjectSet<IBinding>(items.length);
|
||||||
IBinding binding = null;
|
IBinding binding = null;
|
||||||
for (Object item : items) {
|
for (Object item : items) {
|
||||||
if (item instanceof IASTName) {
|
if (beforeNode == null || declaredBefore(item, beforeNode, indexBased)) {
|
||||||
binding = ((IASTName) item).resolveBinding();
|
if (item instanceof IASTName) {
|
||||||
} else if (item instanceof IBinding) {
|
binding = ((IASTName) item).resolveBinding();
|
||||||
binding = (IBinding) item;
|
} else if (item instanceof IBinding) {
|
||||||
} else {
|
binding = (IBinding) item;
|
||||||
binding = null;
|
} else {
|
||||||
}
|
binding = null;
|
||||||
|
}
|
||||||
if (binding != null) {
|
|
||||||
if (binding instanceof ICPPUsingDeclaration) {
|
if (binding != null) {
|
||||||
set.addAll(((ICPPUsingDeclaration) binding).getDelegates());
|
if (binding instanceof ICPPUsingDeclaration) {
|
||||||
} else if (binding instanceof CPPCompositeBinding) {
|
set.addAll(((ICPPUsingDeclaration) binding).getDelegates());
|
||||||
set.addAll(((CPPCompositeBinding) binding).getBindings());
|
} else if (binding instanceof CPPCompositeBinding) {
|
||||||
} else {
|
set.addAll(((CPPCompositeBinding) binding).getBindings());
|
||||||
set.put(binding);
|
} else {
|
||||||
}
|
set.put(binding);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return set.keyArray(IBinding.class);
|
return set.keyArray(IBinding.class);
|
||||||
|
|
|
@ -185,8 +185,8 @@ import org.eclipse.cdt.internal.core.index.IIndexScope;
|
||||||
* @author aniefer
|
* @author aniefer
|
||||||
*/
|
*/
|
||||||
public class CPPVisitor extends ASTQueries {
|
public class CPPVisitor extends ASTQueries {
|
||||||
public static final String SIZE_T = "size_t"; //$NON-NLS-1$
|
public static final char[] SIZE_T = "size_t".toCharArray(); //$NON-NLS-1$
|
||||||
public static final String PTRDIFF_T = "ptrdiff_t"; //$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 STD = "std"; //$NON-NLS-1$
|
||||||
public static final String TYPE_INFO= "type_info"; //$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) {
|
if (SemanticUtil.getUltimateTypeViaTypedefs(t1) instanceof IPointerType) {
|
||||||
IScope scope = getContainingScope(expression);
|
IScope scope = getContainingScope(expression);
|
||||||
try {
|
try {
|
||||||
IBinding[] bs = scope.find(PTRDIFF_T);
|
IBinding[] bs= CPPSemantics.findBindings(scope, PTRDIFF_T, false, expression);
|
||||||
if (bs.length > 0) {
|
if (bs.length > 0) {
|
||||||
for (IBinding b : bs) {
|
for (IBinding b : bs) {
|
||||||
if (b instanceof IType && CPPSemantics.declaredBefore(b, binary, false)) {
|
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) {
|
private static IType get_SIZE_T(IASTNode sizeofExpr) {
|
||||||
IScope scope = getContainingScope(sizeofExpr);
|
IScope scope = getContainingScope(sizeofExpr);
|
||||||
try {
|
try {
|
||||||
IBinding[] bs = scope.find(SIZE_T);
|
IBinding[] bs = CPPSemantics.findBindings(scope, SIZE_T, false, sizeofExpr);
|
||||||
if (bs.length > 0 && bs[0] instanceof IType) {
|
if (bs.length > 0 && bs[0] instanceof IType) {
|
||||||
return (IType) bs[0];
|
return (IType) bs[0];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue