From f2cb5edf1a22f300441838e4083d709aa89a19a7 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Wed, 23 Mar 2016 22:27:43 +0300 Subject: [PATCH] Do not consider protected members in final class as public API --- .../org.jetbrains.kotlin.tools/PublicApiDump.kt | 6 +++++- .../kotlin/org.jetbrains.kotlin.tools/asmUtils.kt | 2 +- .../test/resources/output/cases/companions.txt | 3 --- .../test/resources/output/cases/nestedClasses.txt | 15 --------------- .../src/test/resources/output/cases/protected.txt | 5 ----- .../src/test/resources/output/kotlin-runtime.txt | 8 -------- 6 files changed, 6 insertions(+), 33 deletions(-) diff --git a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/PublicApiDump.kt b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/PublicApiDump.kt index 2ff1e93609e..828cbb336a1 100644 --- a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/PublicApiDump.kt +++ b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/PublicApiDump.kt @@ -59,7 +59,11 @@ fun List.filterOutNonPublic(): List val classByName = associateBy { it.name } fun ClassBinarySignature.isPublicAndAccessible(): Boolean = - isEffectivelyPublic && (outerName == null || classByName[outerName]?.isPublicAndAccessible() ?: true) + isEffectivelyPublic && + (outerName == null || classByName[outerName]?.let { outerClass -> + !(this.access.isProtected && outerClass.access.isFinal) + && outerClass.isPublicAndAccessible() + } ?: true) fun supertypes(superName: String) = generateSequence({ classByName[superName] }, { classByName[it.superName] }) diff --git a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/asmUtils.kt b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/asmUtils.kt index 52f1b8b55cd..a06f5ee81fd 100644 --- a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/asmUtils.kt +++ b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/asmUtils.kt @@ -36,7 +36,7 @@ interface MemberBinarySignature { val isInlineExposed: Boolean fun isEffectivelyPublic(classAccess: AccessFlags, classVisibility: ClassVisibility?) - = access.isPublic // && !(access.isProtected && classAccess.isFinal) + = access.isPublic && !(access.isProtected && classAccess.isFinal) && (classVisibility?.members?.get(MemberSignature(name, desc))?.isPublic(isInlineExposed) ?: true) val signature: String diff --git a/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/companions.txt b/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/companions.txt index 7a51fac2d10..657efa57a8f 100644 --- a/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/companions.txt +++ b/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/companions.txt @@ -41,9 +41,6 @@ public static final field Companion Lcases/companions/PublicClasses$ProtectedCom public fun ()V ------------------ -protected final class cases/companions/PublicClasses$ProtectedCompanion$Companion ------------------- - public final class cases/companions/PublicClasses$PublicCompanion public static final field Companion Lcases/companions/PublicClasses$PublicCompanion$Companion; public fun ()V diff --git a/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/nestedClasses.txt b/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/nestedClasses.txt index 19cf2477dc1..a216895c806 100644 --- a/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/nestedClasses.txt +++ b/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/nestedClasses.txt @@ -21,21 +21,10 @@ public final class cases/nestedClasses/PublicClass public fun ()V ------------------ -protected final class cases/nestedClasses/PublicClass$InnerProtected -public fun (Lcases/nestedClasses/PublicClass;)V ------------------- - public final class cases/nestedClasses/PublicClass$InnerPublic public fun (Lcases/nestedClasses/PublicClass;)V ------------------ -protected final class cases/nestedClasses/PublicClass$NestedProtected -public fun ()V ------------------- - -protected abstract interface class cases/nestedClasses/PublicClass$NestedProtectedInterface ------------------- - public final class cases/nestedClasses/PublicClass$NestedPublic public fun ()V ------------------ @@ -43,10 +32,6 @@ public fun ()V public abstract interface class cases/nestedClasses/PublicClass$NestedPublicInterface ------------------ -protected final class cases/nestedClasses/PublicClass$ObjProtected -public static final field INSTANCE Lcases/nestedClasses/PublicClass$ObjProtected; ------------------- - public final class cases/nestedClasses/PublicClass$ObjPublic public static final field INSTANCE Lcases/nestedClasses/PublicClass$ObjPublic; ------------------ diff --git a/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/protected.txt b/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/protected.txt index f5189a1f3a0..6a63380a647 100644 --- a/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/protected.txt +++ b/libraries/tools/binary-compatibility-validator/src/test/resources/output/cases/protected.txt @@ -7,11 +7,6 @@ protected abstract fun setProtectedVar (Ljava/lang/Object;)V ------------------ public final class cases/protected/PublicFinalClass -protected fun ()V -protected final fun getProtectedVal ()I -protected final fun getProtectedVar ()I -protected final fun protectedFun ()I -protected final fun setProtectedVar (I)V ------------------ public class cases/protected/PublicOpenClass diff --git a/libraries/tools/binary-compatibility-validator/src/test/resources/output/kotlin-runtime.txt b/libraries/tools/binary-compatibility-validator/src/test/resources/output/kotlin-runtime.txt index f8dc509bbe5..2dc232d98ed 100644 --- a/libraries/tools/binary-compatibility-validator/src/test/resources/output/kotlin-runtime.txt +++ b/libraries/tools/binary-compatibility-validator/src/test/resources/output/kotlin-runtime.txt @@ -349,7 +349,6 @@ public final class kotlin/jvm/internal/BooleanSpreadBuilder: kotlin/jvm/internal public fun (I)V public final fun add (Z)V public synthetic fun getSize (Ljava/lang/Object;)I -protected fun getSize ([Z)I public final fun toArray ()[Z ------------------ @@ -357,7 +356,6 @@ public final class kotlin/jvm/internal/ByteSpreadBuilder: kotlin/jvm/internal/Pr public fun (I)V public final fun add (B)V public synthetic fun getSize (Ljava/lang/Object;)I -protected fun getSize ([B)I public final fun toArray ()[B ------------------ @@ -381,7 +379,6 @@ public final class kotlin/jvm/internal/CharSpreadBuilder: kotlin/jvm/internal/Pr public fun (I)V public final fun add (C)V public synthetic fun getSize (Ljava/lang/Object;)I -protected fun getSize ([C)I public final fun toArray ()[C ------------------ @@ -413,7 +410,6 @@ public final class kotlin/jvm/internal/DoubleSpreadBuilder: kotlin/jvm/internal/ public fun (I)V public final fun add (D)V public synthetic fun getSize (Ljava/lang/Object;)I -protected fun getSize ([D)I public final fun toArray ()[D ------------------ @@ -421,7 +417,6 @@ public final class kotlin/jvm/internal/FloatSpreadBuilder: kotlin/jvm/internal/P public fun (I)V public final fun add (F)V public synthetic fun getSize (Ljava/lang/Object;)I -protected fun getSize ([F)I public final fun toArray ()[F ------------------ @@ -492,7 +487,6 @@ public final class kotlin/jvm/internal/IntSpreadBuilder: kotlin/jvm/internal/Pri public fun (I)V public final fun add (I)V public synthetic fun getSize (Ljava/lang/Object;)I -protected fun getSize ([I)I public final fun toArray ()[I ------------------ @@ -541,7 +535,6 @@ public final class kotlin/jvm/internal/LongSpreadBuilder: kotlin/jvm/internal/Pr public fun (I)V public final fun add (J)V public synthetic fun getSize (Ljava/lang/Object;)I -protected fun getSize ([J)I public final fun toArray ()[J ------------------ @@ -833,7 +826,6 @@ public final class kotlin/jvm/internal/ShortSpreadBuilder: kotlin/jvm/internal/P public fun (I)V public final fun add (S)V public synthetic fun getSize (Ljava/lang/Object;)I -protected fun getSize ([S)I public final fun toArray ()[S ------------------