Package etch.compiler.ast

Source Code of etch.compiler.ast.ParamList

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

Related Classes of etch.compiler.ast.ParamList

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.