1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fixes a bunch of IType.isSameType() implementations.

This commit is contained in:
Markus Schorn 2008-05-14 17:32:30 +00:00
parent 8981d60e33
commit 3fea475657
15 changed files with 228 additions and 71 deletions

View file

@ -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.ArrayUtil;
import org.eclipse.cdt.core.parser.util.ObjectMap; 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.dom.parser.cpp.semantics.CPPTemplates;
import org.eclipse.cdt.internal.core.index.IIndexType;
/** /**
* @author aniefer * @author aniefer
@ -122,10 +121,8 @@ public class CPPClassInstance extends CPPInstance implements ICPPClassType {
public boolean isSameType(IType type) { public boolean isSameType(IType type) {
if (type == this) if (type == this)
return true; return true;
if (type instanceof ITypedef || type instanceof IIndexType) if (type instanceof ITypedef)
return type.isSameType(this); return type.isSameType(this);
if (type instanceof ICPPDeferredClassInstance)
return type.isSameType(this); // the CPPDeferredClassInstance has some fuzziness
if (type instanceof ICPPTemplateInstance) { if (type instanceof ICPPTemplateInstance) {
ICPPClassType ct1= (ICPPClassType) getSpecializedBinding(); ICPPClassType ct1= (ICPPClassType) getSpecializedBinding();

View file

@ -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.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; 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.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.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; 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.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; 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) if (type == this)
return true; return true;
if (type instanceof ITypedef)
return type.isSameType(this);
// allow some fuzziness here. // allow some fuzziness here.
ICPPClassTemplate classTemplate = getClassTemplate(); ICPPClassTemplate classTemplate = getClassTemplate();
if (type instanceof ICPPDeferredClassInstance) { if (type instanceof ICPPDeferredClassInstance) {
ICPPClassTemplate typeClass = final ICPPDeferredClassInstance rhs = (ICPPDeferredClassInstance) type;
(ICPPClassTemplate) ((ICPPDeferredTemplateInstance) type).getSpecializedBinding(); if (!classTemplate.isSameType((IType) rhs.getSpecializedBinding()))
return typeClass == classTemplate; return false;
} else if (type instanceof ICPPClassTemplate && classTemplate == type) {
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; return true;
} else if (type instanceof ICPPTemplateInstance && }
((ICPPTemplateInstance) type).getTemplateDefinition() == classTemplate) {
return true;
}
return false; return false;
} }

View file

@ -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.IField;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; 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.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.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; 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.core.parser.util.ObjectMap;
/** /**
@ -88,7 +90,25 @@ public class CPPUnknownClass extends CPPUnknownBinding implements ICPPUnknownCla
} }
public boolean isSameType(IType type) { 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() { public ICPPClassType[] getNestedClasses() {

View file

@ -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.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; 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.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.core.parser.util.ObjectMap; 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.dom.parser.cpp.semantics.CPPTemplates;
@ -48,4 +50,40 @@ public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPUnkn
public String toString() { public String toString() {
return getName() + " <" + ASTTypeUtil.getTypeListString(arguments) + ">"; //$NON-NLS-1$ //$NON-NLS-2$ 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;
}
} }

View file

@ -11,12 +11,18 @@
package org.eclipse.cdt.internal.core.index.composite.cpp; package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; 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.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; 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.IIndexType;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; 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) { public CompositeCPPTemplateTypeParameter(ICompositesFactory cf, ICPPTemplateTypeParameter binding) {
super(cf, binding); super(cf, binding);
@ -35,4 +41,21 @@ public class CompositeCPPTemplateTypeParameter extends CompositeCPPBinding imple
public Object clone() { public Object clone() {
fail(); return null; 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;
}
} }

View file

@ -143,6 +143,6 @@ class CompositeCPPUnknownClassType extends CompositeCPPBinding implements ICPPUn
} }
public ICPPUnknownBinding getUnknownContainerBinding() { public ICPPUnknownBinding getUnknownContainerBinding() {
return ((ICPPUnknownClassType) rbinding).getUnknownContainerBinding(); return (ICPPUnknownBinding) cf.getCompositeBinding((IIndexFragmentBinding) ((ICPPUnknownClassType) rbinding).getUnknownContainerBinding());
} }
} }

View file

@ -42,7 +42,6 @@ import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.ObjectMap; 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.CPPClassScope;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPClassSpecializationScope; 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.CPPSemantics;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
@ -129,16 +128,15 @@ class PDOMCPPClassInstance extends PDOMCPPInstance implements
} }
public boolean isSameType(IType type) { 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) if (type instanceof ITypedef)
return ((ITypedef)type).isSameType(this); 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) { if (type instanceof ICPPTemplateInstance) {
ICPPClassType ct1= (ICPPClassType) getSpecializedBinding(); ICPPClassType ct1= (ICPPClassType) getSpecializedBinding();

View file

@ -234,10 +234,10 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements
if( type instanceof ITypedef ) if( type instanceof ITypedef )
return type.isSameType( this ); return type.isSameType( this );
if( type instanceof PDOMNode ) { if (type instanceof PDOMNode) {
PDOMNode node = (PDOMNode) type; PDOMNode node= (PDOMNode) type;
if (node.getPDOM() == getPDOM() && node.getRecord() == getRecord()) { if (node.getPDOM() == getPDOM()) {
return true; return node.getRecord() == getRecord();
} }
} }

View file

@ -317,6 +317,13 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
return type.isSameType(this); return type.isSameType(this);
} }
if (type instanceof PDOMNode) {
PDOMNode node= (PDOMNode) type;
if (node.getPDOM() == getPDOM()) {
return node.getRecord() == getRecord();
}
}
try { try {
if (type instanceof ICPPClassTemplate && !(type instanceof ProblemBinding)) { if (type instanceof ICPPClassTemplate && !(type instanceof ProblemBinding)) {
boolean same= !(type instanceof ICPPClassTemplatePartialSpecialization); boolean same= !(type instanceof ICPPClassTemplatePartialSpecialization);

View file

@ -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.IField;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; 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.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
@ -89,25 +89,39 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPInstance implements ICPPDeferr
} }
public boolean isSameType(IType type) { public boolean isSameType(IType type) {
if (type instanceof ITypedef) {
return type.isSameType(this);
}
if (type instanceof PDOMNode) { if (type instanceof PDOMNode) {
PDOMNode node = (PDOMNode) type; PDOMNode node = (PDOMNode) type;
if (node.getPDOM() == getPDOM() && node.getRecord() == getRecord()) { if (node.getPDOM() == getPDOM()) {
return true; return node.getRecord() == getRecord();
} }
} }
ICPPClassTemplate classTemplate = (ICPPClassTemplate) getTemplateDefinition(); ICPPClassTemplate classTemplate = (ICPPClassTemplate) getTemplateDefinition();
//allow some fuzziness here.
if (type instanceof ICPPDeferredClassInstance) { if (type instanceof ICPPDeferredClassInstance) {
ICPPClassTemplate typeClass = (ICPPClassTemplate) ((ICPPDeferredTemplateInstance)type).getSpecializedBinding(); final ICPPDeferredClassInstance rhs = (ICPPDeferredClassInstance) type;
return typeClass == classTemplate; if (!classTemplate.isSameType((IType) rhs.getSpecializedBinding()))
} else if (type instanceof ICPPClassTemplate && classTemplate == type) { 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; return true;
} else if (type instanceof ICPPTemplateInstance && }
((ICPPTemplateInstance)type).getTemplateDefinition() == classTemplate) {
return true;
}
return false; return false;
} }

View file

@ -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.ASTInternal;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; 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.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.ICPPInternalUnknownScope;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; 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.ICPPUnknownClassInstance;
@ -692,6 +693,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
// all instances are stored with their template definition // all instances are stored with their template definition
if (binding instanceof ICPPTemplateInstance) { if (binding instanceof ICPPTemplateInstance) {
scopeBinding= ((ICPPTemplateInstance) binding).getTemplateDefinition(); 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 { else {
IScope scope = binding.getScope(); IScope scope = binding.getScope();

View file

@ -17,16 +17,11 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTExpression; 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.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; 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.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; 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.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.IIndexCPPBindingConstants;
import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.PDOM;
@ -39,7 +34,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Bryan Wilkinson * @author Bryan Wilkinson
*/ */
class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMemberOwner, class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMemberOwner,
ICPPTemplateNonTypeParameter, ICPPUnknownBinding, IIndexType { ICPPTemplateNonTypeParameter, IIndexType {
private static final int MEMBERLIST = PDOMCPPVariable.RECORD_SIZE + 4; 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 Object clone() { fail(); return null; }
public ICPPScope getUnknownScope() {
return null;
}
public IASTExpression getDefault() { public IASTExpression getDefault() {
return null; return null;
} }
public IASTName getUnknownName() {
return null;
}
public ICPPUnknownBinding getUnknownContainerBinding() {
return null;
}
public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap, ICPPScope instantiationScope) {
return null;
}
} }

