/* * xtc - The eXTensible Compiler * Copyright (C) 2007 Robert Grimm * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ package xtc.type; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * A parameterized type. * * @author Robert Grimm * @version $Revision: 1.2 $ */ public class ParameterizedT extends WrappedT { /** The list of parameters. */ private List<Parameter> parameters; /** * Create a new parameterized type. * * @param parameter The single parameter. * @param type The type. */ public ParameterizedT(Parameter parameter, Type type) { super(type); this.parameters = new ArrayList<Parameter>(1); this.parameters.add(parameter); } /** * Create a new parameterized type. * * @param parameters The parameters. * @param type The type. */ public ParameterizedT(List<Parameter> parameters, Type type) { super(type); this.parameters = parameters; } /** * Create a new parameterized type. * * @param template The type whose annotations to copy. * @param parameters The parameters. * @param type The type. */ public ParameterizedT(Type template, List<Parameter> parameters, Type type) { super(template, type); this.parameters = parameters; } public ParameterizedT copy() { return new ParameterizedT(this, Type.copy(parameters), getType().copy()); } public Type seal() { if (! isSealed()) { super.seal(); parameters = Type.seal(parameters); } return this; } public Type.Tag wtag() { return Type.Tag.PARAMETERIZED; } public boolean isParameterized() { return true; } public boolean hasParameterized() { return true; } public ParameterizedT toParameterized() { return this; } /** * Get this parameterized type's parameters. * * @return The parameters. */ public List<Parameter> getParameters() { return parameters; } public void write(Appendable out) throws IOException { out.append('<'); for (Iterator<Parameter> iter = parameters.iterator(); iter.hasNext(); ) { iter.next().write(out); if (iter.hasNext()) out.append(", "); } out.append("> "); getType().write(out); } }