Example #1
0
        static void FixupClassVisibility(ClassFile klass, KotlinClass metadata)
        {
            // Hide class if it isn't Public/Protected
            if (klass.AccessFlags.IsPubliclyVisible() && !metadata.Visibility.IsPubliclyVisible())
            {
                // Interfaces should be set to "package-private"
                if (klass.AccessFlags.HasFlag(ClassAccessFlags.Interface))
                {
                    Log.Debug($"Kotlin: Setting internal interface {klass.ThisClass.Name.Value} to package-private");
                    klass.AccessFlags = SetPackagePrivate(klass.AccessFlags);

                    foreach (var ic in klass.InnerClasses)
                    {
                        Log.Debug($"Kotlin: Setting nested type {ic.InnerClass.Name.Value} in an internal interface to package-private");
                        ic.InnerClassAccessFlags = SetPackagePrivate(ic.InnerClassAccessFlags);
                    }

                    return;
                }

                Log.Debug($"Kotlin: Hiding internal class {klass.ThisClass.Name.Value}");
                klass.AccessFlags = ClassAccessFlags.Private;

                foreach (var ic in klass.InnerClasses)
                {
                    Log.Debug($"Kotlin: Hiding nested internal type {ic.InnerClass.Name.Value}");
                    ic.InnerClassAccessFlags = ClassAccessFlags.Private;
                }

                return;
            }
        }
Example #2
0
        public KotlinClass AsClassMetadata()
        {
            if (Kind != KotlinMetadataKind.Class)
            {
                return(null);
            }

            var md = KotlinBitEncoding.DecodeBytes(Data1);

            using (var ms = ToMemoryStream(md)) {
                // The first element is the length of the string table
                var first = ms.ReadByte();

                if (first == -1)
                {
                    return(null);
                }

                ms.Position = 0;

                var size = KotlinBitEncoding.ReadRawVarint32(ms);

                using (var partial = new PartialStream(ms, ms.Position, size)) {
                    // Read the string table from the stream
                    var string_table = Serializer.Deserialize <org.jetbrains.kotlin.metadata.jvm.StringTableTypes> (partial);
                    var resolver     = new JvmNameResolver(string_table, Data2.ToList());

                    partial.MoveNext();

                    // Read the metadata structure from the stream
                    var metadata = Serializer.Deserialize <org.jetbrains.kotlin.metadata.jvm.Class> (partial);
                    return(KotlinClass.FromProtobuf(metadata, resolver));
                }
            }
        }
Example #3
0
 static void FixupClassVisibility(ClassFile klass, KotlinClass metadata)
 {
     // Hide class if it isn't Public/Protected
     if (klass.AccessFlags.IsPubliclyVisible() && !metadata.Visibility.IsPubliclyVisible())
     {
         Log.Debug($"Kotlin: Hiding internal class {klass.ThisClass.Name.Value}");
         klass.AccessFlags = ClassAccessFlags.Private;
         return;
     }
 }
Example #4
0
        public KotlinClass AsClassMetadata()
        {
            if (Kind != KotlinMetadataKind.Class)
            {
                return(null);
            }

            var data = ParseStream <org.jetbrains.kotlin.metadata.jvm.Class> ();

            return(KotlinClass.FromProtobuf(data.Item1, data.Item2));
        }
Example #5
0
        static MethodInfo FindJavaConstructor(KotlinClass kotlinClass, KotlinConstructor constructor, ClassFile klass)
        {
            var all_constructors      = klass.Methods.Where(method => method.Name == "<init>" || method.Name == "<clinit>");
            var possible_constructors = all_constructors.Where(method => method.GetFilteredParameters().Length == constructor.ValueParameters.Count);

            foreach (var method in possible_constructors)
            {
                if (ParametersMatch(kotlinClass, method, constructor.ValueParameters))
                {
                    return(method);
                }
            }

            return(null);
        }
Example #6
0
        static void FixupFunction(MethodInfo method, KotlinFunction metadata, KotlinClass kotlinClass)
        {
            if (method is null || !method.IsPubliclyVisible)
            {
                return;
            }

            // Hide function if it isn't Public/Protected
            if (!metadata.Flags.IsPubliclyVisible())
            {
                Log.Debug($"Kotlin: Hiding internal method {method.DeclaringType?.ThisClass.Name.Value} - {metadata.GetSignature ()}");
                method.AccessFlags = MethodAccessFlags.Private;
                return;
            }

            var java_parameters = method.GetFilteredParameters();

            for (var i = 0; i < java_parameters.Length; i++)
            {
                var java_p   = java_parameters [i];
                var kotlin_p = metadata.ValueParameters [i];

                // Kotlin provides actual parameter names
                if (TypesMatch(java_p.Type, kotlin_p.Type, kotlinClass) && java_p.IsUnnamedParameter() && !kotlin_p.IsUnnamedParameter())
                {
                    Log.Debug($"Kotlin: Renaming parameter {method.DeclaringType?.ThisClass.Name.Value} - {method.Name} - {java_p.Name} -> {kotlin_p.Name}");
                    java_p.Name = kotlin_p.Name;
                }

                // Handle erasure of Kotlin unsigned types
                java_p.KotlinType = GetKotlinType(java_p.Type.TypeSignature, kotlin_p.Type.ClassName);
            }

            // Handle erasure of Kotlin unsigned types
            method.KotlinReturnType = GetKotlinType(method.ReturnType.TypeSignature, metadata.ReturnType.ClassName);
        }