Added support for switching Java fields to a different type in their

ActionScript counterparts.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4801 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2007-08-01 17:40:35 +00:00
parent cd599586be
commit 5a490043c4
3 changed files with 49 additions and 33 deletions
@@ -24,6 +24,7 @@ package com.threerings.crowd.chat.data;
import com.samskivert.util.StringUtil;
import com.threerings.io.Streamable;
import com.threerings.util.ActionScript;
/**
* The abstract base class of all the client-side ChatMessage objects.
@@ -42,6 +43,7 @@ public abstract class ChatMessage
public transient String localtype;
/** The client time that this message was created. */
@ActionScript(type="int")
public transient long timestamp;
/**
@@ -40,8 +40,8 @@ import com.samskivert.util.StringUtil;
import com.threerings.util.ActionScript;
/**
* Primitively parses an ActionScriptSource file, allows the addition and
* replacement of class members and handles writing out the file again.
* Primitively parses an ActionScriptSource file, allows the addition and replacement of class
* members and handles writing out the file again.
*/
public class ActionScriptSource
{
@@ -62,8 +62,7 @@ public class ActionScriptSource
}
public void setInitialValue (String initValue) {
// if we're a typed array and we're being set to "new Something[0]"
// then convert that
// if we're a typed array and we're being set to "new Something[0]" then convert that
if (definition.indexOf("TypedArray") != -1) {
Matcher m = ARRAYINIT.matcher(initValue);
if (m.matches()) {
@@ -76,8 +75,7 @@ public class ActionScriptSource
initValue = initValue.replaceAll("\\}", "]");
// stick the initial value before the semicolon
definition = definition.substring(0, definition.length()-1) +
" = " + initValue + ";";
definition = definition.substring(0, definition.length()-1) + " = " + initValue + ";";
}
public void setComment (String comment) {
@@ -145,11 +143,10 @@ public class ActionScriptSource
}
/**
* Creates and returns a declaration for a field equivalent to the supplied
* Java field in ActionScript.
* Creates and returns a declaration for a field equivalent to the supplied Java field in
* ActionScript.
*/
public static String createActionScriptDeclaration (
String name, Field field)
public static String createActionScriptDeclaration (String name, Field field, ActionScript asa)
{
int mods = field.getModifiers();
StringBuilder builder = new StringBuilder();
@@ -175,16 +172,18 @@ public class ActionScriptSource
builder.append(name).append(" :");
// now convert the type to an ActionScript type
builder.append(toActionScriptType(field.getType(),
!Modifier.isStatic(mods)));
if (asa != null && !StringUtil.isBlank(asa.type())) {
builder.append(asa.type());
} else {
builder.append(toActionScriptType(field.getType(), !Modifier.isStatic(mods)));
}
builder.append(";");
return builder.toString();
}
public static String createActionScriptDeclaration (
Constructor ctor, boolean needsNoArg)
public static String createActionScriptDeclaration (Constructor ctor, boolean needsNoArg)
{
int mods = ctor.getModifiers();
StringBuilder builder = new StringBuilder();
@@ -221,8 +220,7 @@ public class ActionScriptSource
return builder.toString();
}
public static String createActionScriptDeclaration (
String name, Method method)
public static String createActionScriptDeclaration (String name, Method method)
{
int mods = method.getModifiers();
StringBuilder builder = new StringBuilder();
@@ -324,8 +322,7 @@ public class ActionScriptSource
int mods = field.getModifiers();
ArrayList<Member> list;
if (Modifier.isStatic(mods)) {
list = Modifier.isPublic(mods) ?
publicConstants : protectedConstants;
list = Modifier.isPublic(mods) ? publicConstants : protectedConstants;
} else {
list = Modifier.isPublic(mods) ? publicFields : protectedFields;
}
@@ -339,7 +336,7 @@ public class ActionScriptSource
name = asa.name();
}
}
String decl = createActionScriptDeclaration(name, field);
String decl = createActionScriptDeclaration(name, field, asa);
list.add(new Member(name, decl));
}
@@ -363,11 +360,9 @@ public class ActionScriptSource
if (mainctor != null) {
int mods = mainctor.getModifiers();
ArrayList<Member> list;
list = Modifier.isPublic(mods) ?
publicConstructors : protectedConstructors;
Member mem = new Member(
toSimpleName(mainctor.getName()),
createActionScriptDeclaration(mainctor, needsNoArg));
list = Modifier.isPublic(mods) ? publicConstructors : protectedConstructors;
Member mem = new Member(toSimpleName(mainctor.getName()),
createActionScriptDeclaration(mainctor, needsNoArg));
mem.body = " {\n TODO: IMPLEMENT ME\n }\n";
list.add(mem);
}
@@ -494,6 +489,20 @@ public class ActionScriptSource
String comment = accum.toString();
accum.setLength(0);
// strip out any @ActionScript annotation
if (comment.indexOf("@ActionScript") != -1) {
StringBuilder combuf = new StringBuilder();
for (String cline : StringUtil.split(comment, "\n")) {
if (cline.indexOf("@ActionScript") == -1) {
if (combuf.length() > 0) {
combuf.append("\n");
}
combuf.append(cline);
}
}
comment = combuf.toString();
}
// set the comment on the specified field
Member mem = updateComment(publicConstants, name, comment);
if (mem == null) {
@@ -573,7 +582,7 @@ public class ActionScriptSource
if (comment.indexOf("@ActionScript") != -1) {
StringBuilder combuf = new StringBuilder();
for (String cline : StringUtil.split(comment, "\n")) {
if ((m = JANNOTATION.matcher(cline)).matches()) {
if ((m = METHOD_ANNOTATION.matcher(cline)).matches()) {
name = m.group(1);
} else {
if (combuf.length() > 0) {
@@ -966,8 +975,7 @@ public class ActionScriptSource
return builder.toString();
}
protected String slurpUntil (BufferedReader reader, String text, String token,
boolean stripNewlines)
protected String slurpUntil (BufferedReader reader, String text, String token, boolean stripNL)
throws IOException
{
int braces = countChars(text, '{') - countChars(text, '}');
@@ -980,7 +988,7 @@ public class ActionScriptSource
"Too many close braces? [text=" + text + ", line=" + line + "].");
}
line = line.replaceAll("\\s+$", "");
if (!stripNewlines) {
if (!stripNL) {
text += "\n";
}
text += line;
@@ -1025,7 +1033,7 @@ public class ActionScriptSource
protected static Pattern JMETHOD = Pattern.compile(
"\\s+(?:public|protected|private).* ([a-zA-Z]\\w*) \\(.*");
protected static Pattern JANNOTATION = Pattern.compile(
protected static Pattern METHOD_ANNOTATION = Pattern.compile(
".*@ActionScript\\(name=\"(\\w+)\"\\).*");
protected static Pattern ASFIELD = Pattern.compile(
+10 -4
View File
@@ -35,14 +35,20 @@ import java.lang.annotation.ElementType;
public @interface ActionScript
{
/**
* Indicates whether this field, method or class should be omitted from the
* ActionScript translation.
* Indicates whether this field, method or class should be omitted from the ActionScript
* translation.
*/
boolean omit () default false;
/**
* Indicates a custom name to be used for the ActionScript version of this
* field, method or class.
* Indicates a custom name to be used for the ActionScript version of this field, method or
* class.
*/
String name () default "";
/**
* Indicates a custom type to be used for the ActionScript version of this field. Ignored if
* used on a method or class.
*/
String type () default "";
}