/*******************************************************************************
* Copyright (c) 2015, 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
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Lukas Wegmann (IFS) - 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.ISemanticProblem;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariableInstance;
import org.eclipse.cdt.internal.core.dom.parser.IntegralValue;
import org.eclipse.cdt.internal.core.dom.parser.ProblemType;
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.IPDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.core.runtime.CoreException;
public class PDOMCPPVariableInstance extends PDOMCPPSpecialization implements ICPPVariableInstance {
private static final int TEMPLATE_ARGUMENTS = PDOMCPPSpecialization.RECORD_SIZE + 0;
private static final int TYPE = TEMPLATE_ARGUMENTS + Database.PTR_SIZE;
private static final int VALUE = TYPE + Database.TYPE_SIZE;
private static final int ANNOTATIONS = VALUE + Database.VALUE_SIZE; // byte
@SuppressWarnings("hiding")
protected static final int RECORD_SIZE = ANNOTATIONS + 1;
private IType type;
public PDOMCPPVariableInstance(PDOMCPPLinkage linkage, PDOMNode parent,
ICPPVariableInstance specialization, IPDOMBinding orig) throws CoreException {
super(linkage, parent, specialization, orig);
final long argListRec = PDOMCPPArgumentList.putArguments(this, specialization.getTemplateArguments());
final Database db = getDB();
db.putRecPtr(record + TEMPLATE_ARGUMENTS, argListRec);
getLinkage().storeType(record + TYPE, specialization.getType());
getLinkage().storeValue(record + VALUE, specialization.getInitialValue());
db.putByte(record + ANNOTATIONS, PDOMCPPAnnotations.encodeVariableAnnotations(specialization));
}
public PDOMCPPVariableInstance(PDOMLinkage linkage, long bindingRecord) {
super(linkage, bindingRecord);
}
@Override
public ICPPTemplateDefinition getTemplateDefinition() {
return (ICPPTemplateDefinition) getSpecializedBinding();
}
@Override
public ICPPTemplateArgument[] getTemplateArguments() {
try {
final long rec = getPDOM().getDB().getRecPtr(record + TEMPLATE_ARGUMENTS);
return PDOMCPPArgumentList.getArguments(this, rec);
} catch (CoreException e) {
CCorePlugin.log(e);
return ICPPTemplateArgument.EMPTY_ARGUMENTS;
}
}
@Override
public boolean isExplicitSpecialization() {
try {
return hasDeclaration();
} catch (CoreException e) {
return false;
}
}
@Override
public boolean isMutable() {
return false;
}
@Override
public boolean isAuto() {
byte annotation = getAnnotations();
return !PDOMCPPAnnotations.isExtern(annotation) && !PDOMCPPAnnotations.isStatic(annotation)
&& getOwner() instanceof ICPPFunction;
}
@Override
public boolean isExtern() {
return PDOMCPPAnnotations.isExtern(getAnnotations());
}
@Override
public boolean isExternC() {
return PDOMCPPAnnotations.isExternC(getAnnotations());
}
@Override
public boolean isRegister() {
return false; // We don't care whether the parameter has register storage class specifier or not.
}
@Override
public boolean isStatic() {
return PDOMCPPAnnotations.isStatic(getAnnotations());
}
@Override
public boolean isConstexpr() {
return PDOMCPPAnnotations.isConstexpr(getAnnotations());
}
protected final byte getAnnotations() {
return getByte(record + ANNOTATIONS);
}
@Override
public IType getType() {
if (type == null) {
try {
type = getLinkage().loadType(record + TYPE);
} catch (CoreException e) {
CCorePlugin.log(e);
type = new ProblemType(ISemanticProblem.TYPE_NOT_PERSISTED);
}
}
return type;
}
@Override
public IValue getInitialValue() {
try {
return getLinkage().loadValue(record + VALUE);
} catch (CoreException e) {
CCorePlugin.log(e);
return IntegralValue.UNKNOWN;
}
}
@Override
protected int getRecordSize() {
return RECORD_SIZE;
}
@Override
public int getNodeType() {
return IIndexCPPBindingConstants.CPP_VARIABLE_INSTANCE;
}
}