示例#1
0
        /// <summary>
        /// Create the current type as class definition.
        /// </summary>
        protected virtual void CreateClassDefinition(DexTargetPackage targetPackage, ClassDefinition parent, TypeDefinition parentType, XTypeDefinition parentXType)
        {
            // Create classdef
            var nsConverter = targetPackage.NameConverter;

            classDef           = new ClassDefinition();
            classDef.MapFileId = compiler.GetNextMapFileId();
            classDef.Namespace = nsConverter.GetConvertedNamespace(XType);
            var name = CreateClassName(XType);

            if ((parentType != null) && parentType.HasDexImportAttribute())
            {
                var fullName = nsConverter.GetConvertedFullName(parentXType) + "_" + name;
                var index    = fullName.LastIndexOf('.');
                classDef.Name = (index < 0) ? fullName : fullName.Substring(index + 1);
            }
            else
            {
                classDef.Name = (parent != null) ? parent.Name + "$" + name : name;
            }

            // Set access flags
            //if (typeDef.IsPublic) classDef.IsPublic = true;
            //else classDef.IsPrivate = true;
            classDef.IsPublic = true;
            if (typeDef.IsSealed)
            {
                classDef.IsFinal = true;
            }

            if (typeDef.IsInterface)
            {
                classDef.IsInterface = true;
                classDef.IsAbstract  = true;
            }
            else if (typeDef.IsAbstract && !classDef.IsFinal) // apparently Android 6.x verifier does not allow 'final abstact' classes.
            {
                classDef.IsAbstract = true;
            }

            if ((parent != null) && (!parentType.HasDexImportAttribute()))
            {
                // Add to parent if this is a nested type
                classDef.Owner = parent;
                parent.AddInnerClass(classDef);
            }
            else
            {
                // Add to dex if it is a root class
                // TODO: here we could simplify the names, e.g. remove the scope, as long as no
                //       clashing does occur.
                targetPackage.DexFile.AddClass(classDef);
            }
        }
示例#2
0
        /// <summary>
        /// Create the current type as class definition.
        /// </summary>
        protected virtual void CreateClassDefinition(Dex target, NameConverter nsConverter, ClassDefinition parent, ClassFile parentClass)
        {
            // Create classdef
            classDef           = new ClassDefinition();
            classDef.MapFileId = compiler.GetNextMapFileId();
            classDef.Namespace = nsConverter.GetConvertedNamespace(typeDef);
            var name = NameConverter.GetConvertedName(typeDef);

            classDef.Name = (parent != null) ? parent.Name + "$" + name : name;

            // Set access flags
            //if (typeDef.IsPublic) classDef.IsPublic = true;
            //else classDef.IsPrivate = true;
            classDef.IsPublic = true;
            if (typeDef.IsFinal)
            {
                classDef.IsFinal = true;
            }
            if (typeDef.IsInterface)
            {
                classDef.IsInterface = true;
                classDef.IsAbstract  = true;
            }
            else if (typeDef.IsAbstract)
            {
                classDef.IsAbstract = true;
            }
            if (typeDef.Interfaces.Any(x => x.ClassName == "java/lang/annotation/Annotation"))
            {
                classDef.IsAnnotation = true;
            }

            classDef.IsEnum = typeDef.IsEnum;

            if (parent != null)
            {
                // Add to parent if this is a nested type
                classDef.Owner = parent;
                parent.AddInnerClass(classDef);
            }
            else
            {
                // Add to dex if it is a root class
                target.AddClass(classDef);
            }
        }