diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java index dfeed588e6e..43216d4cb93 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java @@ -31,7 +31,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; -import org.eclipse.cdt.internal.core.index.IIndexType; /** * @author aniefer @@ -122,10 +121,8 @@ public class CPPClassInstance extends CPPInstance implements ICPPClassType { public boolean isSameType(IType type) { if (type == this) return true; - if (type instanceof ITypedef || type instanceof IIndexType) + if (type instanceof ITypedef) return type.isSameType(this); - if (type instanceof ICPPDeferredClassInstance) - return type.isSameType(this); // the CPPDeferredClassInstance has some fuzziness if (type instanceof ICPPTemplateInstance) { ICPPClassType ct1= (ICPPClassType) getSpecializedBinding(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java index ffd4f879a29..b87f9cb5308 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java @@ -16,11 +16,10 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -58,18 +57,32 @@ public class CPPDeferredClassInstance extends CPPUnknownClass implements ICPPDef if (type == this) return true; + if (type instanceof ITypedef) + return type.isSameType(this); + // allow some fuzziness here. ICPPClassTemplate classTemplate = getClassTemplate(); if (type instanceof ICPPDeferredClassInstance) { - ICPPClassTemplate typeClass = - (ICPPClassTemplate) ((ICPPDeferredTemplateInstance) type).getSpecializedBinding(); - return typeClass == classTemplate; - } else if (type instanceof ICPPClassTemplate && classTemplate == type) { + final ICPPDeferredClassInstance rhs = (ICPPDeferredClassInstance) type; + if (!classTemplate.isSameType((IType) rhs.getSpecializedBinding())) + return false; + + IType[] lhsArgs= getArguments(); + IType[] rhsArgs= rhs.getArguments(); + if (lhsArgs != rhsArgs) { + if (lhsArgs == null || rhsArgs == null) + return false; + + if (lhsArgs.length != rhsArgs.length) + return false; + + for (int i= 0; i < lhsArgs.length; i++) { + if (!lhsArgs[i].isSameType(rhsArgs[i])) + return false; + } + } return true; - } else if (type instanceof ICPPTemplateInstance && - ((ICPPTemplateInstance) type).getTemplateDefinition() == classTemplate) { - return true; - } + } return false; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java index 0feb3c9a2a9..744aa9136d3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java @@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; @@ -26,6 +27,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectMap; /** @@ -88,7 +90,25 @@ public class CPPUnknownClass extends CPPUnknownBinding implements ICPPUnknownCla } public boolean isSameType(IType type) { - return type == this; + if (this == type) + return true; + + if (type instanceof ITypedef) + return type.isSameType(this); + + if (type instanceof ICPPUnknownClassType + && type instanceof ICPPUnknownClassInstance == false + && type instanceof ICPPDeferredClassInstance == false) { + ICPPUnknownClassType rhs= (ICPPUnknownClassType) type; + if (CharArrayUtils.equals(getNameCharArray(), rhs.getNameCharArray())) { + final ICPPUnknownBinding lhsContainer = getUnknownContainerBinding(); + final ICPPUnknownBinding rhsContainer = rhs.getUnknownContainerBinding(); + if (lhsContainer instanceof IType && rhsContainer instanceof IType) { + return ((IType)lhsContainer).isSameType((IType) rhsContainer); + } + } + } + return false; } public ICPPClassType[] getNestedClasses() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java index 4cc7a835f1d..41356f4e3cf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java @@ -14,7 +14,9 @@ import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -48,4 +50,40 @@ public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPUnkn public String toString() { return getName() + " <" + ASTTypeUtil.getTypeListString(arguments) + ">"; //$NON-NLS-1$ //$NON-NLS-2$ } + + @Override + public boolean isSameType(IType type) { + if (this == type) + return true; + + if (type instanceof ITypedef) { + return type.isSameType(this); + } + + if (type instanceof ICPPUnknownClassInstance) { + ICPPUnknownClassInstance rhs= (ICPPUnknownClassInstance) type; + if (CharArrayUtils.equals(getNameCharArray(), rhs.getNameCharArray())) { + IType[] lhsArgs= getArguments(); + IType[] rhsArgs= rhs.getArguments(); + if (lhsArgs != rhsArgs) { + if (lhsArgs == null || rhsArgs == null) + return false; + + if (lhsArgs.length != rhsArgs.length) + return false; + + for (int i= 0; i < lhsArgs.length; i++) { + if (!lhsArgs[i].isSameType(rhsArgs[i])) + return false; + } + } + final ICPPUnknownBinding lhsContainer = getUnknownContainerBinding(); + final ICPPUnknownBinding rhsContainer = rhs.getUnknownContainerBinding(); + if (lhsContainer instanceof IType && rhsContainer instanceof IType) { + return (((IType)lhsContainer).isSameType((IType) rhsContainer)); + } + } + } + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java index 4caef5155de..7993c0dae3c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java @@ -11,12 +11,18 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; +import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; -public class CompositeCPPTemplateTypeParameter extends CompositeCPPBinding implements ICPPTemplateTypeParameter, IIndexType { +public class CompositeCPPTemplateTypeParameter extends CompositeCPPBinding + implements ICPPTemplateTypeParameter, ICPPUnknownBinding, IIndexType { public CompositeCPPTemplateTypeParameter(ICompositesFactory cf, ICPPTemplateTypeParameter binding) { super(cf, binding); @@ -35,4 +41,21 @@ public class CompositeCPPTemplateTypeParameter extends CompositeCPPBinding imple public Object clone() { fail(); return null; } + + public ICPPScope getUnknownScope() { + return null; + } + + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap, ICPPScope instantiationScope) { + // Cannot do resolution here since the result is not necessarily a binding. + return null; + } + + public IASTName getUnknownName() { + return null; + } + + public ICPPUnknownBinding getUnknownContainerBinding() { + return null; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java index 1d090bcd0b0..f587e8b417a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java @@ -143,6 +143,6 @@ class CompositeCPPUnknownClassType extends CompositeCPPBinding implements ICPPUn } public ICPPUnknownBinding getUnknownContainerBinding() { - return ((ICPPUnknownClassType) rbinding).getUnknownContainerBinding(); + return (ICPPUnknownBinding) cf.getCompositeBinding((IIndexFragmentBinding) ((ICPPUnknownClassType) rbinding).getUnknownContainerBinding()); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java index c66e3d643ae..5f9923cdf6f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java @@ -42,7 +42,6 @@ import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPClassSpecializationScope; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; @@ -129,16 +128,15 @@ class PDOMCPPClassInstance extends PDOMCPPInstance implements } public boolean isSameType(IType type) { - if (type instanceof PDOMNode) { - PDOMNode node = (PDOMNode) type; - if (node.getPDOM() == getPDOM() && node.getRecord() == getRecord()) { - return true; - } - } if (type instanceof ITypedef) return ((ITypedef)type).isSameType(this); - if (type instanceof ICPPDeferredClassInstance) - return type.isSameType(this); //the CPPDeferredClassInstance has some fuzziness + + if (type instanceof PDOMNode) { + PDOMNode node= (PDOMNode) type; + if (node.getPDOM() == getPDOM()) { + return node.getRecord() == getRecord(); + } + } if (type instanceof ICPPTemplateInstance) { ICPPClassType ct1= (ICPPClassType) getSpecializedBinding(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java index d91c5f85de7..f3df5aa737e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java @@ -234,10 +234,10 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements if( type instanceof ITypedef ) return type.isSameType( this ); - if( type instanceof PDOMNode ) { - PDOMNode node = (PDOMNode) type; - if (node.getPDOM() == getPDOM() && node.getRecord() == getRecord()) { - return true; + if (type instanceof PDOMNode) { + PDOMNode node= (PDOMNode) type; + if (node.getPDOM() == getPDOM()) { + return node.getRecord() == getRecord(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java index 06959cfaa36..4408286c240 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java @@ -317,6 +317,13 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType return type.isSameType(this); } + if (type instanceof PDOMNode) { + PDOMNode node= (PDOMNode) type; + if (node.getPDOM() == getPDOM()) { + return node.getRecord() == getRecord(); + } + } + try { if (type instanceof ICPPClassTemplate && !(type instanceof ProblemBinding)) { boolean same= !(type instanceof ICPPClassTemplatePartialSpecialization); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java index 5d231328108..8ae47aa4e2f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java @@ -18,11 +18,11 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; @@ -89,25 +89,39 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPInstance implements ICPPDeferr } public boolean isSameType(IType type) { + if (type instanceof ITypedef) { + return type.isSameType(this); + } if (type instanceof PDOMNode) { PDOMNode node = (PDOMNode) type; - if (node.getPDOM() == getPDOM() && node.getRecord() == getRecord()) { - return true; + if (node.getPDOM() == getPDOM()) { + return node.getRecord() == getRecord(); } } ICPPClassTemplate classTemplate = (ICPPClassTemplate) getTemplateDefinition(); - //allow some fuzziness here. if (type instanceof ICPPDeferredClassInstance) { - ICPPClassTemplate typeClass = (ICPPClassTemplate) ((ICPPDeferredTemplateInstance)type).getSpecializedBinding(); - return typeClass == classTemplate; - } else if (type instanceof ICPPClassTemplate && classTemplate == type) { + final ICPPDeferredClassInstance rhs = (ICPPDeferredClassInstance) type; + if (!classTemplate.isSameType((IType) rhs.getSpecializedBinding())) + return false; + + IType[] lhsArgs= getArguments(); + IType[] rhsArgs= rhs.getArguments(); + if (lhsArgs != rhsArgs) { + if (lhsArgs == null || rhsArgs == null) + return false; + + if (lhsArgs.length != rhsArgs.length) + return false; + + for (int i= 0; i < lhsArgs.length; i++) { + if (!lhsArgs[i].isSameType(rhsArgs[i])) + return false; + } + } return true; - } else if (type instanceof ICPPTemplateInstance && - ((ICPPTemplateInstance)type).getTemplateDefinition() == classTemplate) { - return true; - } + } return false; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 3f1a0297cdc..d76cbb3e134 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -70,6 +70,7 @@ import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; @@ -692,6 +693,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { // all instances are stored with their template definition if (binding instanceof ICPPTemplateInstance) { scopeBinding= ((ICPPTemplateInstance) binding).getTemplateDefinition(); + } else if (binding instanceof ICPPUnknownClassType && + binding instanceof ICPPDeferredClassInstance == false) { + // the parent of an unknown class can be a template parameter, which is not a scope + scopeBinding= ((ICPPUnknownClassType) binding).getUnknownContainerBinding(); } else { IScope scope = binding.getScope(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java index 84e7dcd756e..c4531e35ef9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java @@ -17,16 +17,11 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression; -import org.eclipse.cdt.core.dom.ast.IASTName; -import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; -import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -39,7 +34,7 @@ import org.eclipse.core.runtime.CoreException; * @author Bryan Wilkinson */ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMemberOwner, - ICPPTemplateNonTypeParameter, ICPPUnknownBinding, IIndexType { + ICPPTemplateNonTypeParameter, IIndexType { private static final int MEMBERLIST = PDOMCPPVariable.RECORD_SIZE + 4; @@ -116,23 +111,7 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe public Object clone() { fail(); return null; } - public ICPPScope getUnknownScope() { - return null; - } - public IASTExpression getDefault() { return null; } - - public IASTName getUnknownName() { - return null; - } - - public ICPPUnknownBinding getUnknownContainerBinding() { - return null; - } - - public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap, ICPPScope instantiationScope) { - return null; - } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java index 0fe38f47d2f..0e037621ca5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java @@ -21,7 +21,9 @@ import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClassInstance; @@ -118,4 +120,44 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP public String toString() { return getName() + " <" + ASTTypeUtil.getTypeListString(getArguments()) + ">"; //$NON-NLS-1$ //$NON-NLS-2$ } + + @Override + public boolean isSameType(IType type) { + if (type instanceof ITypedef) { + return type.isSameType(this); + } + + if (type instanceof PDOMNode) { + PDOMNode node= (PDOMNode) type; + if (node.getPDOM() == getPDOM()) { + return node.getRecord() == getRecord(); + } + } + + if (type instanceof ICPPUnknownClassInstance) { + ICPPUnknownClassInstance rhs= (ICPPUnknownClassInstance) type; + if (CharArrayUtils.equals(getNameCharArray(), rhs.getNameCharArray())) { + IType[] lhsArgs= getArguments(); + IType[] rhsArgs= rhs.getArguments(); + if (lhsArgs != rhsArgs) { + if (lhsArgs == null || rhsArgs == null) + return false; + + if (lhsArgs.length != rhsArgs.length) + return false; + + for (int i= 0; i < lhsArgs.length; i++) { + if (!lhsArgs[i].isSameType(rhsArgs[i])) + return false; + } + } + final ICPPUnknownBinding lhsContainer = getUnknownContainerBinding(); + final ICPPUnknownBinding rhsContainer = rhs.getUnknownContainerBinding(); + if (lhsContainer instanceof IType && rhsContainer instanceof IType) { + return (((IType)lhsContainer).isSameType((IType) rhsContainer)); + } + } + } + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java index 074f17a5c06..20bba92f2af 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java @@ -12,13 +12,13 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.dom.IPDOMVisitor; -import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; @@ -28,11 +28,14 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFileSet; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClass; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassType; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; @@ -239,7 +242,30 @@ class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, * @see org.eclipse.cdt.core.dom.ast.IType#isSameType(org.eclipse.cdt.core.dom.ast.IType) */ public boolean isSameType(IType type) { - return type == this; + if (type instanceof ITypedef) { + return type.isSameType(this); + } + + if (type instanceof PDOMNode) { + PDOMNode node= (PDOMNode) type; + if (node.getPDOM() == getPDOM()) { + return node.getRecord() == getRecord(); + } + } + + if (type instanceof ICPPUnknownClassType + && type instanceof ICPPUnknownClassInstance == false + && type instanceof ICPPDeferredClassInstance == false) { + ICPPUnknownClassType rhs= (ICPPUnknownClassType) type; + if (CharArrayUtils.equals(getNameCharArray(), rhs.getNameCharArray())) { + final ICPPUnknownBinding lhsContainer = getUnknownContainerBinding(); + final ICPPUnknownBinding rhsContainer = rhs.getUnknownContainerBinding(); + if (lhsContainer instanceof IType && rhsContainer instanceof IType) { + return ((IType)lhsContainer).isSameType((IType) rhsContainer); + } + } + } + return false; } public ICPPClassType[] getNestedClasses() { @@ -253,11 +279,6 @@ class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, return new CPPUnknownClass(parentBinding, getUnknownName()); } - @Override - public String toString() { - return ASTTypeUtil.getType(this); - } - public IASTName getUnknownName() { return new CPPASTName(getNameCharArray()); } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CppCallHierarchyTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CppCallHierarchyTest.java index fb0662ef1b0..4f9e499638a 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CppCallHierarchyTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CppCallHierarchyTest.java @@ -146,7 +146,7 @@ public class CppCallHierarchyTest extends CallHierarchyBaseTest { TreeViewer tv = getCHTreeViewer(); TreeItem item= checkTreeNode(tv.getTree(), 0, "MyClass::method3()"); - TreeItem nextItem= checkTreeNode(item, 0, "MyClass::method2()"); + TreeItem nextItem= checkTreeNode(tv.getTree(), 0, 0, "MyClass::method2()"); checkTreeNode(item, 1, null); item= nextItem; tv.setExpandedState(item.getData(), true); nextItem= checkTreeNode(item, 0, "MyClass::method1()");