From 8c9eaf991e2733f56321c3af6d11011e375c2acf Mon Sep 17 00:00:00 2001 From: Andrew Ferguson Date: Thu, 29 Mar 2007 11:57:18 +0000 Subject: [PATCH] 178789: match initial template support in the PDOM --- .../IIndexInternalTemplateParameter.java | 21 ++++++ .../composite/cpp/CPPCompositesFactory.java | 64 ++++++++++++++++++- .../cpp/CompositeCPPClassInstance.java | 34 ++++++++++ .../cpp/CompositeCPPClassSpecialization.java | 34 ++++++++++ .../cpp/CompositeCPPClassTemplate.java | 61 ++++++++++++++++++ ...CPPClassTemplatePartialSpecialization.java | 40 ++++++++++++ ...mpositeCPPClassTemplateSpecialization.java | 61 ++++++++++++++++++ ...CompositeCPPConstructorSpecialization.java | 28 ++++++++ .../CompositeCPPDeferredClassInstance.java | 57 +++++++++++++++++ .../CompositeCPPDeferredFunctionInstance.java | 32 ++++++++++ .../cpp/CompositeCPPFieldSpecialization.java | 33 ++++++++++ .../cpp/CompositeCPPFunctionInstance.java | 32 ++++++++++ .../CompositeCPPFunctionSpecialization.java | 46 +++++++++++++ .../cpp/CompositeCPPFunctionTemplate.java | 50 +++++++++++++++ .../cpp/CompositeCPPMethodSpecialization.java | 46 +++++++++++++ .../CompositeCPPParameterSpecialization.java | 33 ++++++++++ .../CompositeCPPTemplateTypeParameter.java | 46 +++++++++++++ .../cpp/InternalTemplateInstantiatorUtil.java | 36 +++++++++++ .../composite/cpp/TemplateInstanceUtil.java | 64 +++++++++++++++++++ .../pdom/dom/cpp/PDOMCPPOverloaderUtil.java | 8 +-- .../dom/cpp/PDOMCPPTemplateTypeParameter.java | 9 ++- 21 files changed, 829 insertions(+), 6 deletions(-) create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexInternalTemplateParameter.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplatePartialSpecialization.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplateSpecialization.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPConstructorSpecialization.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredFunctionInstance.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldSpecialization.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionInstance.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionSpecialization.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplate.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPMethodSpecialization.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPParameterSpecialization.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/InternalTemplateInstantiatorUtil.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/TemplateInstanceUtil.java diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexInternalTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexInternalTemplateParameter.java new file mode 100644 index 00000000000..5df3a88df6c --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexInternalTemplateParameter.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2007 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.index; + +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; +import org.eclipse.core.runtime.CoreException; + +/** + * This interface is possibly interim. It allows determining the owner of a parameter. + */ +public interface IIndexInternalTemplateParameter { + ICPPBinding getParameterOwner() throws CoreException; +} 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 bf96706003f..f08a30b9ea5 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 @@ -24,10 +24,14 @@ 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.ICPPClassScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; 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.ICPPFunction; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias; @@ -35,6 +39,10 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; +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.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; @@ -95,7 +103,9 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC public IType getCompositeType(IIndexType rtype) throws DOMException { IType result; - if(rtype instanceof ICPPClassType) { + if(rtype instanceof ICPPSpecialization) { + result = (IIndexType) getCompositeBinding((IIndexFragmentBinding) rtype); + } else if(rtype instanceof ICPPClassType) { result = (ICPPClassType) getCompositeBinding((IIndexFragmentBinding) rtype); } else if(rtype instanceof ITypedef) { result = new CompositeCPPTypedef(this, (ICPPBinding) rtype); @@ -113,6 +123,8 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC result = new CompositeArrayType((IArrayType) rtype, this); } else if(rtype == null) { result = null; + } else if(rtype instanceof ICPPTemplateTypeParameter) { + result = (IIndexType) getCompositeBinding((IIndexFragmentBinding) rtype); } else if(rtype instanceof IBasicType) { result = rtype; // no context required its a leaf with no way to traverse upward } else { @@ -141,6 +153,54 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC try { if(binding==null) { result = null; + } else if (binding instanceof ICPPTemplateDefinition) { + if(binding instanceof ICPPClassTemplate) { + return new CompositeCPPClassTemplate(this, (ICPPClassType) binding); + } else if (binding instanceof ICPPFunctionTemplate) { + return new CompositeCPPFunctionTemplate(this, (ICPPFunction) binding); + } else { + throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$ + } + } else if(binding instanceof ICPPSpecialization) { + if(binding instanceof ICPPTemplateInstance) { + if(binding instanceof ICPPDeferredTemplateInstance) { + if(binding instanceof ICPPClassType) { + return new CompositeCPPDeferredClassInstance(this, (ICPPClassType) binding); + } else if(binding instanceof ICPPFunction) { + return new CompositeCPPDeferredFunctionInstance(this, (ICPPFunction) binding); + } else { + throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$ + } + } else { + if(binding instanceof ICPPClassType) { + return new CompositeCPPClassInstance(this, (ICPPClassType) binding); + } if(binding instanceof ICPPFunction) { + return new CompositeCPPFunctionInstance(this, (ICPPFunction) binding); + } else { + throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } else { + if(binding instanceof ICPPClassType) { + if(binding instanceof ICPPClassTemplatePartialSpecialization) { + return new CompositeCPPClassTemplatePartialSpecialization(this, (ICPPClassTemplatePartialSpecialization) binding); + } else { + return new CompositeCPPClassSpecialization(this, (ICPPClassType) binding); + } + } if(binding instanceof ICPPConstructor) { + return new CompositeCPPConstructorSpecialization(this, (ICPPConstructor) binding); + } if(binding instanceof ICPPMethod) { + return new CompositeCPPMethodSpecialization(this, (ICPPMethod) binding); + } if(binding instanceof ICPPFunction) { + return new CompositeCPPFunctionSpecialization(this, (ICPPFunction) binding); + } if(binding instanceof ICPPField) { + return new CompositeCPPField(this, (ICPPField) binding); + } if(binding instanceof ICPPParameter) { + return new CompositeCPPParameter(this, (ICPPParameter) 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) { @@ -168,6 +228,8 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC 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 { throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$ } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java new file mode 100644 index 00000000000..429c8f7481c --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2007 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.index.composite.cpp; + +import org.eclipse.cdt.core.dom.ast.IBinding; +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.ICPPTemplateInstance; +import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.index.IIndexType; +import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; + +public class CompositeCPPClassInstance extends CompositeCPPClassType implements +ICPPClassType, IIndexType, ICPPTemplateInstance, ICPPSpecialization { + + public CompositeCPPClassInstance(ICompositesFactory cf, ICPPClassType rbinding) { + super(cf, rbinding); + } + + public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); } + public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } + public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, rbinding); } + public ICPPTemplateDefinition getTemplateDefinition() { return TemplateInstanceUtil.getTemplateDefinition(cf, rbinding); } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java new file mode 100644 index 00000000000..d49e54f5e53 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2007 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.index.composite.cpp; + +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.index.IIndexType; +import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; + +public class CompositeCPPClassSpecialization extends CompositeCPPClassType implements + IIndexType, ICPPSpecialization { + + public CompositeCPPClassSpecialization(ICompositesFactory cf, ICPPClassType rbinding) { + super(cf, rbinding); + } + + public ObjectMap getArgumentMap() { + return TemplateInstanceUtil.getArgumentMap(cf, rbinding); + } + + public IBinding getSpecializedBinding() { + return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java new file mode 100644 index 00000000000..29266b27ab0 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright (c) 2007 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.index.composite.cpp; + +import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; +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.ICPPTemplateParameter; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; +import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; +import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; + +public class CompositeCPPClassTemplate extends CompositeCPPClassType implements +ICPPClassTemplate, ICPPInternalTemplateInstantiator{ + + public CompositeCPPClassTemplate(ICompositesFactory cf, ICPPClassType ct) { + super(cf, ct); + } + + public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() + throws DOMException { + ICPPClassTemplatePartialSpecialization[] result= ((ICPPClassTemplate)rbinding).getPartialSpecializations(); + for(int i=0; i