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

207840: PDOM non type template parameters (fix)

This commit is contained in:
Andrew Ferguson 2008-05-08 09:05:30 +00:00
parent 457b9eae1d
commit 642e523cf3
5 changed files with 33 additions and 12 deletions

View file

@ -40,6 +40,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
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.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
@ -1187,6 +1188,7 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa
ICPPClassType b1= getBindingFromASTName("A<y>", 1, ICPPClassType.class, ICPPTemplateDefinition.class);
ICPPTemplateInstance b2= getBindingFromASTName("A<y>", 4, ICPPTemplateInstance.class, ICPPClassType.class);
ObjectMap args= b2.getArgumentMap();
assertInstance(args.keyAt(0), ICPPTemplateNonTypeParameter.class);
assertEquals(1, args.size());
}
}

View file

@ -43,6 +43,7 @@ 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.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
@ -239,6 +240,14 @@ public class CPPCompositesFactory extends AbstractCompositeFactory {
} else {
throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$
}
} else if(binding instanceof ICPPTemplateParameter) {
if (binding instanceof ICPPTemplateTypeParameter) {
result = new CompositeCPPTemplateTypeParameter(this, (ICPPTemplateTypeParameter) binding);
} else if (binding instanceof ICPPTemplateNonTypeParameter) {
result = new CompositeCPPTemplateNonTypeParameter(this, (ICPPTemplateNonTypeParameter) binding);
} else {
throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$
}
} else if (binding instanceof ICPPParameter) {
result = new CompositeCPPParameter(this, (ICPPParameter) binding);
} else if (binding instanceof ICPPField) {
@ -272,10 +281,6 @@ public class CPPCompositesFactory extends AbstractCompositeFactory {
result = new CompositeCPPEnumerator(this, (IEnumerator) binding);
} else if (binding instanceof ITypedef) {
result = new CompositeCPPTypedef(this, (ICPPBinding) binding);
} else if (binding instanceof ICPPTemplateTypeParameter) {
result = new CompositeCPPTemplateTypeParameter(this, (ICPPTemplateTypeParameter) binding);
} else if (binding instanceof ICPPTemplateNonTypeParameter) {
result = new CompositeCPPTemplateNonTypeParameter(this, (ICPPTemplateNonTypeParameter) binding);
} else if (binding instanceof IIndexMacroContainer) {
result= new CompositeMacroContainer(this, binding);
} else {

View file

@ -311,7 +311,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
return false;
}
private PDOMBinding createBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException {
PDOMBinding createBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException {
PDOMBinding pdomBinding= null;
if (binding instanceof ICPPSpecialization) {

View file

@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
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.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.index.IIndexScope;
@ -54,10 +55,10 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements
protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 16;
public PDOMCPPSpecialization(PDOM pdom, PDOMNode parent, ICPPSpecialization spec, PDOMNamedNode specialized)
throws CoreException {
throws CoreException {
super(pdom, parent, spec.getNameCharArray());
pdom.getDB().putInt(record + SPECIALIZED, specialized.getRecord());
PDOMNodeLinkedList paramList = new PDOMNodeLinkedList(pdom, record + ARGMAP_PARAMS, getLinkageImpl());
PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGMAP_ARGS, getLinkageImpl());
ObjectMap argMap = spec.getArgumentMap();
@ -65,9 +66,22 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements
for (int i = 0; i < argMap.size(); i++) {
Object param = argMap.keyAt(i);
Object arg = argMap.getAt(i);
/* TODO: allow template non-type parameters once they have been
* implemented in the PDOM
*/
// TODO - non-type template arguments still needs attention
if (param instanceof ICPPTemplateNonTypeParameter && arg instanceof IType) {
try {
ICPPTemplateNonTypeParameter nontype= (ICPPTemplateNonTypeParameter) param;
PDOMNode paramNode= ((PDOMCPPLinkage)getLinkageImpl()).createBinding(this, nontype);
PDOMNode argNode= getLinkageImpl().addType(this, (IType) arg);
if (paramNode != null && argNode != null) {
paramList.addMember(paramNode);
argList.addMember(argNode);
}
} catch(DOMException de) {
CCorePlugin.log(de);
}
}
if (param instanceof IType && arg instanceof IType) {
PDOMNode paramNode = getLinkageImpl().addType(this, (IType) param);
PDOMNode argNode = getLinkageImpl().addType(this, (IType) arg);
@ -175,7 +189,7 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements
return false;
}
/* (non-Javadoc)
/*
* For debug purposes only
*/
@Override

View file

@ -65,7 +65,7 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe
@Override
public int getNodeType() {
return IIndexCPPBindingConstants.CPP_TEMPLATE_TYPE_PARAMETER;
return IIndexCPPBindingConstants.CPP_TEMPLATE_NON_TYPE_PARAMETER;
}
@Override