| /******************************************************************************* |
| * 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(); |
| } |
| } |