/* $Id: ParamList.java 742162 2009-02-08 20:54:34Z dixson $
*
* Copyright 2007-2008 Cisco Systems Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package etch.compiler.ast;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import etch.compiler.ParseException;
import etch.compiler.opt.ToString.FieldItem;
import etch.compiler.opt.ToString.FmtItem;
import etch.compiler.opt.ToString.StringItem;
/**
* Abstract base class of service elements which have parameter lists
* from the etch idl. This includes struct, exception, and message
* elements.
* @param <P> the type of the parent object.
*/
abstract public class ParamList<P extends Named<?>> extends Named<P>
implements Iterable<Parameter>
{
/**
* Constructs the ParamList.
*
* @param parent
* @param name
* @param opts
*/
public ParamList( P parent, Name name, Map<String, Opt> opts )
{
super( parent, name, opts );
}
/**
* @param rt
* @param n
* @return the parameter that was added.
* @throws ParseException
*/
public Parameter addParameter( Name n, TypeRef rt ) throws ParseException
{
// if (rt.type().kind == EtchGrammarConstants.VOID)
// throw new IllegalArgumentException( "bad parameter type "+rt+" for name "+n );
list.check( n );
Parameter p = new Parameter( this, n, rt );
list.add( n, p );
return p;
}
/**
* @param n
* @return true if the specified parameter name is defined by this element.
*/
public boolean hasParameter( String n )
{
return list.has( n );
}
/**
* @param n the parameter name to get.
* @return the parameter with the specified name, or null.
*/
public Parameter getParameter( String n )
{
return list.get( n );
}
/**
* @return a list containing the parameters in order.
*/
public List<Parameter> getParameters()
{
return list.list();
}
private NameList<Parameter> list = new NameList<Parameter>();
public Iterator<Parameter> iterator()
{
return list.iterator();
}
/**
* @return true if this element defines any parameters.
*/
public boolean hasParameters()
{
return !list.isEmpty();
}
/**
* @return the service that we are part of.
*/
abstract public Service service();
/**
* @param isExcept
* @param hasExtends
* @return a list of format items for this element.
*/
public List<FmtItem> mkFormatList( boolean isExcept, boolean hasExtends )
{
List<FmtItem> fmts = new ArrayList<FmtItem>();
if (!isExcept)
fmts.add( new StringItem( name().name+"(" ) );
if (hasExtends)
{
fmts.add( new FieldItem( isExcept ? "super.getMessage()" : "super.toString()" ) );
fmts.add( new StringItem( "; " ) );
}
boolean first = true;
for (Parameter p: list)
{
if (first)
{
first = false;
fmts.add( new StringItem( p.name().name+"=" ) );
}
else
{
fmts.add( new StringItem( "; "+p.name().name+"=" ) );
}
fmts.add( new FieldItem( p.name().name ) );
}
if (!isExcept)
fmts.add( new StringItem( ")" ) );
return fmts;
}
/**
* Checks the format items for this element.
* @param lineno
* @param fmts
* @throws ParseException
*/
public void checkFormatList( int lineno, List<FmtItem> fmts )
throws ParseException
{
for (FmtItem i: fmts)
{
if (i instanceof FieldItem)
{
FieldItem fi = (FieldItem) i;
if (!hasParameter( fi.value() ))
throw new ParseException( String.format(
"ToString: format list specifies parameter (%s) which does not exist at line %d",
fi.value(), lineno ) );
}
}
}
}