diff options
author | aclement <aclement> | 2011-02-01 20:57:39 +0000 |
---|---|---|
committer | aclement <aclement> | 2011-02-01 20:57:39 +0000 |
commit | 8667e7ad76f65341a87d399d92a00aaa51da3367 (patch) | |
tree | 70cafe56fdfa3d7ad7116d1eba1c416e52709800 | |
parent | 0fb3c077c71da5a112c71ad44c62552fc725477e (diff) | |
download | aspectj-8667e7ad76f65341a87d399d92a00aaa51da3367.tar.gz aspectj-8667e7ad76f65341a87d399d92a00aaa51da3367.zip |
333123
-rw-r--r-- | asm/src/org/aspectj/asm/IProgramElement.java | 11 | ||||
-rw-r--r-- | asm/src/org/aspectj/asm/internal/ProgramElement.java | 102 |
2 files changed, 111 insertions, 2 deletions
diff --git a/asm/src/org/aspectj/asm/IProgramElement.java b/asm/src/org/aspectj/asm/IProgramElement.java index 96dedb2b2..19e6d95ac 100644 --- a/asm/src/org/aspectj/asm/IProgramElement.java +++ b/asm/src/org/aspectj/asm/IProgramElement.java @@ -95,7 +95,8 @@ public interface IProgramElement extends Serializable { public String getPackageName(); /** - * @param method return types or field types + * @param method + * return types or field types */ public void setCorrespondingType(String returnType); @@ -424,7 +425,8 @@ public interface IProgramElement extends Serializable { public boolean isAnnotationStyleDeclaration(); /** - * @param fullyQualifiedannotationType the annotation type, eg. p.q.r.Foo + * @param fullyQualifiedannotationType + * the annotation type, eg. p.q.r.Foo */ public void setAnnotationType(String fullyQualifiedannotationType); @@ -446,4 +448,9 @@ public interface IProgramElement extends Serializable { public void setAnnotationRemover(boolean isRemover); public boolean isAnnotationRemover(); + + /** + * @return the return type of a method or type of a field in signature form (e.g. Ljava/lang/String;) + */ + public String getCorrespondingTypeSignature(); }
\ No newline at end of file diff --git a/asm/src/org/aspectj/asm/internal/ProgramElement.java b/asm/src/org/aspectj/asm/internal/ProgramElement.java index bf7eb7f4b..b38a8286b 100644 --- a/asm/src/org/aspectj/asm/internal/ProgramElement.java +++ b/asm/src/org/aspectj/asm/internal/ProgramElement.java @@ -383,6 +383,108 @@ public class ProgramElement implements IProgramElement { return getCorrespondingType(false); } + public String getCorrespondingTypeSignature() { + String typename = (String) kvpairs.get("returnType"); + if (typename == null) { + return null; + } + return nameToSignature(typename); + } + + public static String nameToSignature(String name) { + int len = name.length(); + if (len < 8) { + if (name.equals("byte")) { + return "B"; + } + if (name.equals("char")) { + return "C"; + } + if (name.equals("double")) { + return "D"; + } + if (name.equals("float")) { + return "F"; + } + if (name.equals("int")) { + return "I"; + } + if (name.equals("long")) { + return "J"; + } + if (name.equals("short")) { + return "S"; + } + if (name.equals("boolean")) { + return "Z"; + } + if (name.equals("void")) { + return "V"; + } + if (name.equals("?")) { + return name; + } + } + if (name.endsWith("[]")) { + return "[" + nameToSignature(name.substring(0, name.length() - 2)); + } + if (len != 0) { + // check if someone is calling us with something that is a signature already + assert name.charAt(0) != '['; + + if (name.indexOf("<") == -1) { + // not parameterized + return new StringBuilder("L").append(name.replace('.', '/')).append(';').toString(); + } else { + StringBuffer nameBuff = new StringBuffer(); + int nestLevel = 0; + nameBuff.append("L"); + for (int i = 0; i < name.length(); i++) { + char c = name.charAt(i); + switch (c) { + case '.': + nameBuff.append('/'); + break; + case '<': + nameBuff.append("<"); + nestLevel++; + StringBuffer innerBuff = new StringBuffer(); + while (nestLevel > 0) { + c = name.charAt(++i); + if (c == '<') { + nestLevel++; + } + if (c == '>') { + nestLevel--; + } + if (c == ',' && nestLevel == 1) { + nameBuff.append(nameToSignature(innerBuff.toString())); + innerBuff = new StringBuffer(); + } else { + if (nestLevel > 0) { + innerBuff.append(c); + } + } + } + nameBuff.append(nameToSignature(innerBuff.toString())); + nameBuff.append('>'); + break; + case '>': + throw new IllegalStateException("Should by matched by <"); + case ',': + throw new IllegalStateException("Should only happen inside <...>"); + default: + nameBuff.append(c); + } + } + nameBuff.append(";"); + return nameBuff.toString(); + } + } else { + throw new IllegalArgumentException("Bad type name: " + name); + } + } + public String getCorrespondingType(boolean getFullyQualifiedType) { String returnType = (String) kvpairs.get("returnType"); if (returnType == null) { |