]> source.dussan.org Git - javassist.git/commitdiff
added CtBehavior.getLongName()
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Thu, 23 Nov 2006 02:49:04 +0000 (02:49 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Thu, 23 Nov 2006 02:49:04 +0000 (02:49 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@336 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

Readme.html
src/main/javassist/CodeConverter.java
src/main/javassist/CtBehavior.java
src/main/javassist/CtClass.java
src/main/javassist/CtConstructor.java
src/main/javassist/CtMethod.java
src/main/javassist/bytecode/Descriptor.java

index a7715eee24cdd65b9a7ca90fe735166a09682645..d795b4de2f6711bfe3d4aef38c59d086a02b3e77 100644 (file)
@@ -281,6 +281,8 @@ see javassist.Dump.
 
 <h2>Changes</h2>
 
+<p>-version 3.5
+
 <p>-version 3.4 on November 17, 2006
 <ul>
        <li>A bug in CodeConverter#replaceFieldRead() and CodeConverter#replaceFieldWrite()
index 1c8cf2f660d11e5a88bd5f788ed2d2066ca0f5b8..d9a184534694f1348ffffcdf9655ba984f43f465 100644 (file)
@@ -224,7 +224,8 @@ public class CodeConverter {
         String d1 = origMethod.getMethodInfo2().getDescriptor();
         String d2 = substMethod.getMethodInfo2().getDescriptor();
         if (!d1.equals(d2))
-            throw new CannotCompileException("signature mismatch");
+            throw new CannotCompileException("signature mismatch: "
+                                             + substMethod.getLongName());
 
         int mod1 = origMethod.getModifiers();
         int mod2 = substMethod.getModifiers();
@@ -232,7 +233,8 @@ public class CodeConverter {
             || (Modifier.isPrivate(mod1) && !Modifier.isPrivate(mod2))
             || origMethod.getDeclaringClass().isInterface()
                != substMethod.getDeclaringClass().isInterface())
-            throw new CannotCompileException("invoke-type mismatch");
+            throw new CannotCompileException("invoke-type mismatch "
+                                             + substMethod.getLongName());
 
         transformers = new TransformCall(transformers, origMethod,
                                          substMethod);
index ce0880594d890082513e5a163a323170603eb619..6f4777e81cd6f9529dd5e9a6b0f23277a5194dd9 100644 (file)
@@ -81,6 +81,14 @@ public abstract class CtBehavior extends CtMember {
         buffer.append(methodInfo.getDescriptor());
     }
 
+    /**
+     * Returns the method or constructor name followed by parameter types
+     * such as <code>javassist.CtBehavior.stBody(String)</code>.
+     *
+     * @since 3.5
+     */
+    public abstract String getLongName();
+
     /**
      * Returns the MethodInfo representing this method/constructor in the
      * class file.
index 22219da42172365c93fdb536562228f029e6b7ec..a5151ec89f81fcc220421843375646acb6d6c2fd 100644 (file)
@@ -52,7 +52,7 @@ public abstract class CtClass {
     /**
      * The version number of this release.
      */
-    public static final String version = "3.4";
+    public static final String version = "3.5unstable";
 
     /**
      * Prints the version number and the copyright notice.
index 03f390ad0b4cb6e1c137e0c1d6fcadae20fd0c11..a2868fc72c8742025c70d4b1676d2aafe2281c41 100644 (file)
@@ -115,6 +115,18 @@ public final class CtConstructor extends CtBehavior {
         return methodInfo.isStaticInitializer();
     }
 
+    /**
+     * Returns the constructor name followed by parameter types
+     * such as <code>javassist.CtConstructor(CtClass[],CtClass)</code>.
+     *
+     * @since 3.5
+     */
+    public String getLongName() {
+        return getDeclaringClass().getName()
+               + (isConstructor() ? Descriptor.toString(getSignature())
+                                  : ("." + MethodInfo.nameClinit + "()"));
+    }
+
     /**
      * Obtains the name of this constructor.
      * It is the same as the simple name of the class declaring this
index 90181c8dedc21203d01d84cebd2baf8e6d4ef4dc..a22866457653a93d396a4caefc498bac9e6aab09 100644 (file)
@@ -154,6 +154,17 @@ public final class CtMethod extends CtBehavior {
                && ((CtMethod)obj).getStringRep().equals(getStringRep());
     }
 
+    /**
+     * Returns the method name followed by parameter types
+     * such as <code>javassist.CtMethod.setBody(String)</code>.
+     *
+     * @since 3.5
+     */
+    public String getLongName() {
+        return getDeclaringClass().getName() + "."
+               + getName() + Descriptor.toString(getSignature());
+    }
+
     /**
      * Obtains the name of this method.
      */
index b88fc3394024481aa96c4e8d7e5478be6d983bf3..f7185ab73629469294e0dcabccb880d67d79734f 100644 (file)
@@ -684,6 +684,69 @@ public class Descriptor {
         return n;
     }
 
+    /**
+     * Returns a human-readable representation of the
+     * given descriptor.  For example, <code>Ljava/lang/Object;</code>
+     * is converted into <code>java.lang.Object</code>.
+     * <code>(I[I)V</code> is converted into <code>(int, int[])</code>
+     * (the return type is ignored). 
+     */
+    public static String toString(String desc) {
+        return PrettyPrinter.toString(desc);
+    }
+
+    static class PrettyPrinter {
+        static String toString(String desc) {
+            StringBuffer sbuf = new StringBuffer();
+            if (desc.charAt(0) == '(') {
+                int pos = 1;
+                sbuf.append('(');
+                while (desc.charAt(pos) != ')') {
+                    if (pos > 1)
+                        sbuf.append(',');
+
+                    pos = readType(sbuf, pos, desc);
+                }
+
+                sbuf.append(')');
+            }
+            else
+                readType(sbuf, 0, desc);
+
+            return sbuf.toString();
+        }
+
+        static int readType(StringBuffer sbuf, int pos, String desc) {
+            char c = desc.charAt(pos);
+            int arrayDim = 0;
+            while (c == '[') {
+                arrayDim++;
+                c = desc.charAt(++pos);
+            }
+
+            if (c == 'L')
+                while (true) {
+                    c = desc.charAt(++pos);
+                    if (c == ';')
+                        break;
+
+                    if (c == '/')
+                        c = '.';
+
+                    sbuf.append(c);
+                }
+            else {
+                CtClass t = toPrimitiveClass(c);
+                sbuf.append(t.getName());
+            }
+
+            while (arrayDim-- > 0)
+                sbuf.append("[]");
+
+            return pos + 1;
+        }
+    }
+
     /**
      * An Iterator over a descriptor.
      */