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

CPPUnknownClassInstance is no template definition, bug 229300.

This commit is contained in:
Markus Schorn 2008-04-29 14:03:57 +00:00
parent ecc3a9b7a9
commit c9453efbf7
6 changed files with 9 additions and 140 deletions

View file

@ -15,11 +15,8 @@ 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.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
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.ICPPTemplateParameter;
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;
@ -29,8 +26,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
* @author Sergey Prigogin * @author Sergey Prigogin
*/ */
public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPInternalUnknownClassInstance { public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPInternalUnknownClassInstance {
private ICPPClassTemplatePartialSpecialization[] partialSpecializations;
private ObjectMap instances;
private final IType[] arguments; private final IType[] arguments;
public CPPUnknownClassInstance(ICPPInternalUnknown scopeBinding, IASTName name, IType[] arguments) { public CPPUnknownClassInstance(ICPPInternalUnknown scopeBinding, IASTName name, IType[] arguments) {
@ -38,65 +33,6 @@ public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPInte
this.arguments = arguments; this.arguments = arguments;
} }
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations()
throws DOMException {
return partialSpecializations;
}
public ICPPTemplateParameter[] getTemplateParameters() throws DOMException {
return ICPPTemplateParameter.EMPTY_TEMPLATE_PARAMETER_ARRAY;
}
public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) {
partialSpecializations = (ICPPClassTemplatePartialSpecialization[]) ArrayUtil.append(
ICPPClassTemplatePartialSpecialization.class, partialSpecializations, spec);
}
public void addSpecialization(IType[] arguments, ICPPSpecialization specialization) {
if (arguments == null)
return;
for (int i = 0; i < arguments.length; i++) {
if (arguments[i] == null)
return;
}
if (instances == null)
instances = new ObjectMap(2);
instances.put(arguments, specialization);
}
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
ICPPSpecialization instance = getInstance(arguments);
if (instance == null) {
instance = new CPPDeferredClassInstance(this, argMap, arguments);
addSpecialization(arguments, instance);
}
return instance;
}
public ICPPSpecialization getInstance(IType[] arguments) {
if (instances == null)
return null;
for (int i = 0; i < instances.size(); i++) {
IType[] args = (IType[]) instances.keyAt(i);
if (args.length == arguments.length) {
int j = 0;
for (; j < args.length; j++) {
if (!args[j].isSameType(arguments[j]))
break;
}
if (j == args.length) {
return (ICPPSpecialization) instances.getAt(i);
}
}
}
return null;
}
public IBinding instantiate(IType[] arguments) {
return deferredInstance(null, arguments);
}
public IType[] getArguments() { public IType[] getArguments() {
return arguments; return arguments;
} }

View file

@ -11,14 +11,12 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
/* /*
* Represents a partially instantiated C++ class template, declaration of which is not yet available. * Represents a partially instantiated C++ class template, declaration of which is not yet available.
* *
* @author Sergey Prigogin * @author Sergey Prigogin
*/ */
public interface ICPPInternalUnknownClassInstance extends ICPPClassTemplate, ICPPInternalClassTemplate, public interface ICPPInternalUnknownClassInstance extends ICPPInternalUnknownClassType {
ICPPInternalUnknownClassType {
public IType[] getArguments(); public IType[] getArguments();
} }

View file

