summaryrefslogtreecommitdiffstats
path: root/weaver
diff options
context:
space:
mode:
authoracolyer <acolyer>2005-07-29 11:12:52 +0000
committeracolyer <acolyer>2005-07-29 11:12:52 +0000
commit4b341a1c720218609e03e56215178ec3e8881681 (patch)
tree2d5c5bc46ed3f4cafd7bf27b5a8fced0b3954c81 /weaver
parentf6515cf9cbf32f1103202131f74293bf23e96835 (diff)
downloadaspectj-4b341a1c720218609e03e56215178ec3e8881681.tar.gz
aspectj-4b341a1c720218609e03e56215178ec3e8881681.zip
fields now unpack their generic signature to determine the true field type
Diffstat (limited to 'weaver')
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelField.java28
1 files changed, 28 insertions, 0 deletions
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelField.java b/weaver/src/org/aspectj/weaver/bcel/BcelField.java
index 533b8b55d..eff031abc 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelField.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelField.java
@@ -18,6 +18,8 @@ import java.util.List;
import org.aspectj.apache.bcel.classfile.Attribute;
import org.aspectj.apache.bcel.classfile.Field;
+import org.aspectj.apache.bcel.classfile.GenericSignatureParser;
+import org.aspectj.apache.bcel.classfile.Signature;
import org.aspectj.apache.bcel.classfile.Synthetic;
import org.aspectj.apache.bcel.classfile.annotation.Annotation;
import org.aspectj.weaver.AjAttribute;
@@ -37,6 +39,8 @@ final class BcelField extends ResolvedMember {
private AnnotationX[] annotations;
private World world;
private BcelObjectType bcelObjectType;
+ private UnresolvedType genericFieldType = null;
+ private boolean unpackedGenericSignature = false;
BcelField(BcelObjectType declaringType, Field field) {
super(
@@ -134,4 +138,28 @@ final class BcelField extends ResolvedMember {
// level??
field.addAnnotation(annotation.getBcelAnnotation());
}
+
+ /**
+ * Unpack the generic signature attribute if there is one and we haven't already
+ * done so, then find the true field type of this field (eg. List<String>).
+ */
+ public UnresolvedType getGenericReturnType() {
+ unpackGenericSignature();
+ return genericFieldType;
+ }
+
+ private void unpackGenericSignature() {
+ if (unpackedGenericSignature) return;
+ unpackedGenericSignature = true;
+ String gSig = field.getGenericSignature();
+ if (gSig != null) {
+ // get from generic
+ Signature.FieldTypeSignature fts = new GenericSignatureParser().parseAsFieldSignature(gSig);
+ Signature.ClassSignature genericTypeSig = bcelObjectType.getGenericClassTypeSignature();
+ Signature.FormalTypeParameter[] typeVars = ((genericTypeSig == null) ? new Signature.FormalTypeParameter[0] : genericTypeSig.formalTypeParameters);
+ genericFieldType = BcelGenericSignatureToTypeXConverter.fieldTypeSignature2TypeX(fts, typeVars, world);
+ } else {
+ genericFieldType = getReturnType();
+ }
+ }
} \ No newline at end of file