diff options
author | acolyer <acolyer> | 2005-07-29 11:12:52 +0000 |
---|---|---|
committer | acolyer <acolyer> | 2005-07-29 11:12:52 +0000 |
commit | 4b341a1c720218609e03e56215178ec3e8881681 (patch) | |
tree | 2d5c5bc46ed3f4cafd7bf27b5a8fced0b3954c81 /weaver | |
parent | f6515cf9cbf32f1103202131f74293bf23e96835 (diff) | |
download | aspectj-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.java | 28 |
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 |