/* * JacORB - a free Java ORB * * Copyright (C) 1997-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.jacorb.idl; /** * @author Gerald Brose */ import java.io.PrintWriter; public class ParamDecl extends IdlSymbol { public static final int MODE_IN = 1; public static final int MODE_OUT = 2; public static final int MODE_INOUT = 3; public int paramAttribute; public TypeSpec paramTypeSpec; public SimpleDeclarator simple_declarator; public ParamDecl( int num ) { super( num ); } /** * Constructs a new parameter declaration with the given characteristics. */ public ParamDecl( int paramAttribute, TypeSpec paramTypeSpec, SimpleDeclarator simple_declarator ) { super( new_num()); this.paramAttribute = paramAttribute; this.paramTypeSpec = paramTypeSpec; this.simple_declarator = simple_declarator; } /** * Constructs a new parameter declaration with the given characteristics. */ public ParamDecl( int paramAttribute, TypeSpec paramTypeSpec, String name) { super( new_num() ); this.paramAttribute = paramAttribute; this.paramTypeSpec = paramTypeSpec; this.simple_declarator = new SimpleDeclarator( new_num() ); this.simple_declarator.name = name; } public void setPackage( String s ) { s = parser.pack_replace( s ); if( pack_name.length() > 0 ) { pack_name = s + "." + pack_name; } else { pack_name = s; } paramTypeSpec.setPackage( s ); } /** * Returns a new ParamDecl with the same characteristics as this one, * except that its mode is changed to 'in'. */ public ParamDecl asIn() { return new ParamDecl( MODE_IN, this.paramTypeSpec, this.simple_declarator) ; } public void parse() { // BZ974 : If the parameter clashes with the package scope then escape it. String []packParts = pack_name.split("\\."); for (String part : packParts) { if (simple_declarator.name.equals(part)) { simple_declarator.name = "_" + simple_declarator.name; } } while( paramTypeSpec.typeSpec() instanceof ScopedName ) { TypeSpec ts = ( (ScopedName)paramTypeSpec.typeSpec() ).resolvedTypeSpec(); if( ts != null ) { paramTypeSpec = ts; } } if( paramTypeSpec == null ) { lexer.restorePosition(myPosition); parser.fatal_error("parameter TypeSpec is null " + name, token); } } public void print( PrintWriter ps ) { switch( paramAttribute ) { case MODE_IN: ps.print( paramTypeSpec.toString() ); break; case MODE_OUT: case MODE_INOUT: ps.print( paramTypeSpec.holderName() ); break; } ps.print(" "); ps.print(simple_declarator); } public String printWriteStatement( String ps ) { return printWriteStatement( simple_declarator.toString(), ps ); } public String printWriteStatement( String name, String ps ) { if( paramAttribute != ParamDecl.MODE_IN ) { return paramTypeSpec.typeSpec().printWriteStatement( name + ".value", ps ); } return paramTypeSpec.typeSpec().printWriteStatement( name, ps ); } public String printReadExpression( String ps ) { return paramTypeSpec.typeSpec().printReadExpression( ps ); } public void printAddArgumentStatement(PrintWriter ps, String reqname) { String varname = this.simple_declarator.toString(); String anyname = "$" + varname; ps.print( "\t\torg.omg.CORBA.Any " + anyname + " = " + reqname); switch (this.paramAttribute) { case ParamDecl.MODE_OUT: ps.println(".add_out_arg();"); varname = varname + ".value"; break; case ParamDecl.MODE_IN: ps.println(".add_in_arg();"); break; case ParamDecl.MODE_INOUT: ps.println(".add_inout_arg();"); varname = varname + ".value"; break; default: throw new ParseException("Wrong parameter declaration"); } paramTypeSpec.typeSpec().printInsertIntoAny(ps, anyname, varname); } /** * @param ps */ public void printExtractArgumentStatement(PrintWriter ps) { String varname = this.simple_declarator.toString(); String anyname = "$" + varname; paramTypeSpec.typeSpec().printExtractResult(ps, varname + ".value", anyname, paramTypeSpec.toString()); } public void accept( IDLTreeVisitor visitor ) { visitor.visitParamDecl( this ); } }