View file

@ -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.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; 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.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.core.parser.util.ObjectMap; 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.CPPASTName;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClassInstance;
@ -118,4 +120,44 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP
public String toString() { public String toString() {
return getName() + " <" + ASTTypeUtil.getTypeListString(getArguments()) + ">"; //$NON-NLS-1$ //$NON-NLS-2$ 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;
}
} }

View file

@ -12,13 +12,13 @@
package org.eclipse.cdt.internal.core.pdom.dom.cpp; package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.dom.IPDOMVisitor; 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.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; 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.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexFileSet; 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.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.Util; 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.CPPASTName;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClass; 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.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.ICPPUnknownClassType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; 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) * @see org.eclipse.cdt.core.dom.ast.IType#isSameType(org.eclipse.cdt.core.dom.ast.IType)
*/ */
public boolean isSameType(IType type) { 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() { public ICPPClassType[] getNestedClasses() {
@ -253,11 +279,6 @@ class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope,
return new CPPUnknownClass(parentBinding, getUnknownName()); return new CPPUnknownClass(parentBinding, getUnknownName());
} }
@Override
public String toString() {
return ASTTypeUtil.getType(this);
}
public IASTName getUnknownName() { public IASTName getUnknownName() {
return new CPPASTName(getNameCharArray()); return new CPPASTName(getNameCharArray());
} }

View file

@ -146,7 +146,7 @@ public class CppCallHierarchyTest extends CallHierarchyBaseTest {
TreeViewer tv = getCHTreeViewer(); TreeViewer tv = getCHTreeViewer();
TreeItem item= checkTreeNode(tv.getTree(), 0, "MyClass::method3()"); 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; checkTreeNode(item, 1, null); item= nextItem;
tv.setExpandedState(item.getData(), true); tv.setExpandedState(item.getData(), true);
nextItem= checkTreeNode(item, 0, "MyClass::method1()"); nextItem= checkTreeNode(item, 0, "MyClass::method1()");