示例#1
0
        /// <summary>
        /// Create a type builder for the given type.
        /// </summary>
        internal static IClassBuilder[] Create(ReachableContext context, AssemblyCompiler compiler, TypeDefinition typeDef)
        {
            if (typeDef.FullName == "<Module>")
                return new IClassBuilder[] { new SkipClassBuilder() };
            if (typeDef.IsDelegate())
                return new IClassBuilder[] {new DelegateClassBuilder(context, compiler, typeDef) };
            if (typeDef.IsAttribute()) 
                return new IClassBuilder[]  {new AttributeClassBuilder(context, compiler, typeDef) };
            if (typeDef.IsAnnotation())
                return new IClassBuilder[] {new AnnotationClassBuilder(context, compiler, typeDef) };
            if (typeDef.HasDexImportAttribute())
                return new IClassBuilder[] {new DexImportClassBuilder(context, compiler, typeDef) };
            if (typeDef.HasJavaImportAttribute())
                return new IClassBuilder[] {CreateJavaImportBuilder(context, compiler, typeDef)};
            if (typeDef.BaseType != null && typeDef.BaseType.FullName == "Android.App.Application")
                return new IClassBuilder[] { new AndroidAppApplicationDerivedBuilder(context,compiler,typeDef) };
            if (typeDef.IsEnum)
            {
                if (typeDef.UsedInNullableT)
                {
                    var nullableBaseClassBuilder = new NullableEnumBaseClassBuilder(context, compiler, typeDef);
                    IClassBuilder builder = new EnumClassBuilder(context, compiler, typeDef, nullableBaseClassBuilder);
                    return new[] { builder, nullableBaseClassBuilder };
                }
                return new IClassBuilder[] { new EnumClassBuilder(context, compiler, typeDef, null) };
            }
            else
            {
                if (!typeDef.UsedInNullableT)
                    return new[] { new StandardClassBuilder(context, compiler, typeDef) };

                var builder = new StandardClassBuilder(context, compiler, typeDef);
                var nullableBuilder = new NullableMarkerClassBuilder(context, compiler, typeDef, builder);

                return new IClassBuilder[] { builder, nullableBuilder };
            }
        }
示例#2
0
        /// <summary>
        /// Create a type builder for the given type.
        /// </summary>
        internal static IClassBuilder[] Create(ReachableContext context, AssemblyCompiler compiler, TypeDefinition typeDef)
        {
            if (typeDef.FullName == "<Module>")
            {
                return new IClassBuilder[] { new SkipClassBuilder() }
            }
            ;
            if (typeDef.IsDelegate())
            {
                return new IClassBuilder[] { new DelegateClassBuilder(context, compiler, typeDef) }
            }
            ;
            if (typeDef.IsAttribute())
            {
                return new IClassBuilder[]  { new AttributeClassBuilder(context, compiler, typeDef) }
            }
            ;
            if (typeDef.IsAnnotation())
            {
                return new IClassBuilder[] { new AnnotationClassBuilder(context, compiler, typeDef) }
            }
            ;
            if (typeDef.HasDexImportAttribute())
            {
                return new IClassBuilder[] { new DexImportClassBuilder(context, compiler, typeDef) }
            }
            ;
            if (typeDef.HasJavaImportAttribute())
            {
                return new IClassBuilder[] { CreateJavaImportBuilder(context, compiler, typeDef) }
            }
            ;
            if (typeDef.BaseType != null && typeDef.BaseType.FullName == "Android.App.Application")
            {
                return new IClassBuilder[] { new AndroidAppApplicationDerivedBuilder(context, compiler, typeDef) }
            }
            ;
            if (typeDef.IsEnum)
            {
                if (typeDef.UsedInNullableT)
                {
                    var           nullableBaseClassBuilder = new NullableEnumBaseClassBuilder(context, compiler, typeDef);
                    IClassBuilder builder = new EnumClassBuilder(context, compiler, typeDef, nullableBaseClassBuilder);
                    return(new[] { builder, nullableBaseClassBuilder });
                }
                return(new IClassBuilder[] { new EnumClassBuilder(context, compiler, typeDef, null) });
            }
            else
            {
                if (!typeDef.UsedInNullableT)
                {
                    return new[] { new StandardClassBuilder(context, compiler, typeDef) }
                }
                ;

                var builder         = new StandardClassBuilder(context, compiler, typeDef);
                var nullableBuilder = new NullableMarkerClassBuilder(context, compiler, typeDef, builder);

                return(new IClassBuilder[] { builder, nullableBuilder });
            }
        }