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:
parent
ecc3a9b7a9
commit
c9453efbf7
6 changed files with 9 additions and 140 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
@ -46,32 +44,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 {
|
||||||
IBinding result = super.resolveUnknown(argMap);
|
IBinding result = super.resolveUnknown(argMap);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue