From ebf041caef7192fb058873f18e5b188c458eaee2 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Sun, 31 Jan 2016 20:57:27 -0800 Subject: [PATCH] Bug 486915 - Unmarshalling error during indexing Change-Id: Ifc37fe89d46e418925bf977795a99d043fd67360 --- .../core/dom/parser/ITypeMarshalBuffer.java | 5 +- .../parser/cpp/CPPAliasTemplateInstance.java | 26 ++------ .../dom/parser/cpp/CPPUnknownBinding.java | 4 +- .../semantics/TypeOfDependentExpression.java | 7 +- .../core/index/IIndexCPPBindingConstants.java | 19 +++--- .../composite/cpp/CPPCompositesFactory.java | 2 + .../CompositeCPPAliasTemplateInstance.java | 34 ++++++++++ .../eclipse/cdt/internal/core/pdom/PDOM.java | 11 ++-- .../pdom/dom/cpp/PDOMCPPAliasTemplate.java | 4 +- .../dom/cpp/PDOMCPPAliasTemplateInstance.java | 66 +++++++++++++++++++ .../pdom/dom/cpp/PDOMCPPArgumentList.java | 6 ++ .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 24 ++++--- 12 files changed, 157 insertions(+), 51 deletions(-) create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPAliasTemplateInstance.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAliasTemplateInstance.java diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ITypeMarshalBuffer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ITypeMarshalBuffer.java index efe7e9f0deb..830aa6a6306 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ITypeMarshalBuffer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ITypeMarshalBuffer.java @@ -37,9 +37,8 @@ public interface ITypeMarshalBuffer { final static byte UNKNOWN_MEMBER = 0x0C; final static byte UNKNOWN_MEMBER_CLASS_INSTANCE = 0x0D; final static byte DEFERRED_CLASS_INSTANCE = 0x0E; - final static byte ALIAS_TEMPLATE = 0x0F; - final static byte TYPE_TRANSFORMATION = 0x10; - final static byte UNKNOWN_MEMBER_TYPE = 0x11; + final static byte TYPE_TRANSFORMATION = 0x0F; + final static byte UNKNOWN_MEMBER_TYPE = 0x10; // Can add more types up to 0x1C, after that it will collide with TypeMarshalBuffer.UNSTORABLE_TYPE. final static byte diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPAliasTemplateInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPAliasTemplateInstance.java index 9dbdad076b8..bcce98c3fb5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPAliasTemplateInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPAliasTemplateInstance.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012, 2013 Institute for Software, HSR Hochschule fuer Technik + * Copyright (c) 2012, 2016 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -21,16 +21,14 @@ 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.ICPPBinding; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.Linkage; -import org.eclipse.cdt.internal.core.dom.parser.ISerializableType; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; -import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; -import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.PlatformObject; public class CPPAliasTemplateInstance extends PlatformObject - implements ICPPAliasTemplateInstance, ITypeContainer, ISerializableType { + implements ICPPAliasTemplateInstance, ITypeContainer { private final char[] name; private final ICPPAliasTemplate aliasTemplate; private IType aliasedType; @@ -85,7 +83,7 @@ public class CPPAliasTemplateInstance extends PlatformObject if (name != null) { return name; } - return new char[0]; + return CharArrayUtils.EMPTY_CHAR_ARRAY; } @Override @@ -109,22 +107,6 @@ public class CPPAliasTemplateInstance extends PlatformObject return null; } - @Override - public void marshal(ITypeMarshalBuffer buffer) throws CoreException { - short firstBytes = ITypeMarshalBuffer.ALIAS_TEMPLATE; - buffer.putShort(firstBytes); - buffer.putCharArray(name); - buffer.marshalType(aliasedType); - buffer.marshalBinding(aliasTemplate); - } - - public static IType unmarshal(short firstBytes, ITypeMarshalBuffer buffer) throws CoreException { - char[] name = buffer.getCharArray(); - IType unmarshalledAliasedTypeInstance = buffer.unmarshalType(); - ICPPAliasTemplate unmarshalledAlias = (ICPPAliasTemplate) buffer.unmarshalBinding(); - return new CPPAliasTemplateInstance(name, unmarshalledAlias, unmarshalledAliasedTypeInstance); - } - @Override public String toString() { return ASTTypeUtil.getQualifiedName(this) + " -> " + ASTTypeUtil.getType(aliasedType, true); //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java index 45b03ecdac3..cb65690c739 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java @@ -72,8 +72,8 @@ public abstract class CPPUnknownBinding extends PlatformObject } @Override - public String getName() { - return new String(name); + public final String getName() { + return new String(getNameCharArray()); } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeOfDependentExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeOfDependentExpression.java index fda78316412..be298389830 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeOfDependentExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeOfDependentExpression.java @@ -30,7 +30,7 @@ public class TypeOfDependentExpression extends CPPUnknownBinding implements ICPP private final ICPPEvaluation fEvaluation; public TypeOfDependentExpression(ICPPEvaluation evaluation) { - super(evaluation.getSignature()); + super(null); fEvaluation= evaluation; } @@ -78,4 +78,9 @@ public class TypeOfDependentExpression extends CPPUnknownBinding implements ICPP // We won't know until instantiation. return null; } + + @Override + public char[] getNameCharArray() { + return fEvaluation.getSignature(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java index 96f82d84fe9..6ff31191bc9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java @@ -62,13 +62,14 @@ public interface IIndexCPPBindingConstants { int CPP_UNKNOWN_FIELD = IIndexBindingConstants.LAST_CONSTANT + 48; int CPP_USING_DECLARATION_SPECIALIZATION= IIndexBindingConstants.LAST_CONSTANT + 49; int CPP_UNKNOWN_METHOD = IIndexBindingConstants.LAST_CONSTANT + 50; - int CPP_TEMPLATE_ALIAS = IIndexBindingConstants.LAST_CONSTANT + 51; - int CPP_ENUMERATION_SPECIALIZATION = IIndexBindingConstants.LAST_CONSTANT + 52; - int CPP_ENUMERATOR_SPECIALIZATION = IIndexBindingConstants.LAST_CONSTANT + 53; - int CPP_VARIABLE_TEMPLATE = IIndexBindingConstants.LAST_CONSTANT + 54; - int CPP_FIELD_TEMPLATE = IIndexBindingConstants.LAST_CONSTANT + 55; - int CPP_VARIABLE_INSTANCE = IIndexBindingConstants.LAST_CONSTANT + 56; - int CPP_FIELD_INSTANCE = IIndexBindingConstants.LAST_CONSTANT + 57; - int CPP_VARIABLE_TEMPLATE_PARTIAL_SPECIALIZATION = IIndexBindingConstants.LAST_CONSTANT + 58; - int CPP_FIELD_TEMPLATE_PARTIAL_SPECIALIZATION = IIndexBindingConstants.LAST_CONSTANT + 59; + int CPP_ALIAS_TEMPLATE = IIndexBindingConstants.LAST_CONSTANT + 51; + int CPP_ALIAS_TEMPLATE_INSTANCE = IIndexBindingConstants.LAST_CONSTANT + 52; + int CPP_ENUMERATION_SPECIALIZATION = IIndexBindingConstants.LAST_CONSTANT + 53; + int CPP_ENUMERATOR_SPECIALIZATION = IIndexBindingConstants.LAST_CONSTANT + 54; + int CPP_VARIABLE_TEMPLATE = IIndexBindingConstants.LAST_CONSTANT + 55; + int CPP_FIELD_TEMPLATE = IIndexBindingConstants.LAST_CONSTANT + 56; + int CPP_VARIABLE_INSTANCE = IIndexBindingConstants.LAST_CONSTANT + 57; + int CPP_FIELD_INSTANCE = IIndexBindingConstants.LAST_CONSTANT + 58; + int CPP_VARIABLE_TEMPLATE_PARTIAL_SPECIALIZATION = IIndexBindingConstants.LAST_CONSTANT + 59; + int CPP_FIELD_TEMPLATE_PARTIAL_SPECIALIZATION = IIndexBindingConstants.LAST_CONSTANT + 60; } 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 1e1583b7ec8..1ecf8fefdda 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 @@ -689,6 +689,8 @@ public class CPPCompositesFactory extends AbstractCompositeFactory { result = new CompositeCPPFunction(this, (ICPPFunction) binding); } else if (binding instanceof ICPPInternalEnumerator) { result = new CompositeCPPEnumerator(this, (ICPPInternalEnumerator) binding); + } else if (binding instanceof ICPPAliasTemplateInstance) { + return new CompositeCPPAliasTemplateInstance(this, (ICPPBinding) binding); } else if (binding instanceof ITypedef) { result = new CompositeCPPTypedef(this, (ICPPBinding) binding); } else if (binding instanceof IIndexMacroContainer) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPAliasTemplateInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPAliasTemplateInstance.java new file mode 100644 index 00000000000..a47e7a6e108 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPAliasTemplateInstance.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2016 Google, Inc 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: + * Sergey Prigogin (Google) - initial API and implementation + *******************************************************************************/ +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.internal.core.index.IIndexFragmentBinding; +import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; + +class CompositeCPPAliasTemplateInstance extends CompositeCPPTypedef implements ICPPAliasTemplateInstance { + public CompositeCPPAliasTemplateInstance(ICompositesFactory cf, ICPPBinding delegate) { + super(cf, delegate); + } + + @Override + public Object clone() { + fail(); return null; + } + + @Override + public ICPPAliasTemplate getTemplateDefinition() { + ICPPAliasTemplate templateDefinition = ((ICPPAliasTemplateInstance) rbinding).getTemplateDefinition(); + return (ICPPAliasTemplate) cf.getCompositeBinding((IIndexFragmentBinding) templateDefinition); + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 343fc873ec2..7690515e86d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -266,11 +266,14 @@ public class PDOM extends PlatformObject implements IPDOM { * * CDT 8.8 development (versions not supported on the 8.7.x branch) * 190.0 - Signature change for methods with ref-qualifiers, bug 470014. - * 191.0 - Added EvalID.fIsPointerDeref, bug 472436. + * 191.0 - Added EvalID.fIsPointerDeref, bug 472436. <> + * + * CDT 9.0 development (versions not supported on the 8.8.x branch) + * 200.0 - Added PDOMCPPAliasTemplateInstance, bug 486915. */ - private static final int MIN_SUPPORTED_VERSION= version(191, 0); - private static final int MAX_SUPPORTED_VERSION= version(191, Short.MAX_VALUE); - private static final int DEFAULT_VERSION = version(191, 0); + private static final int MIN_SUPPORTED_VERSION= version(200, 0); + private static final int MAX_SUPPORTED_VERSION= version(200, Short.MAX_VALUE); + private static final int DEFAULT_VERSION = version(200, 0); private static int version(int major, int minor) { return (major << 16) + minor; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAliasTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAliasTemplate.java index 2383af9629a..a69e8ba92a2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAliasTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAliasTemplate.java @@ -64,12 +64,12 @@ class PDOMCPPAliasTemplate extends PDOMCPPBinding implements ICPPAliasTemplate, @Override public int getNodeType() { - return IIndexCPPBindingConstants.CPP_TEMPLATE_ALIAS; + return IIndexCPPBindingConstants.CPP_ALIAS_TEMPLATE; } @Override public boolean isSameType(IType type) { - if(type == null){ + if (type == null){ return false; } IType aliasedType = getType(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAliasTemplateInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAliasTemplateInstance.java new file mode 100644 index 00000000000..68d65b382b5 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAliasTemplateInstance.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2016 Google, Inc 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: + * Sergey Prigogin (Google) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom.cpp; + +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.internal.core.index.IIndexCPPBindingConstants; +import org.eclipse.cdt.internal.core.pdom.db.Database; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; +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; + + @SuppressWarnings("hiding") + protected static final int RECORD_SIZE = TEMPLATE_DEFINITION_OFFSET + Database.TYPE_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()); + } + + public PDOMCPPAliasTemplateInstance(PDOMCPPLinkage linkage, long record) { + super(linkage, record); + } + + @Override + public int getNodeType() { + return IIndexCPPBindingConstants.CPP_ALIAS_TEMPLATE_INSTANCE; + } + + @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; + } + + @Override + protected int getRecordSize() { + return RECORD_SIZE; + } +} \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPArgumentList.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPArgumentList.java index f76e2d16506..a6c52113547 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPArgumentList.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPArgumentList.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.ISemanticProblem; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.ProblemType; @@ -67,6 +68,11 @@ public class PDOMCPPArgumentList { * Restores an array of template arguments from the database. */ public static ICPPTemplateArgument[] getArguments(PDOMNode parent, long rec) throws CoreException { + if (rec == 0) { + CCorePlugin.log(new IllegalArgumentException( + "Trying to access template arguments before they have been stored.")); //$NON-NLS-1$ + return ICPPTemplateArgument.EMPTY_ARGUMENTS; + } final PDOMLinkage linkage= parent.getLinkage(); final Database db= linkage.getDB(); final short len= db.getShort(rec); 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 be92a6b5646..adc7dc130e1 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 @@ -89,7 +89,6 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation; import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; import org.eclipse.cdt.internal.core.dom.parser.ProblemType; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPAliasTemplateInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPArrayType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClosureType; @@ -622,10 +621,17 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { parent2= this; } } - } else if (binding instanceof ITypedef) { - pdomBinding = new PDOMCPPTypedef(this, parent, (ITypedef) binding); } else if (binding instanceof ICPPAliasTemplate) { pdomBinding = new PDOMCPPAliasTemplate(this, parent, (ICPPAliasTemplate) binding); + } else if (binding instanceof ICPPAliasTemplateInstance) { + IBinding template = ((ICPPAliasTemplateInstance) binding).getTemplateDefinition(); + PDOMBinding pdomTemplate = addBinding(template, null); + if (pdomTemplate == null) + return null; + pdomBinding = new PDOMCPPAliasTemplateInstance(this, parent, pdomTemplate, + (ICPPAliasTemplateInstance) binding); + } else if (binding instanceof ITypedef) { + pdomBinding = new PDOMCPPTypedef(this, parent, (ITypedef) binding); } if (pdomBinding != null) { @@ -899,7 +905,9 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { } else if (binding instanceof ITypedef) { return CPPTYPEDEF; } else if (binding instanceof ICPPAliasTemplate) { - return CPP_TEMPLATE_ALIAS; + return CPP_ALIAS_TEMPLATE; + } else if (binding instanceof ICPPAliasTemplateInstance) { + return CPP_ALIAS_TEMPLATE_INSTANCE; } return 0; @@ -907,7 +915,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { @Override protected boolean cannotAdapt(final IBinding inputBinding) throws CoreException { - return super.cannotAdapt(inputBinding) || inputBinding instanceof ICPPAliasTemplateInstance; + return super.cannotAdapt(inputBinding); } @Override @@ -1119,8 +1127,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { return new PDOMCPPTypedefSpecialization(this, record); case CPP_USING_DECLARATION_SPECIALIZATION: return new PDOMCPPUsingDeclarationSpecialization(this, record); - case CPP_TEMPLATE_ALIAS: + case CPP_ALIAS_TEMPLATE: return new PDOMCPPAliasTemplate(this, record); + case CPP_ALIAS_TEMPLATE_INSTANCE: + return new PDOMCPPAliasTemplateInstance(this, record); case CPP_ENUMERATION_SPECIALIZATION: return new PDOMCPPEnumerationSpecialization(this, record); case CPP_ENUMERATOR_SPECIALIZATION: @@ -1370,8 +1380,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { return CPPUnknownClassInstance.unmarshal(getPDOM(), firstBytes, buffer); case ITypeMarshalBuffer.DEFERRED_CLASS_INSTANCE: return CPPDeferredClassInstance.unmarshal(getPDOM(), firstBytes, buffer); - case ITypeMarshalBuffer.ALIAS_TEMPLATE: - return CPPAliasTemplateInstance.unmarshal(firstBytes, buffer); case ITypeMarshalBuffer.TYPE_TRANSFORMATION: return CPPUnaryTypeTransformation.unmarshal(firstBytes, buffer); case ITypeMarshalBuffer.UNKNOWN_MEMBER_TYPE: