Tests for public API dump tool.
This commit is contained in:
+102
@@ -0,0 +1,102 @@
|
||||
package cases.companions
|
||||
|
||||
|
||||
object PublicClasses {
|
||||
class PublicCompanion {
|
||||
companion object
|
||||
}
|
||||
|
||||
class ProtectedCompanion {
|
||||
protected companion object
|
||||
}
|
||||
|
||||
abstract class AbstractProtectedCompanion {
|
||||
protected companion object
|
||||
}
|
||||
|
||||
class InternalCompanion {
|
||||
internal companion object
|
||||
}
|
||||
|
||||
class PrivateCompanion {
|
||||
private companion object
|
||||
}
|
||||
}
|
||||
|
||||
object PublicInterfaces {
|
||||
interface PublicCompanion {
|
||||
companion object
|
||||
}
|
||||
|
||||
interface PrivateCompanion {
|
||||
private companion object
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
object InternalClasses {
|
||||
internal class PublicCompanion {
|
||||
companion object
|
||||
}
|
||||
|
||||
internal class ProtectedCompanion {
|
||||
protected companion object
|
||||
}
|
||||
|
||||
internal abstract class AbstractProtectedCompanion {
|
||||
protected companion object
|
||||
}
|
||||
|
||||
internal class InternalCompanion {
|
||||
internal companion object
|
||||
}
|
||||
|
||||
internal class PrivateCompanion {
|
||||
private companion object
|
||||
}
|
||||
}
|
||||
|
||||
object InternalInterfaces {
|
||||
internal interface PublicCompanion {
|
||||
companion object
|
||||
}
|
||||
|
||||
internal interface PrivateCompanion {
|
||||
private companion object
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
object PrivateClasses {
|
||||
private class PublicCompanion {
|
||||
companion object
|
||||
}
|
||||
|
||||
private class ProtectedCompanion {
|
||||
protected companion object
|
||||
}
|
||||
|
||||
private abstract class AbstractProtectedCompanion {
|
||||
protected companion object
|
||||
}
|
||||
|
||||
private class InternalCompanion {
|
||||
internal companion object
|
||||
}
|
||||
|
||||
private class PrivateCompanion {
|
||||
private companion object
|
||||
}
|
||||
}
|
||||
|
||||
object PrivateInterfaces {
|
||||
private interface PublicCompanion {
|
||||
companion object
|
||||
}
|
||||
|
||||
private interface PrivateCompanion {
|
||||
private companion object
|
||||
}
|
||||
}
|
||||
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
|
||||
package cases.inline
|
||||
|
||||
@kotlin.internal.InlineExposed
|
||||
internal fun exposedForInline() {}
|
||||
|
||||
@kotlin.internal.InlineExposed
|
||||
internal class InternalClassExposed
|
||||
@kotlin.internal.InlineExposed
|
||||
internal constructor() {
|
||||
|
||||
@kotlin.internal.InlineExposed
|
||||
internal fun funExposed() {}
|
||||
|
||||
@kotlin.internal.InlineExposed
|
||||
internal var propertyExposed: String? = null
|
||||
|
||||
@JvmField
|
||||
@kotlin.internal.InlineExposed
|
||||
internal var fieldExposed: String? = null
|
||||
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package cases.inline
|
||||
|
||||
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
|
||||
@kotlin.internal.InlineOnly
|
||||
public inline fun inlineOnly(f: () -> Unit) = f()
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package cases.internal
|
||||
|
||||
internal class InternalClass {
|
||||
public val property = 1
|
||||
|
||||
public fun function() = property
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
@file:JvmName("MultifileKt")
|
||||
@file:JvmMultifileClass
|
||||
package cases.internal
|
||||
|
||||
internal fun internalFun1() = internalVal
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
@file:JvmName("MultifileKt")
|
||||
@file:JvmMultifileClass
|
||||
package cases.internal
|
||||
|
||||
internal val internalVal = "Internal"
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package cases.internal
|
||||
|
||||
internal fun internalFun() {
|
||||
|
||||
}
|
||||
|
||||
// TODO: var, val, const
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package cases.internal
|
||||
|
||||
public class PublicClass internal constructor() {
|
||||
|
||||
internal val property = 1
|
||||
|
||||
internal fun function() = property
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package cases.java;
|
||||
|
||||
class Part1 {
|
||||
public static void publicMethod(String param) { }
|
||||
}
|
||||
|
||||
class Part2 extends Part1 {
|
||||
public static void publicMethod(int param) { }
|
||||
}
|
||||
|
||||
public class Facade extends Part2 { }
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package cases.localClasses
|
||||
|
||||
import kotlin.comparisons.compareBy
|
||||
|
||||
private val COMPARER = compareBy<String> { it.length }
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package cases.localClasses
|
||||
|
||||
|
||||
class L {
|
||||
internal fun a(lambda: () -> Unit) = lambda()
|
||||
|
||||
internal inline fun inlineLambda() {
|
||||
a {
|
||||
println("OK")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun box() {
|
||||
L().inlineLambda()
|
||||
}
|
||||
|
||||
|
||||
// TODO: inline lambda from stdlib
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
package cases.localClasses
|
||||
|
||||
class A {
|
||||
fun a() : String {
|
||||
class B() {
|
||||
fun s() : String = "OK"
|
||||
|
||||
inner class C {}
|
||||
|
||||
}
|
||||
return B().s()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class B {
|
||||
fun a(p: String) : String {
|
||||
class B() {
|
||||
fun s() : String = p
|
||||
}
|
||||
return B().s()
|
||||
}
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
package cases.nestedClasses
|
||||
|
||||
internal class InternalClass {
|
||||
public object ObjPublic
|
||||
internal object ObjInternal
|
||||
protected object ObjProtected
|
||||
private object ObjPrivate
|
||||
|
||||
public class NestedPublic
|
||||
internal class NestedInternal
|
||||
protected class NestedProtected
|
||||
private class NestedPrivate
|
||||
|
||||
public interface NestedPublicInterface
|
||||
internal interface NestedInternalInterface
|
||||
protected interface NestedProtectedInterface
|
||||
private interface NestedPrivateInterface
|
||||
|
||||
public inner class InnerPublic
|
||||
internal inner class InnerInternal
|
||||
protected inner class InnerProtected
|
||||
private inner class InnerPrivate
|
||||
}
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package cases.nestedClasses
|
||||
|
||||
internal interface InternalInterface {
|
||||
public object ObjPublic
|
||||
private object ObjPrivate
|
||||
|
||||
public class NestedPublic
|
||||
private class NestedPrivate
|
||||
|
||||
public interface NestedPublicInterface
|
||||
private interface NestedPrivateInterface
|
||||
|
||||
}
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package cases.nestedClasses
|
||||
|
||||
internal object InternalObject {
|
||||
|
||||
public object ObjPublic
|
||||
internal object ObjInternal
|
||||
private object ObjPrivate
|
||||
|
||||
public class NestedPublic
|
||||
internal class NestedInternal
|
||||
private class NestedPrivate
|
||||
|
||||
public interface NestedPublicInterface
|
||||
internal interface NestedInternalInterface
|
||||
private interface NestedPrivateInterface
|
||||
}
|
||||
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
package cases.nestedClasses
|
||||
|
||||
private class PrivateClass {
|
||||
public object ObjPublic
|
||||
internal object ObjInternal
|
||||
protected object ObjProtected
|
||||
private object ObjPrivate
|
||||
|
||||
public class NestedPublic
|
||||
internal class NestedInternal
|
||||
protected class NestedProtected
|
||||
private class NestedPrivate
|
||||
|
||||
public interface NestedPublicInterface
|
||||
internal interface NestedInternalInterface
|
||||
protected interface NestedProtectedInterface
|
||||
private interface NestedPrivateInterface
|
||||
|
||||
public inner class InnerPublic
|
||||
internal inner class InnerInternal
|
||||
protected inner class InnerProtected
|
||||
private inner class InnerPrivate
|
||||
}
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package cases.nestedClasses
|
||||
|
||||
private interface PrivateInterface {
|
||||
public object ObjPublic
|
||||
private object ObjPrivate
|
||||
|
||||
public class NestedPublic
|
||||
private class NestedPrivate
|
||||
|
||||
public interface NestedPublicInterface
|
||||
private interface NestedPrivateInterface
|
||||
|
||||
}
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package cases.nestedClasses
|
||||
|
||||
private object PrivateObject {
|
||||
|
||||
public object ObjPublic
|
||||
internal object ObjInternal
|
||||
private object ObjPrivate
|
||||
|
||||
public class NestedPublic
|
||||
internal class NestedInternal
|
||||
private class NestedPrivate
|
||||
|
||||
public interface NestedPublicInterface
|
||||
internal interface NestedInternalInterface
|
||||
private interface NestedPrivateInterface
|
||||
}
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package cases.nestedClasses
|
||||
|
||||
public abstract class PublicAbstractClass {
|
||||
protected object ObjProtected
|
||||
|
||||
protected class NestedProtected
|
||||
|
||||
protected interface NestedProtectedInterface
|
||||
|
||||
protected inner class InnerProtected
|
||||
}
|
||||
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
package cases.nestedClasses
|
||||
|
||||
public class PublicClass {
|
||||
public object ObjPublic
|
||||
internal object ObjInternal
|
||||
protected object ObjProtected
|
||||
private object ObjPrivate
|
||||
|
||||
public class NestedPublic
|
||||
internal class NestedInternal
|
||||
protected class NestedProtected
|
||||
private class NestedPrivate
|
||||
|
||||
public interface NestedPublicInterface
|
||||
internal interface NestedInternalInterface
|
||||
protected interface NestedProtectedInterface
|
||||
private interface NestedPrivateInterface
|
||||
|
||||
public inner class InnerPublic
|
||||
internal inner class InnerInternal
|
||||
protected inner class InnerProtected
|
||||
private inner class InnerPrivate
|
||||
}
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package cases.nestedClasses
|
||||
|
||||
public interface PublicInterface {
|
||||
public object ObjPublic
|
||||
private object ObjPrivate
|
||||
|
||||
public class NestedPublic
|
||||
private class NestedPrivate
|
||||
|
||||
public interface NestedPublicInterface
|
||||
private interface NestedPrivateInterface
|
||||
|
||||
}
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package cases.nestedClasses
|
||||
|
||||
public object PublicObject {
|
||||
|
||||
public object ObjPublic
|
||||
internal object ObjInternal
|
||||
private object ObjPrivate
|
||||
|
||||
public class NestedPublic
|
||||
internal class NestedInternal
|
||||
private class NestedPrivate
|
||||
|
||||
public interface NestedPublicInterface
|
||||
internal interface NestedInternalInterface
|
||||
private interface NestedPrivateInterface
|
||||
}
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package cases.nestedClasses
|
||||
|
||||
public open class PublicOpenClass {
|
||||
protected object ObjProtected
|
||||
|
||||
protected class NestedProtected
|
||||
|
||||
protected interface NestedProtectedInterface
|
||||
|
||||
protected inner class InnerProtected
|
||||
}
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package cases.private
|
||||
|
||||
private open class PrivateClass public constructor() {
|
||||
internal val internalVal = 1
|
||||
|
||||
protected fun protectedFun() = internalVal
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
@file:JvmName("MultifileKt")
|
||||
@file:JvmMultifileClass
|
||||
package cases.private
|
||||
|
||||
private val privateVal: Any? = 1
|
||||
private var privateVar: Any? = 1
|
||||
|
||||
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
@file:JvmName("MultifileKt")
|
||||
@file:JvmMultifileClass
|
||||
package cases.private
|
||||
|
||||
|
||||
// const
|
||||
private const val privateConst: Int = 4
|
||||
|
||||
// fun
|
||||
|
||||
private fun privateFun(x: Any) {}
|
||||
|
||||
|
||||
private class PrivateClassInMultifile {
|
||||
internal fun accessUsage() {
|
||||
privateFun(privateConst)
|
||||
}
|
||||
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
package cases.private
|
||||
|
||||
// properties
|
||||
private val privateVal: Any? = 1
|
||||
private var privateVar: Any? = 1
|
||||
|
||||
// constants
|
||||
|
||||
private const val privateConst: Int = 4
|
||||
|
||||
// fun
|
||||
|
||||
private fun privateFun(a: Any?) = privateConst
|
||||
|
||||
// access
|
||||
private class PrivateClassInPart {
|
||||
internal fun accessUsage() {
|
||||
privateFun(privateVal)
|
||||
privateFun(privateVar)
|
||||
privateFun(privateConst)
|
||||
}
|
||||
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
package cases.protected
|
||||
|
||||
public abstract class PublicAbstractClass protected constructor() {
|
||||
protected abstract val protectedVal: Int
|
||||
protected abstract var protectedVar: Any?
|
||||
|
||||
protected abstract fun protectedFun()
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
package cases.protected
|
||||
|
||||
public class PublicFinalClass protected constructor() {
|
||||
protected val protectedVal = 1
|
||||
protected var protectedVar = 2
|
||||
|
||||
protected fun protectedFun() = protectedVal
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
package cases.protected
|
||||
|
||||
public open class PublicOpenClass protected constructor() {
|
||||
protected val protectedVal = 1
|
||||
protected var protectedVar = 2
|
||||
|
||||
protected fun protectedFun() = protectedVal
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
@file:JvmName("MultifileKt")
|
||||
@file:JvmMultifileClass
|
||||
package cases.public
|
||||
|
||||
public fun publicFun1() = publicVal
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
@file:JvmName("MultifileKt")
|
||||
@file:JvmMultifileClass
|
||||
package cases.public
|
||||
|
||||
public val publicVal = "Public"
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package cases.public
|
||||
|
||||
public fun publicFun() {
|
||||
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
package cases.special
|
||||
|
||||
@Deprecated("For binary compatibility", level = DeprecationLevel.HIDDEN)
|
||||
public class HiddenClass
|
||||
@Deprecated("For binary compatibility", level = DeprecationLevel.HIDDEN)
|
||||
public constructor() {
|
||||
|
||||
@Deprecated("For binary compatibility", level = DeprecationLevel.HIDDEN)
|
||||
val hiddenVal = 1
|
||||
|
||||
@Deprecated("For binary compatibility", level = DeprecationLevel.HIDDEN)
|
||||
var hiddenVar = 2
|
||||
|
||||
@Deprecated("For binary compatibility", level = DeprecationLevel.HIDDEN)
|
||||
fun hiddenFun() {}
|
||||
|
||||
public var varWithHiddenAccessors: String = ""
|
||||
@Deprecated("For binary compatibility", level = DeprecationLevel.HIDDEN)
|
||||
get
|
||||
@Deprecated("For binary compatibility", level = DeprecationLevel.HIDDEN)
|
||||
set
|
||||
}
|
||||
|
||||
@Deprecated("For binary compatibility", level = DeprecationLevel.HIDDEN)
|
||||
fun hiddenTopLevelFun() {}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
package cases.special
|
||||
|
||||
public class ClassWithLateInitMembers internal constructor() {
|
||||
|
||||
public lateinit var publicLateInitWithInternalSet: String
|
||||
internal set
|
||||
|
||||
internal lateinit var internalLateInit: String
|
||||
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package cases.special
|
||||
|
||||
@JvmName("internalFun")
|
||||
internal fun internalRenamedFun() {}
|
||||
|
||||
internal var internalVar: Int = 1
|
||||
@JvmName("internalVarGetter")
|
||||
get
|
||||
@JvmName("internalVarSetter")
|
||||
set
|
||||
|
||||
@JvmName("publicFun")
|
||||
public fun publicRenamedFun() {}
|
||||
|
||||
public var publicVar: Int = 1
|
||||
@JvmName("publicVarGetter")
|
||||
get
|
||||
@JvmName("publicVarSetter")
|
||||
set
|
||||
|
||||
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package cases.special
|
||||
|
||||
|
||||
@JvmOverloads
|
||||
public fun publicFunWithOverloads(a: Int = 0, b: String? = null) {}
|
||||
|
||||
@JvmOverloads
|
||||
internal fun internalFunWithOverloads(a: Int = 0, b: String? = null) {}
|
||||
|
||||
public class ClassWithOverloads
|
||||
@JvmOverloads
|
||||
internal constructor(val a: Int = 0, val b: String? = null) {
|
||||
|
||||
@JvmOverloads
|
||||
internal fun internalFunWithOverloads(a: Int = 0, b: String? = null) {}
|
||||
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package cases.whenMappings
|
||||
|
||||
enum class SampleEnum {
|
||||
A,
|
||||
B,
|
||||
C
|
||||
}
|
||||
|
||||
fun SampleEnum.deacronimize() = when (this) {
|
||||
SampleEnum.A -> "Apple"
|
||||
SampleEnum.B -> "Biscuit"
|
||||
SampleEnum.C -> "Cinnamon"
|
||||
}
|
||||
|
||||
|
||||
inline fun SampleEnum.switch(thenA: () -> Unit, thenB: () -> Unit, thenC: () -> Unit) = when (this) {
|
||||
SampleEnum.C -> thenC()
|
||||
SampleEnum.B -> thenB()
|
||||
SampleEnum.A -> thenA()
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package cases.whenMappings
|
||||
|
||||
sealed class SampleSealed {
|
||||
class A : SampleSealed()
|
||||
class B : SampleSealed()
|
||||
class C : SampleSealed()
|
||||
}
|
||||
|
||||
fun SampleSealed.deacronimize() = when (this) {
|
||||
is SampleSealed.A -> "Apple"
|
||||
is SampleSealed.B -> "Biscuit"
|
||||
is SampleSealed.C -> "Cinnamon"
|
||||
}
|
||||
|
||||
|
||||
inline fun SampleSealed.switch(thenA: () -> Unit, thenB: () -> Unit, thenC: () -> Unit) = when (this) {
|
||||
is SampleSealed.C -> thenC()
|
||||
is SampleSealed.B -> thenB()
|
||||
is SampleSealed.A -> thenA()
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
package org.jetbrains.kotlin.tools.tests
|
||||
|
||||
import org.jetbrains.kotlin.tools.*
|
||||
import org.junit.*
|
||||
import org.junit.rules.TestName
|
||||
import java.io.File
|
||||
|
||||
class CasesPublicAPITest {
|
||||
|
||||
val visibilities = readKotlinVisibilities(File("target/cases-declarations.json"))
|
||||
val baseClassPath = File("target/test-classes/cases").absoluteFile
|
||||
|
||||
@[Rule JvmField]
|
||||
val testName = TestName()
|
||||
|
||||
@Test fun companions() { snapshotAPIAndCompare(testName.methodName) }
|
||||
|
||||
@Test fun inline() { snapshotAPIAndCompare(testName.methodName) }
|
||||
|
||||
@Test fun internal() { snapshotAPIAndCompare(testName.methodName) }
|
||||
|
||||
@Test fun java() { snapshotAPIAndCompare(testName.methodName) }
|
||||
|
||||
@Test fun localClasses() { snapshotAPIAndCompare(testName.methodName) }
|
||||
|
||||
@Test fun nestedClasses() { snapshotAPIAndCompare(testName.methodName) }
|
||||
|
||||
@Test fun private() { snapshotAPIAndCompare(testName.methodName) }
|
||||
|
||||
@Test fun protected() { snapshotAPIAndCompare(testName.methodName) }
|
||||
|
||||
@Test fun public() { snapshotAPIAndCompare(testName.methodName) }
|
||||
|
||||
@Test fun special() { snapshotAPIAndCompare(testName.methodName) }
|
||||
|
||||
@Test fun whenMappings() { snapshotAPIAndCompare(testName.methodName) }
|
||||
|
||||
|
||||
private fun snapshotAPIAndCompare(testClassRelativePath: String) {
|
||||
val testClassPath = baseClassPath.resolve(testClassRelativePath)
|
||||
val testClasses = testClassPath.listFiles() ?: throw IllegalStateException("Cannot list files in $testClassPath")
|
||||
val testClassStreams = testClasses.asSequence().filter { it.name.endsWith(".class") }.map { it.inputStream() }
|
||||
|
||||
val api = getBinaryAPI(testClassStreams, visibilities).filterOutNonPublic()
|
||||
|
||||
val target = File("src/test/resources/output/cases").resolve(testName.methodName + ".txt")
|
||||
|
||||
api.dumpAndCompareWith(target)
|
||||
}
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright 2010-2016 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.tools.tests
|
||||
|
||||
import org.jetbrains.kotlin.tools.*
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.junit.rules.TestName
|
||||
import java.io.File
|
||||
import java.util.jar.JarFile
|
||||
|
||||
class RuntimePublicAPITest {
|
||||
|
||||
@[Rule JvmField]
|
||||
val testName = TestName()
|
||||
|
||||
@Test fun kotlinRuntime() {
|
||||
snapshotAPIAndCompare("../../tools/runtime/target", "kotlin-runtime-0.1-SNAPSHOT.jar", "runtime-declarations.json")
|
||||
}
|
||||
|
||||
@Test fun kotlinStdlib() {
|
||||
snapshotAPIAndCompare("../../stdlib/target", "kotlin-stdlib-0.1-SNAPSHOT.jar", "stdlib-declarations.json")
|
||||
}
|
||||
|
||||
private fun snapshotAPIAndCompare(basePath: String, jarPath: String, kotlinJvmMappingsPath: String) {
|
||||
val base = File(basePath).absoluteFile
|
||||
val visibilities = readKotlinVisibilities(base.resolve(kotlinJvmMappingsPath))
|
||||
|
||||
// TODO: List jars since version can differ
|
||||
// TODO: Excluded package list
|
||||
val api = getBinaryAPI(JarFile(base.resolve(jarPath)), visibilities).filterOutNonPublic()
|
||||
|
||||
val target = File("src/test/resources/output")
|
||||
.resolve(testName.methodName.replaceCamelCaseWithDashedLowerCase() + ".txt")
|
||||
|
||||
api.dumpAndCompareWith(target)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
package org.jetbrains.kotlin.tools.tests
|
||||
|
||||
import org.jetbrains.kotlin.tools.*
|
||||
import java.io.File
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.fail
|
||||
|
||||
private val OVERWRITE_EXPECTED_OUTPUT = System.getProperty("overwrite.output")?.toBoolean() ?: false // use -Doverwrite.output=true
|
||||
|
||||
fun List<ClassBinarySignature>.dumpAndCompareWith(to: File) {
|
||||
if (!to.exists()) {
|
||||
to.parentFile?.mkdirs()
|
||||
to.bufferedWriter().use { dump(to = it) }
|
||||
fail("Expected data file did not exist. Generating: $to")
|
||||
} else {
|
||||
val actual = dump(to = StringBuilder())
|
||||
assertEqualsToFile(to, actual)
|
||||
}
|
||||
}
|
||||
|
||||
private fun assertEqualsToFile(expectedFile: File, actual: CharSequence) {
|
||||
val actualText = actual.trimTrailingWhitespacesAndAddNewlineAtEOF()
|
||||
val expectedText = expectedFile.readText().trimTrailingWhitespacesAndAddNewlineAtEOF()
|
||||
|
||||
if (OVERWRITE_EXPECTED_OUTPUT && expectedText != actualText) {
|
||||
expectedFile.writeText(actualText)
|
||||
assertEquals(expectedText, actualText, "Actual data differs from file content: ${expectedFile.name}, rewriting")
|
||||
}
|
||||
|
||||
assertEquals(expectedText, actualText, "Actual data differs from file content: ${expectedFile.name}")
|
||||
}
|
||||
|
||||
private fun CharSequence.trimTrailingWhitespacesAndAddNewlineAtEOF(): String =
|
||||
this.lineSequence().map { it.trimEnd() }.joinToString(separator = "\n").let {
|
||||
if (it.endsWith("\n")) it else it + "\n"
|
||||
}
|
||||
|
||||
|
||||
private val UPPER_CASE_CHARS = Regex("[A-Z]+")
|
||||
fun String.replaceCamelCaseWithDashedLowerCase() = replace(UPPER_CASE_CHARS) { "-" + it.value.toLowerCase() }
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
public final class cases/companions/InternalClasses
|
||||
public static final field INSTANCE Lcases/companions/InternalClasses;
|
||||
------------------
|
||||
|
||||
public final class cases/companions/InternalInterfaces
|
||||
public static final field INSTANCE Lcases/companions/InternalInterfaces;
|
||||
------------------
|
||||
|
||||
public final class cases/companions/PrivateClasses
|
||||
public static final field INSTANCE Lcases/companions/PrivateClasses;
|
||||
------------------
|
||||
|
||||
public final class cases/companions/PrivateInterfaces
|
||||
public static final field INSTANCE Lcases/companions/PrivateInterfaces;
|
||||
------------------
|
||||
|
||||
public final class cases/companions/PublicClasses
|
||||
public static final field INSTANCE Lcases/companions/PublicClasses;
|
||||
------------------
|
||||
|
||||
public abstract class cases/companions/PublicClasses$AbstractProtectedCompanion
|
||||
public static final field Companion Lcases/companions/PublicClasses$AbstractProtectedCompanion$Companion;
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
protected final class cases/companions/PublicClasses$AbstractProtectedCompanion$Companion
|
||||
------------------
|
||||
|
||||
public final class cases/companions/PublicClasses$InternalCompanion
|
||||
public static final field Companion Lcases/companions/PublicClasses$InternalCompanion$Companion;
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
public final class cases/companions/PublicClasses$PrivateCompanion
|
||||
public static final field Companion Lcases/companions/PublicClasses$PrivateCompanion$Companion;
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
public final class cases/companions/PublicClasses$ProtectedCompanion
|
||||
public static final field Companion Lcases/companions/PublicClasses$ProtectedCompanion$Companion;
|
||||
public fun <init> ()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 <init> ()V
|
||||
------------------
|
||||
|
||||
public final class cases/companions/PublicClasses$PublicCompanion$Companion
|
||||
------------------
|
||||
|
||||
public final class cases/companions/PublicInterfaces
|
||||
public static final field INSTANCE Lcases/companions/PublicInterfaces;
|
||||
------------------
|
||||
|
||||
public abstract interface class cases/companions/PublicInterfaces$PrivateCompanion
|
||||
public static final field Companion Lcases/companions/PublicInterfaces$PrivateCompanion$Companion;
|
||||
------------------
|
||||
|
||||
public abstract interface class cases/companions/PublicInterfaces$PublicCompanion
|
||||
public static final field Companion Lcases/companions/PublicInterfaces$PublicCompanion$Companion;
|
||||
------------------
|
||||
|
||||
public final class cases/companions/PublicInterfaces$PublicCompanion$Companion
|
||||
------------------
|
||||
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
public final class cases/internal/PublicClass
|
||||
------------------
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
public class cases/java/Facade: cases/java/Part2
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
public final class cases/localClasses/A
|
||||
public fun <init> ()V
|
||||
public final fun a ()Ljava/lang/String;
|
||||
------------------
|
||||
|
||||
public final class cases/localClasses/B
|
||||
public fun <init> ()V
|
||||
public final fun a (Ljava/lang/String;)Ljava/lang/String;
|
||||
------------------
|
||||
|
||||
public final class cases/localClasses/L
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
public final class cases/localClasses/LambdasKt
|
||||
public static final fun box ()V
|
||||
------------------
|
||||
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
public abstract class cases/nestedClasses/PublicAbstractClass
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
protected final class cases/nestedClasses/PublicAbstractClass$InnerProtected
|
||||
public fun <init> (Lcases/nestedClasses/PublicAbstractClass;)V
|
||||
------------------
|
||||
|
||||
protected final class cases/nestedClasses/PublicAbstractClass$NestedProtected
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
protected abstract interface class cases/nestedClasses/PublicAbstractClass$NestedProtectedInterface
|
||||
------------------
|
||||
|
||||
protected final class cases/nestedClasses/PublicAbstractClass$ObjProtected
|
||||
public static final field INSTANCE Lcases/nestedClasses/PublicAbstractClass$ObjProtected;
|
||||
------------------
|
||||
|
||||
public final class cases/nestedClasses/PublicClass
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
protected final class cases/nestedClasses/PublicClass$InnerProtected
|
||||
public fun <init> (Lcases/nestedClasses/PublicClass;)V
|
||||
------------------
|
||||
|
||||
public final class cases/nestedClasses/PublicClass$InnerPublic
|
||||
public fun <init> (Lcases/nestedClasses/PublicClass;)V
|
||||
------------------
|
||||
|
||||
protected final class cases/nestedClasses/PublicClass$NestedProtected
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
protected abstract interface class cases/nestedClasses/PublicClass$NestedProtectedInterface
|
||||
------------------
|
||||
|
||||
public final class cases/nestedClasses/PublicClass$NestedPublic
|
||||
public fun <init> ()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;
|
||||
------------------
|
||||
|
||||
public abstract interface class cases/nestedClasses/PublicInterface
|
||||
------------------
|
||||
|
||||
public final class cases/nestedClasses/PublicInterface$NestedPublic
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
public abstract interface class cases/nestedClasses/PublicInterface$NestedPublicInterface
|
||||
------------------
|
||||
|
||||
public final class cases/nestedClasses/PublicInterface$ObjPublic
|
||||
public static final field INSTANCE Lcases/nestedClasses/PublicInterface$ObjPublic;
|
||||
------------------
|
||||
|
||||
public final class cases/nestedClasses/PublicObject
|
||||
public static final field INSTANCE Lcases/nestedClasses/PublicObject;
|
||||
------------------
|
||||
|
||||
public final class cases/nestedClasses/PublicObject$NestedPublic
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
public abstract interface class cases/nestedClasses/PublicObject$NestedPublicInterface
|
||||
------------------
|
||||
|
||||
public final class cases/nestedClasses/PublicObject$ObjPublic
|
||||
public static final field INSTANCE Lcases/nestedClasses/PublicObject$ObjPublic;
|
||||
------------------
|
||||
|
||||
public class cases/nestedClasses/PublicOpenClass
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
protected final class cases/nestedClasses/PublicOpenClass$InnerProtected
|
||||
public fun <init> (Lcases/nestedClasses/PublicOpenClass;)V
|
||||
------------------
|
||||
|
||||
protected final class cases/nestedClasses/PublicOpenClass$NestedProtected
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
protected abstract interface class cases/nestedClasses/PublicOpenClass$NestedProtectedInterface
|
||||
------------------
|
||||
|
||||
protected final class cases/nestedClasses/PublicOpenClass$ObjProtected
|
||||
public static final field INSTANCE Lcases/nestedClasses/PublicOpenClass$ObjProtected;
|
||||
------------------
|
||||
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
public abstract class cases/protected/PublicAbstractClass
|
||||
protected fun <init> ()V
|
||||
protected abstract fun getProtectedVal ()I
|
||||
protected abstract fun getProtectedVar ()Ljava/lang/Object;
|
||||
protected abstract fun protectedFun ()V
|
||||
protected abstract fun setProtectedVar (Ljava/lang/Object;)V
|
||||
------------------
|
||||
|
||||
public final class cases/protected/PublicFinalClass
|
||||
protected fun <init> ()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
|
||||
protected fun <init> ()V
|
||||
protected final fun getProtectedVal ()I
|
||||
protected final fun getProtectedVar ()I
|
||||
protected final fun protectedFun ()I
|
||||
protected final fun setProtectedVar (I)V
|
||||
------------------
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
public final class cases/public/MultifileKt
|
||||
public static final fun getPublicVal ()Ljava/lang/String;
|
||||
public static final fun publicFun1 ()Ljava/lang/String;
|
||||
------------------
|
||||
|
||||
public final class cases/public/PublicPartKt
|
||||
public static final fun publicFun ()V
|
||||
------------------
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
public final class cases/special/ClassWithLateInitMembers
|
||||
public field internalLateInit Ljava/lang/String;
|
||||
public field publicLateInitWithInternalSet Ljava/lang/String;
|
||||
public final fun getPublicLateInitWithInternalSet ()Ljava/lang/String;
|
||||
------------------
|
||||
|
||||
public final class cases/special/ClassWithOverloads
|
||||
public final fun getA ()I
|
||||
public final fun getB ()Ljava/lang/String;
|
||||
------------------
|
||||
|
||||
public final class cases/special/HiddenClass
|
||||
public synthetic fun <init> ()V
|
||||
public final synthetic fun getHiddenVal ()I
|
||||
public final synthetic fun getHiddenVar ()I
|
||||
public final synthetic fun getVarWithHiddenAccessors ()Ljava/lang/String;
|
||||
public final synthetic fun hiddenFun ()V
|
||||
public final synthetic fun setHiddenVar (I)V
|
||||
public final synthetic fun setVarWithHiddenAccessors (Ljava/lang/String;)V
|
||||
------------------
|
||||
|
||||
public final class cases/special/HiddenKt
|
||||
public static final synthetic fun hiddenTopLevelFun ()V
|
||||
------------------
|
||||
|
||||
public final class cases/special/JvmNamesKt
|
||||
public static final fun publicFun ()V
|
||||
public static final fun publicVarGetter ()I
|
||||
public static final fun publicVarSetter (I)V
|
||||
------------------
|
||||
|
||||
public final class cases/special/JvmOverloadsKt
|
||||
public static fun publicFunWithOverloads ()V
|
||||
public static fun publicFunWithOverloads (I)V
|
||||
public static final fun publicFunWithOverloads (ILjava/lang/String;)V
|
||||
public static synthetic fun publicFunWithOverloads$default (ILjava/lang/String;ILjava/lang/Object;)V
|
||||
------------------
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
public final class cases/whenMappings/EnumWhenKt
|
||||
public static final fun deacronimize (Lcases/whenMappings/SampleEnum;)Ljava/lang/String;
|
||||
public static final fun switch (Lcases/whenMappings/SampleEnum;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V
|
||||
------------------
|
||||
|
||||
public final class cases/whenMappings/SampleEnum: java/lang/Enum
|
||||
public static final field A Lcases/whenMappings/SampleEnum;
|
||||
public static final field B Lcases/whenMappings/SampleEnum;
|
||||
public static final field C Lcases/whenMappings/SampleEnum;
|
||||
public static fun valueOf (Ljava/lang/String;)Lcases/whenMappings/SampleEnum;
|
||||
public static fun values ()[Lcases/whenMappings/SampleEnum;
|
||||
------------------
|
||||
|
||||
public abstract class cases/whenMappings/SampleSealed
|
||||
------------------
|
||||
|
||||
public final class cases/whenMappings/SampleSealed$A: cases/whenMappings/SampleSealed
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
public final class cases/whenMappings/SampleSealed$B: cases/whenMappings/SampleSealed
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
public final class cases/whenMappings/SampleSealed$C: cases/whenMappings/SampleSealed
|
||||
public fun <init> ()V
|
||||
------------------
|
||||
|
||||
public final class cases/whenMappings/SealedClassWhenKt
|
||||
public static final fun deacronimize (Lcases/whenMappings/SampleSealed;)Ljava/lang/String;
|
||||
public static final fun switch (Lcases/whenMappings/SampleSealed;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V
|
||||
------------------
|
||||
|
||||
+1165
File diff suppressed because it is too large
Load Diff
+2458
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user