@ -226,9 +226,7 @@ public class CPPCompositesFactory extends AbstractCompositeFactory {
} }
} }
} else if (binding instanceof ICPPTemplateDefinition) { } else if (binding instanceof ICPPTemplateDefinition) {
if (binding instanceof ICPPInternalUnknownClassInstance) { if (binding instanceof ICPPClassTemplate) {
result = new CompositeCPPUnknownClassInstance(this, (ICPPInternalUnknownClassInstance) binding);
} else if (binding instanceof ICPPClassTemplate) {
ICPPClassType def= (ICPPClassType) findOneBinding(binding); ICPPClassType def= (ICPPClassType) findOneBinding(binding);
return new CompositeCPPClassTemplate(this, def); return new CompositeCPPClassTemplate(this, def);
} else if (binding instanceof ICPPConstructor) { } else if (binding instanceof ICPPConstructor) {
@ -246,6 +244,8 @@ public class CPPCompositesFactory extends AbstractCompositeFactory {
result = new CompositeCPPField(this, (ICPPField) binding); result = new CompositeCPPField(this, (ICPPField) binding);
} else if (binding instanceof ICPPVariable) { } else if (binding instanceof ICPPVariable) {
result = new CompositeCPPVariable(this, (ICPPVariable) binding); result = new CompositeCPPVariable(this, (ICPPVariable) binding);
} else if (binding instanceof ICPPInternalUnknownClassInstance) {
result = new CompositeCPPUnknownClassInstance(this, (ICPPInternalUnknownClassInstance) binding);
} else if (binding instanceof ICPPInternalUnknownClassType) { } else if (binding instanceof ICPPInternalUnknownClassType) {
result = new CompositeCPPUnknownClassType(this, (ICPPInternalUnknownClassType) binding); result = new CompositeCPPUnknownClassType(this, (ICPPInternalUnknownClassType) binding);
} else if (binding instanceof ICPPClassType) { } else if (binding instanceof ICPPClassType) {

View file

@ -14,10 +14,8 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException; 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.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
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.ICPPTemplateParameter;
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.ICPPInternalUnknownClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
@ -45,32 +43,6 @@ class CompositeCPPUnknownClassInstance extends CompositeCPPUnknownClassType
} }
return arguments; return arguments;
} }
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException {
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
}
public ICPPTemplateParameter[] getTemplateParameters() throws DOMException {
return ICPPTemplateParameter.EMPTY_TEMPLATE_PARAMETER_ARRAY;
}
public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) {
}
public void addSpecialization(IType[] arguments, ICPPSpecialization specialization) {
}
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
return InternalTemplateInstantiatorUtil.deferredInstance(argMap, arguments, cf, rbinding);
}
public ICPPSpecialization getInstance(IType[] arguments) {
return InternalTemplateInstantiatorUtil.getInstance(arguments, cf, this);
}
public IBinding instantiate(IType[] args) {
return InternalTemplateInstantiatorUtil.instantiate(args, cf, rbinding);
}
@Override @Override
public IBinding resolveUnknown(ObjectMap argMap) throws DOMException { public IBinding resolveUnknown(ObjectMap argMap) throws DOMException {

View file

@ -358,13 +358,11 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
} else if (binding instanceof ICPPFunction) { } else if (binding instanceof ICPPFunction) {
pdomBinding = new PDOMCPPFunction(pdom, parent, (ICPPFunction) binding, true); pdomBinding = new PDOMCPPFunction(pdom, parent, (ICPPFunction) binding, true);
} else if (binding instanceof ICPPClassTemplate) { } else if (binding instanceof ICPPClassTemplate) {
pdomBinding= new PDOMCPPClassTemplate(pdom, parent, (ICPPClassTemplate) binding);
} else if (binding instanceof ICPPClassType) {
if (binding instanceof ICPPInternalUnknownClassInstance) { if (binding instanceof ICPPInternalUnknownClassInstance) {
pdomBinding= new PDOMCPPUnknownClassInstance(pdom, parent, (ICPPInternalUnknownClassInstance) binding); pdomBinding= new PDOMCPPUnknownClassInstance(pdom, parent, (ICPPInternalUnknownClassInstance) binding);
} else { } else if (binding instanceof ICPPInternalUnknown) {
pdomBinding= new PDOMCPPClassTemplate(pdom, parent, (ICPPClassTemplate) binding);
}
} else if (binding instanceof ICPPClassType) {
if (binding instanceof ICPPInternalUnknown) {
pdomBinding= new PDOMCPPUnknownClassType(pdom, parent, (ICPPInternalUnknownClassType) binding); pdomBinding= new PDOMCPPUnknownClassType(pdom, parent, (ICPPInternalUnknownClassType) binding);
} else { } else {
pdomBinding= new PDOMCPPClassType(pdom, parent, (ICPPClassType) binding); pdomBinding= new PDOMCPPClassType(pdom, parent, (ICPPClassType) binding);

View file

@ -22,13 +22,10 @@ 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.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
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.ICPPTemplateParameter;
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.CPPDeferredClassInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClassInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassInstance;
@ -59,8 +56,8 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType
PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl());
IType[] args = classInstance.getArguments(); IType[] args = classInstance.getArguments();
for (int i = 0; i < args.length; i++) { for (IType arg : args) {
PDOMNode typeNode = getLinkageImpl().addType(this, args[i]); PDOMNode typeNode = getLinkageImpl().addType(this, arg);
if (typeNode != null) if (typeNode != null)
list.addMember(typeNode); list.addMember(typeNode);
} }
@ -109,38 +106,6 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType
return arguments; return arguments;
} }
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations()
throws DOMException {
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
}
public ICPPTemplateParameter[] getTemplateParameters() throws DOMException {
return ICPPTemplateParameter.EMPTY_TEMPLATE_PARAMETER_ARRAY;
}
public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) {
}
public void addSpecialization(IType[] arguments, ICPPSpecialization specialization) {
}
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
ICPPSpecialization instance = getInstance(arguments);
if (instance == null) {
instance = new CPPDeferredClassInstance(this, argMap, arguments);
addSpecialization(arguments, instance);
}
return instance;
}
public ICPPSpecialization getInstance(IType[] arguments) {
return null;
}
public IBinding instantiate(IType[] arguments) {
return deferredInstance(null, arguments);
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#resolveUnknown(org.eclipse.cdt.core.parser.util.ObjectMap) * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#resolveUnknown(org.eclipse.cdt.core.parser.util.ObjectMap)
*/ */