mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 14:42:11 +02:00
Bug 486915 - Unmarshalling error during indexing
Change-Id: Ifc37fe89d46e418925bf977795a99d043fd67360
This commit is contained in:
parent
09a0c248fb
commit
ebf041caef
12 changed files with 157 additions and 51 deletions
|
@ -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
|
||||
|
|
|
@ -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$
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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 8.8>>
|
||||
*
|
||||
* 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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Reference in a new issue