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:
parent
8981d60e33
commit
3fea475657
15 changed files with 228 additions and 71 deletions
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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()");
|
||||
|
|
Loading…
Add table
Reference in a new issue