java: refactor DynamicCodeGen.java

This commit is contained in:
Muga Nishizawa
2010-10-02 22:12:40 +09:00
parent a3accd28ea
commit 3ec55791c6
3 changed files with 51 additions and 30 deletions

View File

@@ -100,6 +100,8 @@ public interface BasicConstants {
String METHOD_NAME_ORDINAL = "ordinal"; String METHOD_NAME_ORDINAL = "ordinal";
String METHOD_NAME_GETENUMCONSTANTS = "getEnumConstants";
String METHOD_NAME_CONVERT = "convert"; String METHOD_NAME_CONVERT = "convert";
String METHOD_NAME_MSGCONVERT = "messageConvert"; String METHOD_NAME_MSGCONVERT = "messageConvert";

View File

@@ -819,14 +819,23 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
// Object unpack(Unpacker pac) throws IOException, MessageTypeException; // Object unpack(Unpacker pac) throws IOException, MessageTypeException;
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
StringBuilder bsb = new StringBuilder(); StringBuilder bsb = new StringBuilder();
// FIXME
insertMethodCall(bsb, VARIABLE_NAME_PK, METHOD_NAME_UNPACKARRAY, insertMethodCall(bsb, VARIABLE_NAME_PK, METHOD_NAME_UNPACKARRAY,
new String[0]); new String[0]);
insertSemicolon(bsb); insertSemicolon(bsb);
// insertUnpackMethodBody(bsb, c, new Field[0]); StringBuilder mc = new StringBuilder();
bsb.append("int _$$_i = _$$_pk.unpackInt();"); insertMethodCall(mc, VARIABLE_NAME_PK, METHOD_NAME_UNPACKINT,
bsb.append("return " + c.getName() new String[0]);
+ ".class.getEnumConstants()[_$$_i];"); insertLocalVariableDecl(bsb, int.class, VARIABLE_NAME_I);
insertValueInsertion(bsb, mc.toString());
insertSemicolon(bsb);
mc = new StringBuilder();
insertMethodCall(mc, c.getName() + ".class",
METHOD_NAME_GETENUMCONSTANTS, new String[0]);
mc.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
mc.append(VARIABLE_NAME_I);
mc.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
insertReturnStat(bsb, mc.toString());
insertSemicolon(bsb);
addPublicMethodDecl(sb, METHOD_NAME_UNPACK, Object.class, addPublicMethodDecl(sb, METHOD_NAME_UNPACK, Object.class,
new Class<?>[] { Unpacker.class }, new Class<?>[] { Unpacker.class },
new String[] { VARIABLE_NAME_PK }, new Class<?>[] { new String[] { VARIABLE_NAME_PK }, new Class<?>[] {
@@ -883,21 +892,11 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
private void insertCodeOfMessagePackObjectArrayGet(StringBuilder sb) { private void insertCodeOfMessagePackObjectArrayGet(StringBuilder sb) {
// MessagePackObject[] ary = obj.asArray(); // MessagePackObject[] ary = obj.asArray();
sb.append(MessagePackObject.class.getName()); insertLocalVariableDecl(sb, MessagePackObject.class, VARIABLE_NAME_ARRAY, 1);
sb.append(CHAR_NAME_LEFT_SQUARE_BRACKET); StringBuilder mc = new StringBuilder();
sb.append(CHAR_NAME_RIGHT_SQUARE_BRACKET); insertMethodCall(mc, VARIABLE_NAME_MPO, METHOD_NAME_ASARRAY, new String[0]);
sb.append(CHAR_NAME_SPACE); insertValueInsertion(sb, mc.toString());
sb.append(VARIABLE_NAME_ARRAY); insertSemicolon(sb);
sb.append(CHAR_NAME_SPACE);
sb.append(CHAR_NAME_EQUAL);
sb.append(CHAR_NAME_SPACE);
sb.append(VARIABLE_NAME_MPO);
sb.append(CHAR_NAME_DOT);
sb.append(METHOD_NAME_ASARRAY);
sb.append(CHAR_NAME_LEFT_PARENTHESIS);
sb.append(CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(CHAR_NAME_SEMICOLON);
sb.append(CHAR_NAME_SPACE);
} }
private void insertCodeOfConvertMethodCalls(StringBuilder sb, Field[] fields) { private void insertCodeOfConvertMethodCalls(StringBuilder sb, Field[] fields) {
@@ -1106,7 +1105,7 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
sb.append(i); sb.append(i);
sb.append(CHAR_NAME_RIGHT_SQUARE_BRACKET); sb.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
sb.append(CHAR_NAME_DOT); sb.append(CHAR_NAME_DOT);
sb.append("asList"); sb.append(METHOD_NAME_ASLIST);
sb.append(CHAR_NAME_LEFT_PARENTHESIS); sb.append(CHAR_NAME_LEFT_PARENTHESIS);
sb.append(CHAR_NAME_RIGHT_PARENTHESIS); sb.append(CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(CHAR_NAME_SEMICOLON); sb.append(CHAR_NAME_SEMICOLON);
@@ -1352,15 +1351,25 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
StringBuilder bsb = new StringBuilder(); StringBuilder bsb = new StringBuilder();
insertCodeOfMessagePackObjectArrayGet(bsb); insertCodeOfMessagePackObjectArrayGet(bsb);
// insertConvertMethodBody(bsb, c, new Field[0]); StringBuilder mc = new StringBuilder();
// FIXME insertMethodCall(mc, VARIABLE_NAME_ARRAY + "[0]", METHOD_NAME_ASINT,
// bsb.append("_$$_ary[0].asInt(); "); new String[0]);
// bsb.append("int i = _$$_ary[1].asInt(); "); insertLocalVariableDecl(bsb, int.class, VARIABLE_NAME_I);
bsb.append("int i = _$$_ary[0].asInt(); "); insertValueInsertion(bsb, mc.toString());
bsb.append("java.lang.Object o = ").append(c.getName()).append( insertSemicolon(bsb);
".class.getEnumConstants()[i]; "); mc = new StringBuilder();
bsb.append("return (").append(c.getName()).append(") o; "); insertMethodCall(mc, c.getName() + ".class",
METHOD_NAME_GETENUMCONSTANTS, new String[0]);
mc.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
mc.append(VARIABLE_NAME_I);
mc.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
insertLocalVariableDecl(bsb, Object.class, VARIABLE_NAME_OBJECT);
insertValueInsertion(bsb, mc.toString());
insertSemicolon(bsb);
mc = new StringBuilder();
insertTypeCast(mc, c, VARIABLE_NAME_OBJECT);
insertReturnStat(bsb, mc.toString());
insertSemicolon(bsb);
addPublicMethodDecl(sb, METHOD_NAME_CONVERT, Object.class, addPublicMethodDecl(sb, METHOD_NAME_CONVERT, Object.class,
new Class<?>[] { MessagePackObject.class }, new Class<?>[] { MessagePackObject.class },
new String[] { VARIABLE_NAME_MPO }, new String[] { VARIABLE_NAME_MPO },

View File

@@ -62,7 +62,17 @@ public class DynamicCodeGenBase implements BasicConstants {
public void insertLocalVariableDecl(StringBuilder sb, Class<?> type, public void insertLocalVariableDecl(StringBuilder sb, Class<?> type,
String name) { String name) {
// int lv // int lv
insertLocalVariableDecl(sb, type, name, 0);
}
public void insertLocalVariableDecl(StringBuilder sb, Class<?> type,
String name, int dim) {
// int[] lv
sb.append(type.getName()); sb.append(type.getName());
for (int i = 0; i < dim; ++i) {
sb.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
sb.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
}
sb.append(CHAR_NAME_SPACE); sb.append(CHAR_NAME_SPACE);
sb.append(name); sb.append(name);
} }