From 17b916288100eecb0be86dad58e9999517552e17 Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Wed, 18 Apr 2007 01:28:10 +0000 Subject: [PATCH] Widened, honor @ActionScript(omit=true) on classes and constructors, sort of handle inner class declarations, emphasis on sort of. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4666 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../presents/tools/ActionScriptSource.java | 30 ++++++------ .../presents/tools/GenActionScriptTask.java | 48 +++++++++---------- .../threerings/presents/tools/GenUtil.java | 37 +++++++------- 3 files changed, 55 insertions(+), 60 deletions(-) diff --git a/src/java/com/threerings/presents/tools/ActionScriptSource.java b/src/java/com/threerings/presents/tools/ActionScriptSource.java index fc31dd043..8c49808fe 100644 --- a/src/java/com/threerings/presents/tools/ActionScriptSource.java +++ b/src/java/com/threerings/presents/tools/ActionScriptSource.java @@ -307,8 +307,8 @@ public class ActionScriptSource // note our implemented interfaces ArrayList ifaces = new ArrayList(); for (Class iclass : jclass.getInterfaces()) { - // we cannot use the FooCodes interface pattern in ActionScript so - // we just have to nix it + // we cannot use the FooCodes interface pattern in ActionScript so we just have to nix + // it if (iclass.getName().endsWith("Codes")) { continue; } @@ -339,9 +339,9 @@ public class ActionScriptSource list.add(new Member(name, decl)); } - // ActionScript only supports one constructor so we find the one with - // the most arguments and we make a note whether or not we need a no - // argument constructor which we create using default arguments + // ActionScript only supports one constructor so we find the one with the most arguments + // and we make a note whether or not we need a no argument constructor which we create + // using default arguments Constructor mainctor = null; boolean needsNoArg = false; for (Constructor ctor : jclass.getConstructors()) { @@ -537,9 +537,12 @@ public class ActionScriptSource String comment = accum.toString(); accum.setLength(0); - // set the comment on the specified method - updateComment(publicConstructors, name, comment); - updateComment(protectedConstructors, name, comment); + // the only annotation that makes sense on a constructor is "omit" + if (comment.indexOf("@ActionScript") == -1) { + // set the comment on the specified method + updateComment(publicConstructors, name, comment); + updateComment(protectedConstructors, name, comment); + } // switch to METHODBODY to absorb the method braceCount = (line.indexOf("{") == -1) ? 0 : 1; @@ -565,8 +568,7 @@ public class ActionScriptSource String comment = accum.toString(); accum.setLength(0); - // look through the comment for an @ActionScript - // annotation; oh the hackery + // look through the comment for an @ActionScript annotation; oh the hackery if (comment.indexOf("@ActionScript") != -1) { StringBuilder combuf = new StringBuilder(); for (String cline : StringUtil.split(comment, "\n")) { @@ -601,12 +603,11 @@ public class ActionScriptSource tline.startsWith("*")) { accum.append(line).append("\n"); - } else if (tline.equals("}")) { + } else if (line.startsWith("}")) { mode = Mode.POSTCLASS; } else { - System.err.println("J: Non-comment encountered " + - "between members: " + line); + System.err.println("J: Non-comment encountered between members: " + line); } } break; @@ -793,8 +794,7 @@ public class ActionScriptSource mode = Mode.POSTCLASS; } else { - System.err.println("AS: Non-comment encountered " + - "between members: " + line); + System.err.println("AS: Non-comment encountered between members: " + line); } } break; diff --git a/src/java/com/threerings/presents/tools/GenActionScriptTask.java b/src/java/com/threerings/presents/tools/GenActionScriptTask.java index 8ad02bebf..9ea9ee18c 100644 --- a/src/java/com/threerings/presents/tools/GenActionScriptTask.java +++ b/src/java/com/threerings/presents/tools/GenActionScriptTask.java @@ -52,19 +52,19 @@ import com.samskivert.util.StringUtil; import com.samskivert.velocity.VelocityUtil; import com.threerings.io.Streamable; +import com.threerings.util.ActionScript; + import com.threerings.presents.data.InvocationMarshaller; import com.threerings.presents.dobj.DObject; /** - * Generates ActionScript versions of {@link Streamable} classes and provides - * routines used by the {@link GenDObjectTask} to create ActionScript versions - * of distributed objects. + * Generates ActionScript versions of {@link Streamable} classes and provides routines used by the + * {@link GenDObjectTask} to create ActionScript versions of distributed objects. */ public class GenActionScriptTask extends Task { /** - * Adds a nested <fileset> element which enumerates streamable source - * files. + * Adds a nested <fileset> element which enumerates streamable source files. */ public void addFileset (FileSet set) { @@ -80,16 +80,14 @@ public class GenActionScriptTask extends Task } /** - * Configures us with a header file that we'll prepend to all - * generated source files. + * Configures us with a header file that we'll prepend to all generated source files. */ public void setHeader (File header) { try { _header = IOUtils.toString(new FileReader(header)); } catch (IOException ioe) { - System.err.println("Unabled to load header '" + header + ": " + - ioe.getMessage()); + System.err.println("Unabled to load header '" + header + ": " + ioe.getMessage()); } } @@ -126,24 +124,19 @@ public class GenActionScriptTask extends Task try { name = GenUtil.readClassName(source); } catch (Exception e) { - System.err.println( - "Failed to parse " + source + ": " + e.getMessage()); + System.err.println("Failed to parse " + source + ": " + e.getMessage()); return; } try { - // in order for annotations to work, this task and all the classes - // it uses must be loaded from the same class loader as the classes - // on which we are going to introspect; this is non-ideal but - // unavoidable + // in order for annotations to work, this task and all the classes it uses must be + // loaded from the same class loader as the classes on which we are going to + // introspect; this is non-ideal but unavoidable processClass(source, getClass().getClassLoader().loadClass(name)); } catch (ClassNotFoundException cnfe) { - System.err.println( - "Failed to load " + name + ".\n" + - "Missing class: " + cnfe.getMessage()); - System.err.println( - "Be sure to set the 'classpathref' attribute to a classpath\n" + - "that contains your projects invocation service classes."); + System.err.println("Failed to load " + name + ".\nMissing class: " + cnfe.getMessage()); + System.err.println("Be sure to set the 'classpathref' attribute to a classpath\n" + + "that contains your projects invocation service classes."); } catch (Exception e) { e.printStackTrace(System.err); } @@ -152,11 +145,11 @@ public class GenActionScriptTask extends Task /** * Processes a resolved Streamable class instance. */ - protected void processClass (File source, Class sclass) + protected void processClass (File source, Class sclass) throws IOException { - // make sure we implement Streamable but don't extend DObject or - // InvocationMarshaller and that we're a class not an interface + // make sure we implement Streamable but don't extend DObject or InvocationMarshaller and + // that we're a class not an interface if (!Streamable.class.isAssignableFrom(sclass) || DObject.class.isAssignableFrom(sclass) || InvocationMarshaller.class.isAssignableFrom(sclass) || @@ -165,6 +158,13 @@ public class GenActionScriptTask extends Task return; } + // if we have an ActionScript(omit=true) annotation, skip this class + ActionScript asa = sclass.getAnnotation(ActionScript.class); + if (asa != null && asa.omit()) { + // System.err.println("Skipping " + sclass.getName() + "..."); + return; + } + // determine the path to the corresponding action script source file String path = sclass.getPackage().getName(); path = path.replace(".", File.separator); diff --git a/src/java/com/threerings/presents/tools/GenUtil.java b/src/java/com/threerings/presents/tools/GenUtil.java index ecdcaebd5..4ab3834c8 100644 --- a/src/java/com/threerings/presents/tools/GenUtil.java +++ b/src/java/com/threerings/presents/tools/GenUtil.java @@ -42,19 +42,15 @@ import com.samskivert.util.StringUtil; public class GenUtil extends com.samskivert.util.GenUtil { /** A regular expression for matching the package declaration. */ - public static final Pattern PACKAGE_PATTERN = - Pattern.compile("^\\s*package\\s+(\\S+)\\W"); + public static final Pattern PACKAGE_PATTERN = Pattern.compile("^\\s*package\\s+(\\S+)\\W"); - /** A regular expression for matching the class or interface - * declaration. */ + /** A regular expression for matching the class or interface declaration. */ public static final Pattern NAME_PATTERN = - Pattern.compile("^\\s*public\\s+(?:abstract\\s+)?" + - "(interface|class)\\s+(\\S+)(\\W|$)"); + Pattern.compile("^\\s*public\\s+(?:abstract\\s+)?(interface|class|enum)\\s+(\\S+)(\\W|$)"); /** - * Returns the name of the supplied class as it would appear in - * ActionScript code using the class (no package prefix, arrays specified - * as ArrayArray). + * Returns the name of the supplied class as it would appear in ActionScript code using the + * class (no package prefix, arrays specified as ArrayArray). */ public static String simpleASName (Class clazz) { @@ -82,8 +78,8 @@ public class GenUtil extends com.samskivert.util.GenUtil } /** - * "Boxes" the supplied argument, ie. turning an int into - * an Integer object. + * "Boxes" the supplied argument, ie. turning an int into an Integer + * object. */ public static String boxArgument (Class clazz, String name) { @@ -109,8 +105,8 @@ public class GenUtil extends com.samskivert.util.GenUtil } /** - * "Unboxes" the supplied argument, ie. turning an Integer - * object into an int. + * "Unboxes" the supplied argument, ie. turning an Integer object into an + * int. */ public static String unboxArgument (Class clazz, Type type, String name) { @@ -136,8 +132,8 @@ public class GenUtil extends com.samskivert.util.GenUtil } /** - * "Boxes" the supplied argument, ie. turning an int into - * an Integer object. + * "Boxes" the supplied argument, ie. turning an int into an Integer + * object. */ public static String boxASArgument (Class clazz, String name) { @@ -163,8 +159,8 @@ public class GenUtil extends com.samskivert.util.GenUtil } /** - * "Unboxes" the supplied argument, ie. turning an Integer - * object into an int. + * "Unboxes" the supplied argument, ie. turning an Integer object into an + * int. */ public static String unboxASArgument (Class clazz, String name) { @@ -186,8 +182,7 @@ public class GenUtil extends com.samskivert.util.GenUtil } /** - * Potentially clones the supplied argument if it is the type that - * needs such treatment. + * Potentially clones the supplied argument if it is the type that needs such treatment. */ public static String cloneArgument (Class dsclazz, Field f, String name) { @@ -203,8 +198,8 @@ public class GenUtil extends com.samskivert.util.GenUtil } /** - * Reads in the supplied source file and locates the package and class - * or interface name and returns a fully qualified class name. + * Reads in the supplied source file and locates the package and class or interface name and + * returns a fully qualified class name. */ public static String readClassName (File source) throws IOException