/// <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); } }
/// <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); } }