private static void AddMetaAnnotations(ClassFileWriter writer, TypeWrapper tw) { DotNetTypeWrapper.AttributeAnnotationTypeWrapperBase attributeAnnotation = tw as DotNetTypeWrapper.AttributeAnnotationTypeWrapperBase; if (attributeAnnotation != null) { // TODO write the annotation directly, instead of going thru the object[] encoding RuntimeVisibleAnnotationsAttribute annot = new RuntimeVisibleAnnotationsAttribute(writer); annot.Add(new object[] { AnnotationDefaultAttribute.TAG_ANNOTATION, "Ljava/lang/annotation/Retention;", "value", new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/RetentionPolicy;", "RUNTIME" } }); AttributeTargets validOn = attributeAnnotation.AttributeTargets; List <object> targets = new List <object>(); targets.Add(AnnotationDefaultAttribute.TAG_ARRAY); if ((validOn & (AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Delegate | AttributeTargets.Assembly)) != 0) { targets.Add(new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/ElementType;", "TYPE" }); } if ((validOn & AttributeTargets.Constructor) != 0) { targets.Add(new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/ElementType;", "CONSTRUCTOR" }); } if ((validOn & AttributeTargets.Field) != 0) { targets.Add(new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/ElementType;", "FIELD" }); } if ((validOn & (AttributeTargets.Method | AttributeTargets.ReturnValue)) != 0) { targets.Add(new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/ElementType;", "METHOD" }); } if ((validOn & AttributeTargets.Parameter) != 0) { targets.Add(new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/ElementType;", "PARAMETER" }); } annot.Add(new object[] { AnnotationDefaultAttribute.TAG_ANNOTATION, "Ljava/lang/annotation/Target;", "value", targets.ToArray() }); if (IsRepeatableAnnotation(tw)) { annot.Add(new object[] { AnnotationDefaultAttribute.TAG_ANNOTATION, "Ljava/lang/annotation/Repeatable;", "value", new object[] { AnnotationDefaultAttribute.TAG_CLASS, "L" + (tw.Name + DotNetTypeWrapper.AttributeAnnotationMultipleSuffix).Replace('.', '/') + ";" } }); } writer.AddAttribute(annot); } }
private static void AddMetaAnnotations(ClassFileWriter writer, TypeWrapper tw) { DotNetTypeWrapper.AttributeAnnotationTypeWrapperBase attributeAnnotation = tw as DotNetTypeWrapper.AttributeAnnotationTypeWrapperBase; if (attributeAnnotation != null) { // TODO write the annotation directly, instead of going thru the object[] encoding RuntimeVisibleAnnotationsAttribute annot = new RuntimeVisibleAnnotationsAttribute(writer); annot.Add(new object[] { AnnotationDefaultAttribute.TAG_ANNOTATION, "Ljava/lang/annotation/Retention;", "value", new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/RetentionPolicy;", "RUNTIME" } }); AttributeTargets validOn = attributeAnnotation.AttributeTargets; List<object> targets = new List<object>(); targets.Add(AnnotationDefaultAttribute.TAG_ARRAY); if ((validOn & (AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Delegate | AttributeTargets.Assembly)) != 0) { targets.Add(new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/ElementType;", "TYPE" }); } if ((validOn & AttributeTargets.Constructor) != 0) { targets.Add(new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/ElementType;", "CONSTRUCTOR" }); } if ((validOn & AttributeTargets.Field) != 0) { targets.Add(new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/ElementType;", "FIELD" }); } if ((validOn & (AttributeTargets.Method | AttributeTargets.ReturnValue)) != 0) { targets.Add(new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/ElementType;", "METHOD" }); } if ((validOn & AttributeTargets.Parameter) != 0) { targets.Add(new object[] { AnnotationDefaultAttribute.TAG_ENUM, "Ljava/lang/annotation/ElementType;", "PARAMETER" }); } annot.Add(new object[] { AnnotationDefaultAttribute.TAG_ANNOTATION, "Ljava/lang/annotation/Target;", "value", targets.ToArray() }); if (Experimental.JDK_8 && IsRepeatableAnnotation(tw)) { annot.Add(new object[] { AnnotationDefaultAttribute.TAG_ANNOTATION, "Ljava/lang/annotation/Repeatable;", "value", new object[] { AnnotationDefaultAttribute.TAG_CLASS, "L" + (tw.Name + DotNetTypeWrapper.AttributeAnnotationMultipleSuffix).Replace('.', '/') + ";" } }); } writer.AddAttribute(annot); } }