Treat inline-exposed internal API as effectively public.

Comment out unsupported cases.
This commit is contained in:
Ilya Gorbunov
2016-03-23 17:58:14 +03:00
parent 0aaf0ba60f
commit 10792de4c1
5 changed files with 50 additions and 9 deletions
@@ -32,23 +32,23 @@ fun ClassNode.isEffectivelyPublic(classVisibility: ClassVisibility?) =
isPublic()
&& !isLocal()
&& !isWhenMappings()
&& (classVisibility?.isPublic() ?: true)
&& (classVisibility?.isPublic(isInlineExposed()) ?: true)
&& !isNonPublicFileOrFacade(classVisibility)
fun ClassNode.isNonPublicFileOrFacade(classVisibility: ClassVisibility?) =
isFileOrMultipartFacade()
&& methods.none { it.isEffectivelyPublic(classVisibility) }
&& fields.none { it.isPublic() }
&& fields.none { it.isEffectivelyPublic(classVisibility) }
fun MethodNode.isEffectivelyPublic(classVisibility: ClassVisibility?) =
isPublic()
&& (classVisibility?.members?.get(MemberSignature(name, desc))?.isPublic() ?: true)
&& (classVisibility?.members?.get(MemberSignature(name, desc))?.isPublic(isInlineExposed()) ?: true)
&& !isAccessMethod()
fun FieldNode.isEffectivelyPublic(classVisibility: ClassVisibility?) =
isPublic()
&& (classVisibility?.members?.get(MemberSignature(name, desc))?.isPublic() ?: true)
&& (classVisibility?.members?.get(MemberSignature(name, desc))?.isPublic(isInlineExposed()) ?: true)
// TODO: lateinit exposed field
@@ -58,6 +58,10 @@ fun MethodNode.isAccessMethod() = isSynthetic() && name.startsWith("access\$")
val ClassNode.effectiveAccess: Int get() = innerClasses.singleOrNull { it.name == name }?.access ?: access
const val inlineExposedAnnotationName = "kotlin/internal/InlineExposed"
fun ClassNode.isInlineExposed() = hasAnnotation(inlineExposedAnnotationName, includeInvisible = true)
fun MethodNode.isInlineExposed() = hasAnnotation(inlineExposedAnnotationName, includeInvisible = true)
fun FieldNode.isInlineExposed() = hasAnnotation(inlineExposedAnnotationName, includeInvisible = true)
private object KotlinClassKind {
const val FILE = 2
@@ -75,8 +79,15 @@ val ClassNode.kotlinClassKind: Int?
?.map { (it.values.annotationValue("k") as? Int) }
?.firstOrNull()
fun ClassNode.hasAnnotation(annotationName: String)
= "L$annotationName;".let { desc -> visibleAnnotations?.any { it.desc == desc } ?: false }
fun ClassNode.hasAnnotation(annotationName: String, includeInvisible: Boolean = false) = hasAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible)
fun MethodNode.hasAnnotation(annotationName: String, includeInvisible: Boolean = false) = hasAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible)
fun FieldNode.hasAnnotation(annotationName: String, includeInvisible: Boolean = false) = hasAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible)
private fun hasAnnotation(annotationName: String, visibleAnnotations: List<AnnotationNode>?, invisibleAnnotations: List<AnnotationNode>?, includeInvisible: Boolean)
= "L$annotationName;".let { desc ->
(visibleAnnotations?.any { it.desc == desc } ?: false)
|| (includeInvisible && (invisibleAnnotations?.any { it.desc == desc } ?: false))
}
private fun List<Any>.annotationValue(key: String): Any? {
for (index in (0 .. size / 2 - 1)) {
@@ -8,9 +8,9 @@ data class ClassVisibility(val name: String, val visibility: String?, val member
data class MemberVisibility(val member: MemberSignature, val visibility: String?)
data class MemberSignature(val name: String, val desc: String)
private fun isPublic(visibility: String?) = visibility == null || visibility == "public" || visibility == "protected"
fun ClassVisibility.isPublic() = isPublic(visibility)
fun MemberVisibility.isPublic() = isPublic(visibility)
private fun isPublic(visibility: String?, isInlineExposed: Boolean) = visibility == null || visibility == "public" || visibility == "protected" || (isInlineExposed && visibility == "internal")
fun ClassVisibility.isPublic(isInlineExposed: Boolean) = isPublic(visibility, isInlineExposed)
fun MemberVisibility.isPublic(isInlineExposed: Boolean) = isPublic(visibility, isInlineExposed)
fun readKotlinVisibilities(declarationFile: File): Map<String, ClassVisibility> {
@@ -12,11 +12,14 @@ internal class InternalClassExposed
@kotlin.internal.InlineExposed
internal fun funExposed() {}
// TODO: Cover unsupported cases: requires correctly reflecting annotations from properties
/*
@kotlin.internal.InlineExposed
internal var propertyExposed: String? = null
@JvmField
@kotlin.internal.InlineExposed
internal var fieldExposed: String? = null
*/
}
@@ -0,0 +1,9 @@
public final class cases/inline/InlineExposedKt
public static final fun exposedForInline ()V
------------------
public final class cases/inline/InternalClassExposed
public fun <init> ()V
public final fun funExposed$binary_compatibility_validator ()V
------------------
@@ -62,6 +62,10 @@ public static final fun toList (Lkotlin/Pair;)Ljava/util/List;
public static final fun toList (Lkotlin/Triple;)Ljava/util/List;
------------------
public final class kotlin/_Assertions
public static final field INSTANCE Lkotlin/_Assertions;
------------------
public abstract class kotlin/collections/AbstractIterator: java/util/Iterator, kotlin/jvm/internal/markers/KMappedMarker
public fun <init> ()V
protected abstract fun computeNext ()V
@@ -1286,6 +1290,8 @@ public static synthetic fun binarySearch$default (Ljava/util/List;Ljava/lang/Com
public static synthetic fun binarySearch$default (Ljava/util/List;Ljava/lang/Object;Ljava/util/Comparator;IIILjava/lang/Object;)I
public static final fun binarySearchBy (Ljava/util/List;Ljava/lang/Comparable;IILkotlin/jvm/functions/Function1;)I
public static synthetic fun binarySearchBy$default (Ljava/util/List;Ljava/lang/Comparable;IILkotlin/jvm/functions/Function1;ILjava/lang/Object;)I
public static final fun collectionSizeOrDefault (Ljava/lang/Iterable;I)I
public static final fun collectionSizeOrNull (Ljava/lang/Iterable;)Ljava/lang/Integer;
public static final fun contains (Ljava/lang/Iterable;Ljava/lang/Object;)Z
public static final fun count (Ljava/lang/Iterable;)I
public static final fun count (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)I
@@ -1493,11 +1499,13 @@ public static final fun filterValues (Ljava/util/Map;Lkotlin/jvm/functions/Funct
public static final fun flatMap (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/List;
public static final fun flatMapTo (Ljava/util/Map;Ljava/util/Collection;Lkotlin/jvm/functions/Function1;)Ljava/util/Collection;
public static final fun forEach (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)V
public static final fun getOrImplicitDefaultNullable (Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object;
public static final fun getOrPut (Ljava/util/Map;Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
public static final fun getOrPut (Ljava/util/concurrent/ConcurrentMap;Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
public static final fun hashMapOf ([Lkotlin/Pair;)Ljava/util/HashMap;
public static final fun linkedMapOf ([Lkotlin/Pair;)Ljava/util/LinkedHashMap;
public static final fun map (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/List;
public static final fun mapCapacity (I)I
public static final fun mapKeys (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map;
public static final fun mapKeysTo (Ljava/util/Map;Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map;
public static final fun mapNotNull (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/List;
@@ -1571,6 +1579,10 @@ public static final fun thread (ZZLjava/lang/ClassLoader;Ljava/lang/String;ILkot
public static synthetic fun thread$default (ZZLjava/lang/ClassLoader;Ljava/lang/String;ILkotlin/jvm/functions/Function0;ILjava/lang/Object;)Ljava/lang/Thread;
------------------
public final class kotlin/concurrent/TimersKt
public static final fun timer (Ljava/lang/String;Z)Ljava/util/Timer;
------------------
public final class kotlin/io/AccessDeniedException: kotlin/io/FileSystemException
public fun <init> (Ljava/io/File;Ljava/io/File;Ljava/lang/String;)V
public synthetic fun <init> (Ljava/io/File;Ljava/io/File;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
@@ -1693,6 +1705,11 @@ public static final fun readText (Ljava/io/Reader;)Ljava/lang/String;
public static final fun useLines (Ljava/io/Reader;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
------------------
public final class kotlin/jvm/internal/unsafe/MonitorKt
public static final fun monitorEnter (Ljava/lang/Object;)V
public static final fun monitorExit (Ljava/lang/Object;)V
------------------
public final class kotlin/properties/Delegates
public static final field INSTANCE Lkotlin/properties/Delegates;
public final fun notNull ()Lkotlin/properties/ReadWriteProperty;
@@ -2104,6 +2121,7 @@ public static final field Companion Lkotlin/text/Regex$Companion;
public fun <init> (Ljava/lang/String;)V
public fun <init> (Ljava/lang/String;Ljava/util/Set;)V
public fun <init> (Ljava/lang/String;Lkotlin/text/RegexOption;)V
public fun <init> (Ljava/util/regex/Pattern;)V
public final fun containsMatchIn (Ljava/lang/CharSequence;)Z
public final fun find (Ljava/lang/CharSequence;I)Lkotlin/text/MatchResult;
public static synthetic fun find$default (Lkotlin/text/Regex;Ljava/lang/CharSequence;IILjava/lang/Object;)Lkotlin/text/MatchResult;