Example #1
0
        /// <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);
        }