mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 22:52:11 +02:00
Bug 516338 - Have ICPPAliasTemplateInstance implement ICPPTemplateInstance
This allows querying alias template instances for their arguments (for e.g. instantiating dependent arguments later). Change-Id: I7cc3dfcef75fe0faf104dc7bfe11e2acd90a4748
This commit is contained in:
parent
8d6cab41e7
commit
e374b4b08e
9 changed files with 149 additions and 42 deletions
|
@ -20,9 +20,10 @@ import org.eclipse.cdt.core.dom.ast.ITypedef;
|
|||
* @noextend This interface is not intended to be extended by clients.
|
||||
* @noimplement This interface is not intended to be implemented by clients.
|
||||
*/
|
||||
public interface ICPPAliasTemplateInstance extends ITypedef, ICPPBinding {
|
||||
public interface ICPPAliasTemplateInstance extends ITypedef, ICPPTemplateInstance {
|
||||
/**
|
||||
* Returns the alias template specialized by this instance.
|
||||
*/
|
||||
@Override
|
||||
public ICPPAliasTemplate getTemplateDefinition();
|
||||
}
|
||||
|
|
|
@ -21,27 +21,28 @@ import org.eclipse.cdt.core.dom.ast.IScope;
|
|||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
|
||||
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
|
||||
import org.eclipse.core.runtime.PlatformObject;
|
||||
|
||||
public class CPPAliasTemplateInstance extends PlatformObject
|
||||
implements ICPPAliasTemplateInstance, ITypeContainer, ICPPInternalBinding {
|
||||
private final char[] name;
|
||||
private final ICPPAliasTemplate aliasTemplate;
|
||||
public class CPPAliasTemplateInstance extends CPPSpecialization implements ICPPAliasTemplateInstance,
|
||||
ITypeContainer {
|
||||
private IType aliasedType;
|
||||
private ICPPTemplateArgument[] fArguments;
|
||||
|
||||
public CPPAliasTemplateInstance(char[] name, ICPPAliasTemplate aliasTemplate, IType aliasedType) {
|
||||
this.name = name;
|
||||
this.aliasTemplate = aliasTemplate;
|
||||
public CPPAliasTemplateInstance(ICPPAliasTemplate aliasTemplate, IType aliasedType, IBinding owner,
|
||||
ICPPTemplateParameterMap argumentMap, ICPPTemplateArgument[] arguments) {
|
||||
super(aliasTemplate, owner, argumentMap);
|
||||
this.aliasedType = aliasedType;
|
||||
this.fArguments = arguments;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICPPAliasTemplate getTemplateDefinition() {
|
||||
return aliasTemplate;
|
||||
return (ICPPAliasTemplate) super.getSpecializedBinding();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -80,6 +81,7 @@ public class CPPAliasTemplateInstance extends PlatformObject
|
|||
|
||||
@Override
|
||||
public char[] getNameCharArray() {
|
||||
char[] name = getTemplateDefinition().getNameCharArray();
|
||||
if (name != null) {
|
||||
return name;
|
||||
}
|
||||
|
@ -93,16 +95,16 @@ public class CPPAliasTemplateInstance extends PlatformObject
|
|||
|
||||
@Override
|
||||
public IBinding getOwner() {
|
||||
if (aliasTemplate != null) {
|
||||
return aliasTemplate.getOwner();
|
||||
if (getTemplateDefinition() != null) {
|
||||
return getTemplateDefinition().getOwner();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IScope getScope() throws DOMException {
|
||||
if (aliasTemplate != null) {
|
||||
return aliasTemplate.getScope();
|
||||
if (getTemplateDefinition() != null) {
|
||||
return getTemplateDefinition().getScope();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -119,13 +121,13 @@ public class CPPAliasTemplateInstance extends PlatformObject
|
|||
|
||||
@Override
|
||||
public boolean isGloballyQualified() throws DOMException {
|
||||
return aliasTemplate.isGloballyQualified();
|
||||
return getTemplateDefinition().isGloballyQualified();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IASTNode getDefinition() {
|
||||
if (aliasTemplate instanceof ICPPInternalBinding) {
|
||||
return ((ICPPInternalBinding) aliasTemplate).getDefinition();
|
||||
if (getTemplateDefinition() instanceof ICPPInternalBinding) {
|
||||
return ((ICPPInternalBinding) getTemplateDefinition()).getDefinition();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -150,4 +152,15 @@ public class CPPAliasTemplateInstance extends PlatformObject
|
|||
public String toString() {
|
||||
return ASTTypeUtil.getQualifiedName(this) + " -> " + ASTTypeUtil.getType(aliasedType, true); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICPPTemplateArgument[] getTemplateArguments() {
|
||||
return fArguments;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isExplicitSpecialization() {
|
||||
// Alias templates cannot have explicit specializations.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -852,7 +852,7 @@ public class CPPTemplates {
|
|||
IBinding owner, IASTNode point) {
|
||||
InstantiationContext context = createInstantiationContext(parameterMap, owner, point);
|
||||
IType instantiatedType = instantiateType(aliasedType, context);
|
||||
return new CPPAliasTemplateInstance(aliasTemplate.getNameCharArray(), aliasTemplate, instantiatedType);
|
||||
return new CPPAliasTemplateInstance(aliasTemplate, instantiatedType, owner, parameterMap, args);
|
||||
}
|
||||
|
||||
static boolean isClassTemplate(ICPPASTTemplateId id) {
|
||||
|
|
|
@ -10,8 +10,11 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.index;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
|
||||
|
||||
/**
|
||||
* Delegating clone implementation for index classes implementing {@link ICPPAliasTemplateInstance} interface.
|
||||
|
@ -26,8 +29,32 @@ public class CPPAliasTemplateInstanceClone extends CPPTypedefClone implements IC
|
|||
return new CPPAliasTemplateInstanceClone(this);
|
||||
}
|
||||
|
||||
private ICPPAliasTemplateInstance getDelegate() {
|
||||
return (ICPPAliasTemplateInstance) delegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICPPAliasTemplate getTemplateDefinition() {
|
||||
return ((ICPPAliasTemplateInstance) delegate).getTemplateDefinition();
|
||||
return getDelegate().getTemplateDefinition();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICPPTemplateArgument[] getTemplateArguments() {
|
||||
return getDelegate().getTemplateArguments();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isExplicitSpecialization() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBinding getSpecializedBinding() {
|
||||
return getDelegate().getSpecializedBinding();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICPPTemplateParameterMap getTemplateParameterMap() {
|
||||
return getDelegate().getTemplateParameterMap();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,6 +54,7 @@ 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.ICPPTemplateParameterMap;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUnaryTypeTransformation;
|
||||
|
@ -237,7 +238,12 @@ public class CPPCompositesFactory extends AbstractCompositeFactory {
|
|||
if (aliasTemplate instanceof IIndexFragmentBinding)
|
||||
aliasTemplate = (ICPPAliasTemplate) getCompositeBinding((IIndexFragmentBinding) aliasTemplate);
|
||||
IType aliasedType = getCompositeType(instance.getType());
|
||||
return new CPPAliasTemplateInstance(instance.getNameCharArray(), aliasTemplate, aliasedType);
|
||||
IBinding owner = instance.getOwner();
|
||||
if (owner instanceof IIndexFragmentBinding)
|
||||
owner = getCompositeBinding((IIndexFragmentBinding) owner);
|
||||
ICPPTemplateArgument[] args = TemplateInstanceUtil.convert(this, instance.getTemplateArguments());
|
||||
ICPPTemplateParameterMap map = TemplateInstanceUtil.getTemplateParameterMap(this, instance);
|
||||
return new CPPAliasTemplateInstance(aliasTemplate, aliasedType, owner, map, args);
|
||||
}
|
||||
if (rtype instanceof TypeOfDependentExpression) {
|
||||
TypeOfDependentExpression type= (TypeOfDependentExpression) rtype;
|
||||
|
@ -580,6 +586,8 @@ public class CPPCompositesFactory extends AbstractCompositeFactory {
|
|||
return new CompositeCPPFieldInstance(this, (ICPPVariableInstance) binding);
|
||||
} else if (binding instanceof ICPPVariable) {
|
||||
return new CompositeCPPVariableInstance(this, (ICPPVariableInstance) binding);
|
||||
} else if (binding instanceof ICPPAliasTemplateInstance) {
|
||||
return new CompositeCPPAliasTemplateInstance(this, (ICPPAliasTemplateInstance) binding);
|
||||
} else {
|
||||
throw new CompositingNotImplementedError("Composite binding unavailable for " + binding + " " + binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
|
|
|
@ -13,11 +13,13 @@ package org.eclipse.cdt.internal.core.index.composite.cpp;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.internal.core.index.CPPAliasTemplateInstanceClone;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
|
||||
|
||||
class CompositeCPPAliasTemplateInstance extends CompositeCPPTypedef implements ICPPAliasTemplateInstance {
|
||||
class CompositeCPPAliasTemplateInstance extends CompositeCPPTypedefSpecialization implements ICPPAliasTemplateInstance {
|
||||
public CompositeCPPAliasTemplateInstance(ICompositesFactory cf, ICPPBinding delegate) {
|
||||
super(cf, delegate);
|
||||
}
|
||||
|
@ -32,4 +34,14 @@ class CompositeCPPAliasTemplateInstance extends CompositeCPPTypedef implements I
|
|||
public Object clone() {
|
||||
return new CPPAliasTemplateInstanceClone(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICPPTemplateArgument[] getTemplateArguments() {
|
||||
return TemplateInstanceUtil.getTemplateArguments(cf, (ICPPTemplateInstance) rbinding);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isExplicitSpecialization() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -288,10 +288,11 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
* 208.0 - Trigger index rebuild to rebuild corrupted binding reference lists, bug 399147.
|
||||
* 209.0 - Alias templates and their instances take up more space than required, bug 516385.
|
||||
* 210.0 - Return type deduction, bug 408470.
|
||||
* 211.0 - Change representation of alias template instances, bug 516338.
|
||||
*/
|
||||
private static final int MIN_SUPPORTED_VERSION= version(210, 0);
|
||||
private static final int MAX_SUPPORTED_VERSION= version(210, Short.MAX_VALUE);
|
||||
private static final int DEFAULT_VERSION = version(210, 0);
|
||||
private static final int MIN_SUPPORTED_VERSION= version(211, 0);
|
||||
private static final int MAX_SUPPORTED_VERSION= version(211, Short.MAX_VALUE);
|
||||
private static final int DEFAULT_VERSION = version(211, 0);
|
||||
|
||||
private static int version(int major, int minor) {
|
||||
return (major << 16) + minor;
|
||||
|
|
|
@ -14,6 +14,7 @@ import org.eclipse.cdt.core.CCorePlugin;
|
|||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
|
||||
import org.eclipse.cdt.internal.core.index.CPPAliasTemplateInstanceClone;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
|
@ -24,18 +25,20 @@ import org.eclipse.core.runtime.CoreException;
|
|||
/**
|
||||
* PDOM binding for alias template instance.
|
||||
*/
|
||||
class PDOMCPPAliasTemplateInstance extends PDOMCPPTypedef implements ICPPAliasTemplateInstance {
|
||||
private static final int TEMPLATE_DEFINITION_OFFSET = PDOMCPPTypedef.RECORD_SIZE;
|
||||
class PDOMCPPAliasTemplateInstance extends PDOMCPPTypedefSpecialization implements ICPPAliasTemplateInstance {
|
||||
private static final int TEMPLATE_ARGUMENTS = PDOMCPPTypedefSpecialization.RECORD_SIZE; // Database.PTR_SIZE
|
||||
|
||||
@SuppressWarnings("hiding")
|
||||
protected static final int RECORD_SIZE = TEMPLATE_DEFINITION_OFFSET + Database.PTR_SIZE;
|
||||
protected static final int RECORD_SIZE = TEMPLATE_ARGUMENTS + Database.PTR_SIZE;
|
||||
|
||||
private volatile ICPPAliasTemplate fTemplateDefinition;
|
||||
|
||||
public PDOMCPPAliasTemplateInstance(PDOMCPPLinkage linkage, PDOMNode parent, PDOMBinding templateDefinition,
|
||||
ICPPAliasTemplateInstance binding) throws CoreException, DOMException {
|
||||
super(linkage, parent, binding);
|
||||
getDB().putRecPtr(record + TEMPLATE_DEFINITION_OFFSET, templateDefinition.getRecord());
|
||||
private volatile ICPPTemplateArgument[] fTemplateArguments;
|
||||
|
||||
public PDOMCPPAliasTemplateInstance(PDOMCPPLinkage linkage, PDOMNode parent,
|
||||
PDOMBinding aliasTemplate, ICPPAliasTemplateInstance astInstance)
|
||||
throws CoreException, DOMException {
|
||||
super(linkage, parent, astInstance, aliasTemplate);
|
||||
fTemplateArguments = astInstance.getTemplateArguments();
|
||||
linkage.new ConfigureAliasTemplateInstance(this);
|
||||
}
|
||||
|
||||
public PDOMCPPAliasTemplateInstance(PDOMCPPLinkage linkage, long record) {
|
||||
|
@ -49,15 +52,7 @@ class PDOMCPPAliasTemplateInstance extends PDOMCPPTypedef implements ICPPAliasTe
|
|||
|
||||
@Override
|
||||
public ICPPAliasTemplate getTemplateDefinition() {
|
||||
if (fTemplateDefinition == null) {
|
||||
try {
|
||||
long templateRec = getDB().getRecPtr(record + TEMPLATE_DEFINITION_OFFSET);
|
||||
fTemplateDefinition = (ICPPAliasTemplate) PDOMNode.load(getPDOM(), templateRec);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
}
|
||||
return fTemplateDefinition;
|
||||
return (ICPPAliasTemplate) getSpecializedBinding();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -69,4 +64,38 @@ class PDOMCPPAliasTemplateInstance extends PDOMCPPTypedef implements ICPPAliasTe
|
|||
public Object clone() {
|
||||
return new CPPAliasTemplateInstanceClone(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICPPTemplateArgument[] getTemplateArguments() {
|
||||
if (fTemplateArguments == null) {
|
||||
try {
|
||||
final long rec= getPDOM().getDB().getRecPtr(record + TEMPLATE_ARGUMENTS);
|
||||
fTemplateArguments = PDOMCPPArgumentList.getArguments(this, rec);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
fTemplateArguments = ICPPTemplateArgument.EMPTY_ARGUMENTS;
|
||||
}
|
||||
}
|
||||
return fTemplateArguments;
|
||||
}
|
||||
|
||||
public void storeTemplateArguments() {
|
||||
try {
|
||||
// fTemplateArguments here are the temporarily stored, possibly non-PDOM arguments stored
|
||||
// by the constructor. Construct the PDOM arguments and store them.
|
||||
final long argListRec = PDOMCPPArgumentList.putArguments(this, fTemplateArguments);
|
||||
getDB().putRecPtr(record + TEMPLATE_ARGUMENTS, argListRec);
|
||||
|
||||
// Read the stored arguments next time getTemplateArguments() is called.
|
||||
fTemplateArguments = null;
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isExplicitSpecialization() {
|
||||
// Alias templates cannot be explicitly specialized.
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -540,6 +540,20 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
|||
fTemplate.initData(fOriginalAliasedType);
|
||||
}
|
||||
}
|
||||
|
||||
class ConfigureAliasTemplateInstance implements Runnable {
|
||||
PDOMCPPAliasTemplateInstance fAliasInstance;
|
||||
|
||||
public ConfigureAliasTemplateInstance(PDOMCPPAliasTemplateInstance aliasInstance) {
|
||||
fAliasInstance = aliasInstance;
|
||||
postProcesses.add(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
fAliasInstance.storeTemplateArguments();
|
||||
}
|
||||
}
|
||||
|
||||
class ConfigureInstance implements Runnable {
|
||||
PDOMCPPSpecialization fInstance;
|
||||
|
@ -930,6 +944,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
|||
result = new PDOMCPPFieldInstance(this, parent, (ICPPVariableInstance) special, orig);
|
||||
} else if (special instanceof ICPPVariable && orig instanceof ICPPVariable) {
|
||||
result= new PDOMCPPVariableInstance(this, parent, (ICPPVariableInstance) special, orig);
|
||||
} else if (special instanceof ICPPAliasTemplateInstance && orig instanceof ICPPAliasTemplate) {
|
||||
result = new PDOMCPPAliasTemplateInstance(this, parent, orig, (ICPPAliasTemplateInstance) special);
|
||||
}
|
||||
} else if (special instanceof ICPPField) {
|
||||
result= new PDOMCPPFieldSpecialization(this, parent, (ICPPField) special, orig);
|
||||
|
|
Loading…
Add table
Reference in a new issue