diff options
author | chiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3> | 2006-06-13 02:33:13 +0000 |
---|---|---|
committer | chiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3> | 2006-06-13 02:33:13 +0000 |
commit | 19a7ea2a8507a766a4d4414b05552f07b935de2a (patch) | |
tree | be9f206c3aec72115f20c90f245518a7367f153c | |
parent | d759705aca5094a3d907179421dae4a99be59fde (diff) | |
download | javassist-19a7ea2a8507a766a4d4414b05552f07b935de2a.tar.gz javassist-19a7ea2a8507a766a4d4414b05552f07b935de2a.zip |
modified to generate a better comiple error message.
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@282 30ef5769-5b8d-40dd-aea6-55b5d6557bb3
-rw-r--r-- | src/main/javassist/compiler/MemberResolver.java | 24 | ||||
-rw-r--r-- | src/main/javassist/compiler/TypeChecker.java | 60 |
2 files changed, 72 insertions, 12 deletions
diff --git a/src/main/javassist/compiler/MemberResolver.java b/src/main/javassist/compiler/MemberResolver.java index 2a359bbb..4fcf0a76 100644 --- a/src/main/javassist/compiler/MemberResolver.java +++ b/src/main/javassist/compiler/MemberResolver.java @@ -323,15 +323,28 @@ public class MemberResolver implements TokenId { { String cname = ""; CtClass clazz; - switch (type) { - case CLASS : + if (type == CLASS) { clazz = lookupClassByJvmName(classname); if (dim > 0) cname = clazz.getName(); else return clazz; + } + else + cname = getTypeName(type); - break; + while (dim-- > 0) + cname += "[]"; + + return lookupClass(cname, false); + } + + /* + * type cannot be CLASS + */ + static String getTypeName(int type) throws CompileError { + String cname = ""; + switch (type) { case BOOLEAN : cname = "boolean"; break; @@ -363,10 +376,7 @@ public class MemberResolver implements TokenId { fatal(); } - while (dim-- > 0) - cname += "[]"; - - return lookupClass(cname, false); + return cname; } /** diff --git a/src/main/javassist/compiler/TypeChecker.java b/src/main/javassist/compiler/TypeChecker.java index 4e240881..67e8cef4 100644 --- a/src/main/javassist/compiler/TypeChecker.java +++ b/src/main/javassist/compiler/TypeChecker.java @@ -15,8 +15,6 @@ package javassist.compiler; -import java.util.Arrays; - import javassist.CtClass; import javassist.CtField; import javassist.ClassPool; @@ -48,6 +46,56 @@ public class TypeChecker extends Visitor implements Opcode, TokenId { thisMethod = null; } + /* + * Converts an array of tuples of exprType, arrayDim, and className + * into a String object. + */ + protected static String argTypesToString(int[] types, int[] dims, + String[] cnames) { + StringBuffer sbuf = new StringBuffer(); + sbuf.append('('); + int n = types.length; + if (n > 0) { + int i = 0; + while (true) { + typeToString(sbuf, types[i], dims[i], cnames[i]); + if (++i < n) + sbuf.append(','); + else + break; + } + } + + sbuf.append(')'); + return sbuf.toString(); + } + + /* + * Converts a tuple of exprType, arrayDim, and className + * into a String object. + */ + protected static StringBuffer typeToString(StringBuffer sbuf, + int type, int dim, String cname) { + String s; + if (type == CLASS) + s = MemberResolver.jvmToJavaName(cname); + else if (type == NULL) + s = "Object"; + else + try { + s = MemberResolver.getTypeName(type); + } + catch (CompileError e) { + s = "?"; + } + + sbuf.append(s); + while (dim-- > 0) + sbuf.append("[]"); + + return sbuf; + } + /** * Records the currently compiled method. */ @@ -657,12 +705,14 @@ public class TypeChecker extends Visitor implements Opcode, TokenId { = resolver.lookupMethod(targetClass, thisClass, thisMethod, mname, types, dims, cnames); if (found == null) { + String clazz = targetClass.getName(); + String signature = argTypesToString(types, dims, cnames); String msg; if (mname.equals(MethodInfo.nameInit)) - msg = "constructor not found"; + msg = "cannot find constructor " + clazz + signature; else - msg = "Method " + mname + Arrays.asList(cnames)+ " not found in " - + targetClass.getName(); + msg = mname + signature + " not found in " + clazz; + throw new CompileError(msg); } |