@@ -70,36 +70,57 @@ static void FixupClassVisibility (ClassFile klass, KotlinClass metadata)
7070 // Interfaces should be set to "package-private"
7171 if ( klass . AccessFlags . HasFlag ( ClassAccessFlags . Interface ) ) {
7272 Log . Debug ( $ "Kotlin: Setting internal interface { klass . ThisClass . Name . Value } to package-private") ;
73- klass . AccessFlags = SetPackagePrivate ( klass . AccessFlags ) ;
73+ klass . AccessFlags = SetVisibility ( klass . AccessFlags , null ) ;
7474
7575 foreach ( var ic in klass . InnerClasses ) {
7676 Log . Debug ( $ "Kotlin: Setting nested type { ic . InnerClass . Name . Value } in an internal interface to package-private") ;
77- ic . InnerClassAccessFlags = SetPackagePrivate ( ic . InnerClassAccessFlags ) ;
77+ ic . InnerClassAccessFlags = SetVisibility ( ic . InnerClassAccessFlags , null ) ;
7878 }
7979
8080 return ;
8181 }
8282
8383 Log . Debug ( $ "Kotlin: Hiding internal class { klass . ThisClass . Name . Value } ") ;
84- klass . AccessFlags = ClassAccessFlags . Private ;
84+ klass . AccessFlags = SetVisibility ( klass . AccessFlags , ClassAccessFlags . Internal ) ;
8585
8686 foreach ( var ic in klass . InnerClasses ) {
8787 Log . Debug ( $ "Kotlin: Hiding nested internal type { ic . InnerClass . Name . Value } ") ;
88- ic . InnerClassAccessFlags = ClassAccessFlags . Private ;
88+ ic . InnerClassAccessFlags = SetVisibility ( ic . InnerClassAccessFlags , ClassAccessFlags . Internal ) ;
8989 }
9090
9191 return ;
9292 }
9393 }
9494
95- static ClassAccessFlags SetPackagePrivate ( ClassAccessFlags flags )
95+ // Passing null for 'newVisibility' parameter means 'package-private'
96+ static ClassAccessFlags SetVisibility ( ClassAccessFlags existing , ClassAccessFlags ? newVisibility )
9697 {
97- // Package-private is stored as "no visibility flags"
98- flags = ( flags ^ ClassAccessFlags . Public ) & flags ;
99- flags = ( flags ^ ClassAccessFlags . Protected ) & flags ;
100- flags = ( flags ^ ClassAccessFlags . Private ) & flags ;
98+ // First we need to remove any existing visibility flags,
99+ // without modifying other flags like Abstract
100+ existing = ( existing ^ ClassAccessFlags . Public ) & existing ;
101+ existing = ( existing ^ ClassAccessFlags . Protected ) & existing ;
102+ existing = ( existing ^ ClassAccessFlags . Private ) & existing ;
103+ existing = ( existing ^ ClassAccessFlags . Internal ) & existing ;
104+
105+ // Package-private is stored as "no visibility flags", so only add flag if specified
106+ if ( newVisibility . HasValue )
107+ existing |= newVisibility . Value ;
108+
109+ return existing ;
110+ }
111+
112+ static MethodAccessFlags SetVisibility ( MethodAccessFlags existing , MethodAccessFlags newVisibility )
113+ {
114+ // First we need to remove any existing visibility flags,
115+ // without modifying other flags like Abstract
116+ existing = ( existing ^ MethodAccessFlags . Public ) & existing ;
117+ existing = ( existing ^ MethodAccessFlags . Protected ) & existing ;
118+ existing = ( existing ^ MethodAccessFlags . Private ) & existing ;
119+ existing = ( existing ^ MethodAccessFlags . Internal ) & existing ;
101120
102- return flags ;
121+ existing |= newVisibility ;
122+
123+ return existing ;
103124 }
104125
105126 static void FixupJavaMethods ( Methods methods )
@@ -132,7 +153,7 @@ static void FixupConstructor (MethodInfo method, KotlinConstructor metadata)
132153 // Hide constructor if it isn't Public/Protected
133154 if ( method . IsPubliclyVisible && ! metadata . Flags . IsPubliclyVisible ( ) ) {
134155 Log . Debug ( $ "Kotlin: Hiding internal constructor { method . DeclaringType ? . ThisClass . Name . Value } - { metadata . GetSignature ( ) } ") ;
135- method . AccessFlags = MethodAccessFlags . Private ;
156+ method . AccessFlags = SetVisibility ( method . AccessFlags , MethodAccessFlags . Internal ) ;
136157 }
137158 }
138159
@@ -144,7 +165,7 @@ static void FixupFunction (MethodInfo method, KotlinFunction metadata, KotlinCla
144165 // Hide function if it isn't Public/Protected
145166 if ( ! metadata . Flags . IsPubliclyVisible ( ) ) {
146167 Log . Debug ( $ "Kotlin: Hiding internal method { method . DeclaringType ? . ThisClass . Name . Value } - { metadata . GetSignature ( ) } ") ;
147- method . AccessFlags = MethodAccessFlags . Private ;
168+ method . AccessFlags = SetVisibility ( method . AccessFlags , MethodAccessFlags . Internal ) ;
148169 return ;
149170 }
150171
@@ -190,12 +211,12 @@ static void FixupProperty (MethodInfo getter, MethodInfo setter, KotlinProperty
190211
191212 if ( getter ? . IsPubliclyVisible == true ) {
192213 Log . Debug ( $ "Kotlin: Hiding internal getter method { getter . DeclaringType ? . ThisClass . Name . Value } - { getter . Name } ") ;
193- getter . AccessFlags = MethodAccessFlags . Private ;
214+ getter . AccessFlags = SetVisibility ( getter . AccessFlags , MethodAccessFlags . Internal ) ;
194215 }
195216
196217 if ( setter ? . IsPubliclyVisible == true ) {
197218 Log . Debug ( $ "Kotlin: Hiding internal setter method { setter . DeclaringType ? . ThisClass . Name . Value } - { setter . Name } ") ;
198- setter . AccessFlags = MethodAccessFlags . Private ;
219+ setter . AccessFlags = SetVisibility ( setter . AccessFlags , MethodAccessFlags . Internal ) ;
199220 }
200221
201222 return ;
0 commit comments