blob: 719085f8140e7681652ea68743009d96131f50fe [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation 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 Niefer (IBM Corporation) - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
/**
* The standard template parameter (template<typename T> or template<class T>).
*/
public class CPPTemplateTypeParameter extends CPPTemplateParameter implements
ICPPTemplateTypeParameter, ICPPUnknownType, ICPPUnknownBinding {
private ICPPScope unknownScope;
private final boolean fIsParameterPack;
public CPPTemplateTypeParameter(IASTName name, boolean isPack) {
super(name);
fIsParameterPack= isPack;
}
@Override
public final boolean isParameterPack() {
return fIsParameterPack;
}
@Override
public ICPPScope asScope() {
if (unknownScope == null) {
IASTName n = null;
IASTNode[] nodes = getDeclarations();
if (nodes != null && nodes.length > 0)
n = (IASTName) nodes[0];
unknownScope = new CPPUnknownTypeScope(this, n);
}
return unknownScope;
}
@Override
public IType getDefault() {
IASTName[] nds = getDeclarations();
if (nds == null || nds.length == 0)
return null;
for (IASTName nd : nds) {
if (nd != null) {
IASTNode parent = nd.getParent();
if (parent instanceof ICPPASTSimpleTypeTemplateParameter) {
ICPPASTSimpleTypeTemplateParameter simple = (ICPPASTSimpleTypeTemplateParameter) parent;
IASTTypeId typeId = simple.getDefaultType();
if (typeId != null)
return CPPVisitor.createType(typeId);
}
}
}
return null;
}
@Override
public ICPPTemplateArgument getDefaultValue() {
IType t= getDefault();
if (t == null)
return null;
return new CPPTemplateTypeArgument(t);
}
@Override
public boolean isSameType(IType type) {
if (type == this)
return true;
if (type instanceof ITypedef)
return type.isSameType(this);
if (!(type instanceof ICPPTemplateTypeParameter))
return false;
return getParameterID() == ((ICPPTemplateParameter) type).getParameterID();
}
}