/// <summary> /// Create an annotation for the given attribute /// </summary> private static void CreateAttributeAnnotation(AssemblyCompiler compiler, CustomAttribute attribute, TypeDefinition attributeType, List <Annotation> annotationList, DexTargetPackage targetPackage) { // Gets the mapping for the type of attribute var mapping = compiler.GetAttributeAnnotationMapping(attributeType); MethodDefinition factoryMethod; // Note: not multithreading capable. see my comments elsewhere. if (mapping.FactoryMethodMap.ContainsKey(attribute)) { factoryMethod = mapping.FactoryMethodMap[attribute]; } else { // create the factory method. factoryMethod = CreateFactoryMethod(compiler, targetPackage, attribute, mapping); mapping.FactoryMethodMap[attribute] = factoryMethod; } // Create attribute annotation var attrAnnotation = new Annotation { Visibility = AnnotationVisibility.Runtime }; attrAnnotation.Type = compiler.GetDot42InternalType("IAttribute").GetClassReference(targetPackage); attrAnnotation.Arguments.Add(new AnnotationArgument("AttributeType", attributeType.GetReference(targetPackage, compiler.Module))); attrAnnotation.Arguments.Add(new AnnotationArgument("FactoryMethod", factoryMethod.Name)); // Add annotation annotationList.Add(attrAnnotation); }
/// <summary> /// Create an annotation for the given attribute /// </summary> private static void CreateAttributeAnnotation(AssemblyCompiler compiler, CustomAttribute attribute, TypeDefinition attributeType, List<Annotation> annotationList, DexTargetPackage targetPackage) { // Gets the mapping for the type of attribute var mapping = compiler.GetAttributeAnnotationMapping(attributeType); MethodDefinition factoryMethod; // Note: not multithreading capable. see my comments elsewhere. if(mapping.FactoryMethodMap.ContainsKey(attribute)) factoryMethod = mapping.FactoryMethodMap[attribute]; else { // create the factory method. factoryMethod = CreateFactoryMethod(compiler, targetPackage, attribute, mapping); mapping.FactoryMethodMap[attribute] = factoryMethod; } // Create attribute annotation var attrAnnotation = new Annotation { Visibility = AnnotationVisibility.Runtime }; attrAnnotation.Type = compiler.GetDot42InternalType("IAttribute").GetClassReference(targetPackage); attrAnnotation.Arguments.Add(new AnnotationArgument("AttributeType", attributeType.GetReference(targetPackage, compiler.Module))); attrAnnotation.Arguments.Add(new AnnotationArgument("FactoryMethod", factoryMethod.Name)); // Add annotation annotationList.Add(attrAnnotation); }