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