diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index 94208783f16..c703efffcd7 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -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", 1, ICPPClassType.class, ICPPTemplateDefinition.class); ICPPTemplateInstance b2= getBindingFromASTName("A", 4, ICPPTemplateInstance.class, ICPPClassType.class); ObjectMap args= b2.getArgumentMap(); + assertInstance(args.keyAt(0), ICPPTemplateNonTypeParameter.class); assertEquals(1, args.size()); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java index ff582630ca1..115a9cb80bf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java @@ -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 { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 83beecd0039..fcf269bd8b7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -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) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java index cbf49a5f814..4e74bf11ad6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java @@ -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 diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java index 8174cd18f50..0aa5bf49087 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java @@ -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