From 4b341a1c720218609e03e56215178ec3e8881681 Mon Sep 17 00:00:00 2001 From: acolyer Date: Fri, 29 Jul 2005 11:12:52 +0000 Subject: [PATCH] fields now unpack their generic signature to determine the true field type --- .../org/aspectj/weaver/bcel/BcelField.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) 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). + */ + 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 -- 2.39.5