diff options
Diffstat (limited to 'tutorial/examples/freeargs/FreeArgsClass.java')
-rw-r--r-- | tutorial/examples/freeargs/FreeArgsClass.java | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/tutorial/examples/freeargs/FreeArgsClass.java b/tutorial/examples/freeargs/FreeArgsClass.java new file mode 100644 index 0000000..2349869 --- /dev/null +++ b/tutorial/examples/freeargs/FreeArgsClass.java @@ -0,0 +1,117 @@ +/* + * This code was generated by ojc. + */ +/* + * FreeArgsClass.oj + * + * Apr 29, 1999, by Michiaki Tatsubori + * Feb 2, 1999, by Michiaki Tatsubori + */ +package examples.freeargs; + + +import openjava.mop.*; +import openjava.ptree.*; +import openjava.syntax.*; + + +/** + * The metaclass <code>FreeArgsClass</code> provides classes with + * a facility of methods to accept unknown number of arguments. + * <p> + * For example, for the class: + * <pre> + * class MyCollection instantiates FreeArgsClass { + * public generous add( Object[] arg ) { .. } + * } + * </pre> + * We can use the class above as follows: + * <pre> + * MyCollection collection = ..; + * collection.add( a, b, null, c, d ); + * </pre> + * <p> + * + * @author Michiaki Tatsubori + * @version 1.0 + * @see java.lang.OJClass + */ +public class FreeArgsClass extends openjava.mop.OJClass +{ + + private static final java.lang.String GENEROUS = "generous"; + + /** Translates definition */ + public void translateDefinition() + throws openjava.mop.MOPException + { + openjava.mop.OJMethod[] methods = getDeclaredMethods(); + for (int i = 0; i < methods.length; ++i) { + if (!methods[i].getModifiers().has( GENEROUS )) { + continue; + } + System.err.println( methods[i] ); + openjava.mop.OJClass[] paramtypes = methods[i].getParameterTypes(); + if (paramtypes.length != 1 || !paramtypes[0].isArray()) { + System.err.println( "illegal parameter, ignored." ); + continue; + } + putMetaInfo( methods[i].getName(), paramtypes[0].getName() ); + } + } + + public openjava.mop.OJMethod resolveException( openjava.mop.NoSuchMemberException e, java.lang.String name, openjava.mop.OJClass[] params ) + throws openjava.mop.NoSuchMemberException + { + try { + java.lang.String argtypename = getMetaInfo( name ); + if (argtypename != null) { + openjava.mop.OJClass paramtype = OJClass.forName( argtypename ); + return getMethod( name, new openjava.mop.OJClass[]{ paramtype }, this ); + } + } catch ( openjava.mop.OJClassNotFoundException e2 ) { + System.err.println( e2 ); + } + return super.resolveException( e, name, params ); + } + + /** Translates allocation parts */ + public openjava.ptree.Expression expandMethodCall( openjava.mop.Environment env, openjava.ptree.MethodCall expr ) + { + java.lang.String argtypename = getMetaInfo( expr.getName() ); + if (argtypename == null) { + return expr; + } + openjava.mop.OJClass comptype; + try { + comptype = OJClass.forName( argtypename ).getComponentType(); + } catch ( openjava.mop.OJClassNotFoundException e ) { + System.err.println( e ); + return expr; + } + openjava.ptree.ExpressionList dim = new openjava.ptree.ExpressionList( null ); + openjava.ptree.ArrayInitializer ainit = new openjava.ptree.ArrayInitializer( expr.getArguments() ); + openjava.ptree.ArrayAllocationExpression carrier = new openjava.ptree.ArrayAllocationExpression( comptype, dim, ainit ); + expr.setArguments( new openjava.ptree.ExpressionList( carrier ) ); + return expr; + } + + public static boolean isRegisteredModifier( java.lang.String keyword ) + { + if (keyword.equals( GENEROUS )) { + return true; + } + return false; + } + + public FreeArgsClass( openjava.mop.Environment oj_param0, openjava.mop.OJClass oj_param1, openjava.ptree.ClassDeclaration oj_param2 ) + { + super( oj_param0, oj_param1, oj_param2 ); + } + + public FreeArgsClass( java.lang.Class oj_param0, openjava.mop.MetaInfo oj_param1 ) + { + super( oj_param0, oj_param1 ); + } + +} |