From 394ab54af66a99a63926ee4a38a09dc64c07dced Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 7 Feb 2020 16:57:31 +0300 Subject: [PATCH 1/5] Migrate to new binary compatibility validator tool --- binary-compatibility-validator/README.md | 10 - binary-compatibility-validator/build.gradle | 58 ------ .../resources/api.properties | 9 - .../src/PublicApiDump.kt | 120 ------------ .../src/asmUtils.kt | 173 ------------------ .../src/kotlinVisibilities.kt | 57 ------ .../test/CasesPublicAPITest.kt | 98 ---------- .../test/PublicApiTest.kt | 96 ---------- .../test/cases/companions/companions.kt | 106 ----------- .../test/cases/companions/companions.txt | 66 ------- .../test/cases/inline/inline.txt | 9 - .../test/cases/inline/inlineExposed.kt | 28 --- .../test/cases/inline/inlineOnly.kt | 9 - .../interfaces/interfaceWithEmptyImpls.kt | 10 - .../cases/interfaces/interfaceWithImpls.kt | 18 -- .../test/cases/interfaces/interfaces.txt | 27 --- .../test/cases/internal/internal.txt | 3 - .../test/cases/internal/internalClass.kt | 11 -- .../test/cases/internal/internalMultifile1.kt | 9 - .../test/cases/internal/internalMultifile2.kt | 9 - .../test/cases/internal/internalPart.kt | 11 -- .../internal/publicClassInternalMember.kt | 13 -- .../test/cases/java/Facade.java | 16 -- .../test/cases/java/java.txt | 6 - .../test/cases/localClasses/fromStdlib.kt | 7 - .../test/cases/localClasses/lambdas.kt | 24 --- .../test/cases/localClasses/localClasses.kt | 27 --- .../test/cases/localClasses/localClasses.txt | 18 -- .../test/cases/nestedClasses/internalClass.kt | 28 --- .../cases/nestedClasses/internalInterface.kt | 18 -- .../cases/nestedClasses/internalObject.kt | 21 --- .../cases/nestedClasses/nestedClasses.txt | 86 --------- .../test/cases/nestedClasses/privateClass.kt | 28 --- .../cases/nestedClasses/privateInterface.kt | 18 -- .../test/cases/nestedClasses/privateObject.kt | 21 --- .../nestedClasses/publicAbstractClass.kt | 16 -- .../test/cases/nestedClasses/publicClass.kt | 28 --- .../cases/nestedClasses/publicInterface.kt | 18 -- .../test/cases/nestedClasses/publicObject.kt | 21 --- .../cases/nestedClasses/publicOpenClass.kt | 16 -- .../test/cases/private/private.txt | 0 .../test/cases/private/privateClassMembers.kt | 11 -- .../test/cases/private/privateMultifile1.kt | 12 -- .../test/cases/private/privateMultifile2.kt | 23 --- .../test/cases/private/privatePart.kt | 28 --- .../test/cases/protected/protected.txt | 19 -- .../cases/protected/protectedInAbstract.kt | 12 -- .../test/cases/protected/protectedInFinal.kt | 12 -- .../test/cases/protected/protectedInOpen.kt | 12 -- .../test/cases/public/public.txt | 9 - .../test/cases/public/publicMultifile1.kt | 9 - .../test/cases/public/publicMultifile2.kt | 9 - .../test/cases/public/publicPart.kt | 9 - .../test/cases/special/hidden.kt | 29 --- .../cases/special/internalLateinitMember.kt | 14 -- .../test/cases/special/jvmField.kt | 55 ------ .../test/cases/special/jvmNames.kt | 26 --- .../test/cases/special/jvmOverloads.kt | 23 --- .../test/cases/special/special.txt | 61 ------ .../test/cases/whenMappings/enumWhen.kt | 24 --- .../cases/whenMappings/sealedClassWhen.kt | 24 --- .../test/cases/whenMappings/whenMappings.txt | 33 ---- binary-compatibility-validator/test/utils.kt | 48 ----- build.gradle | 11 +- .../api/kotlinx-coroutines-guava.api | 0 .../api/kotlinx-coroutines-jdk8.api | 0 .../api/kotlinx-coroutines-play-services.api | 0 .../api/kotlinx-coroutines-slf4j.api | 0 .../api/kotlinx-coroutines-core.api | 0 .../api/kotlinx-coroutines-debug.api | 0 .../api/kotlinx-coroutines-test.api | 0 .../api/kotlinx-coroutines-reactive.api | 0 .../api/kotlinx-coroutines-reactor.api | 0 .../api/kotlinx-coroutines-rx2.api | 0 settings.gradle | 2 - .../api/kotlinx-coroutines-android.api | 0 .../api/kotlinx-coroutines-javafx.api | 0 .../api/kotlinx-coroutines-swing.api | 0 78 files changed, 10 insertions(+), 1872 deletions(-) delete mode 100644 binary-compatibility-validator/README.md delete mode 100644 binary-compatibility-validator/build.gradle delete mode 100644 binary-compatibility-validator/resources/api.properties delete mode 100644 binary-compatibility-validator/src/PublicApiDump.kt delete mode 100644 binary-compatibility-validator/src/asmUtils.kt delete mode 100644 binary-compatibility-validator/src/kotlinVisibilities.kt delete mode 100644 binary-compatibility-validator/test/CasesPublicAPITest.kt delete mode 100644 binary-compatibility-validator/test/PublicApiTest.kt delete mode 100644 binary-compatibility-validator/test/cases/companions/companions.kt delete mode 100644 binary-compatibility-validator/test/cases/companions/companions.txt delete mode 100644 binary-compatibility-validator/test/cases/inline/inline.txt delete mode 100644 binary-compatibility-validator/test/cases/inline/inlineExposed.kt delete mode 100644 binary-compatibility-validator/test/cases/inline/inlineOnly.kt delete mode 100644 binary-compatibility-validator/test/cases/interfaces/interfaceWithEmptyImpls.kt delete mode 100644 binary-compatibility-validator/test/cases/interfaces/interfaceWithImpls.kt delete mode 100644 binary-compatibility-validator/test/cases/interfaces/interfaces.txt delete mode 100644 binary-compatibility-validator/test/cases/internal/internal.txt delete mode 100644 binary-compatibility-validator/test/cases/internal/internalClass.kt delete mode 100644 binary-compatibility-validator/test/cases/internal/internalMultifile1.kt delete mode 100644 binary-compatibility-validator/test/cases/internal/internalMultifile2.kt delete mode 100644 binary-compatibility-validator/test/cases/internal/internalPart.kt delete mode 100644 binary-compatibility-validator/test/cases/internal/publicClassInternalMember.kt delete mode 100644 binary-compatibility-validator/test/cases/java/Facade.java delete mode 100644 binary-compatibility-validator/test/cases/java/java.txt delete mode 100644 binary-compatibility-validator/test/cases/localClasses/fromStdlib.kt delete mode 100644 binary-compatibility-validator/test/cases/localClasses/lambdas.kt delete mode 100644 binary-compatibility-validator/test/cases/localClasses/localClasses.kt delete mode 100644 binary-compatibility-validator/test/cases/localClasses/localClasses.txt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/internalClass.kt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/internalInterface.kt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/internalObject.kt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/nestedClasses.txt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/privateClass.kt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/privateInterface.kt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/privateObject.kt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/publicAbstractClass.kt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/publicClass.kt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/publicInterface.kt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/publicObject.kt delete mode 100644 binary-compatibility-validator/test/cases/nestedClasses/publicOpenClass.kt delete mode 100644 binary-compatibility-validator/test/cases/private/private.txt delete mode 100644 binary-compatibility-validator/test/cases/private/privateClassMembers.kt delete mode 100644 binary-compatibility-validator/test/cases/private/privateMultifile1.kt delete mode 100644 binary-compatibility-validator/test/cases/private/privateMultifile2.kt delete mode 100644 binary-compatibility-validator/test/cases/private/privatePart.kt delete mode 100644 binary-compatibility-validator/test/cases/protected/protected.txt delete mode 100644 binary-compatibility-validator/test/cases/protected/protectedInAbstract.kt delete mode 100644 binary-compatibility-validator/test/cases/protected/protectedInFinal.kt delete mode 100644 binary-compatibility-validator/test/cases/protected/protectedInOpen.kt delete mode 100644 binary-compatibility-validator/test/cases/public/public.txt delete mode 100644 binary-compatibility-validator/test/cases/public/publicMultifile1.kt delete mode 100644 binary-compatibility-validator/test/cases/public/publicMultifile2.kt delete mode 100644 binary-compatibility-validator/test/cases/public/publicPart.kt delete mode 100644 binary-compatibility-validator/test/cases/special/hidden.kt delete mode 100644 binary-compatibility-validator/test/cases/special/internalLateinitMember.kt delete mode 100644 binary-compatibility-validator/test/cases/special/jvmField.kt delete mode 100644 binary-compatibility-validator/test/cases/special/jvmNames.kt delete mode 100644 binary-compatibility-validator/test/cases/special/jvmOverloads.kt delete mode 100644 binary-compatibility-validator/test/cases/special/special.txt delete mode 100644 binary-compatibility-validator/test/cases/whenMappings/enumWhen.kt delete mode 100644 binary-compatibility-validator/test/cases/whenMappings/sealedClassWhen.kt delete mode 100644 binary-compatibility-validator/test/cases/whenMappings/whenMappings.txt delete mode 100644 binary-compatibility-validator/test/utils.kt rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-guava.txt => integration/kotlinx-coroutines-guava/api/kotlinx-coroutines-guava.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-jdk8.txt => integration/kotlinx-coroutines-jdk8/api/kotlinx-coroutines-jdk8.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-play-services.txt => integration/kotlinx-coroutines-play-services/api/kotlinx-coroutines-play-services.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-slf4j.txt => integration/kotlinx-coroutines-slf4j/api/kotlinx-coroutines-slf4j.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-core.txt => kotlinx-coroutines-core/api/kotlinx-coroutines-core.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-debug.txt => kotlinx-coroutines-debug/api/kotlinx-coroutines-debug.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-test.txt => kotlinx-coroutines-test/api/kotlinx-coroutines-test.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-reactive.txt => reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-reactor.txt => reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-rx2.txt => reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-android.txt => ui/kotlinx-coroutines-android/api/kotlinx-coroutines-android.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-javafx.txt => ui/kotlinx-coroutines-javafx/api/kotlinx-coroutines-javafx.api (100%) rename binary-compatibility-validator/reference-public-api/kotlinx-coroutines-swing.txt => ui/kotlinx-coroutines-swing/api/kotlinx-coroutines-swing.api (100%) diff --git a/binary-compatibility-validator/README.md b/binary-compatibility-validator/README.md deleted file mode 100644 index e34d6877c5..0000000000 --- a/binary-compatibility-validator/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Public API binary compatibility validator - -This module allows to dump and compare public binary API to ensure binary compatibility with a previous version. -This tool is slightly adapted copy of [original Kotlin compatibility validator](https://github.com/JetBrains/kotlin/tree/master/libraries/tools/binary-compatibility-validator) by @ilya-g. - -To update public API dumps use: - -```bash -./gradlew :binary-compatibility-validator:test -Poverwrite.output=true -``` diff --git a/binary-compatibility-validator/build.gradle b/binary-compatibility-validator/build.gradle deleted file mode 100644 index c6eaffdfca..0000000000 --- a/binary-compatibility-validator/build.gradle +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -configurations { - testArtifacts - configureKotlinJvmPlatform(testArtifacts) -} - -dependencies { - compile 'org.ow2.asm:asm-debug-all:5.0.4' - compile 'com.google.code.gson:gson:2.6.2' - - testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" - - testArtifacts project(':kotlinx-coroutines-core') - testArtifacts project(':kotlinx-coroutines-test') - testArtifacts project(':kotlinx-coroutines-debug') - - testArtifacts project(':kotlinx-coroutines-reactive') - testArtifacts project(':kotlinx-coroutines-reactor') - testArtifacts project(':kotlinx-coroutines-rx2') - - testArtifacts project(':kotlinx-coroutines-guava') - testArtifacts project(':kotlinx-coroutines-jdk8') - testArtifacts project(':kotlinx-coroutines-slf4j') - testArtifacts project(path: ':kotlinx-coroutines-play-services', configuration: 'default') - - testArtifacts project(':kotlinx-coroutines-android') - testArtifacts project(':kotlinx-coroutines-javafx') - testArtifacts project(':kotlinx-coroutines-swing') -} - -def testCasesDeclarationsDump = "${buildDir}/visibilities.json".toString() - -compileTestKotlin { - kotlinOptions { - freeCompilerArgs = ["-Xdump-declarations-to=$testCasesDeclarationsDump"] - } -} - -sourceSets { - test { - java { - srcDir "test/cases" - } - } -} - -test { - dependsOn cleanCompileTestKotlin - dependsOn configurations.testArtifacts - - systemProperty 'testCasesClassesDirs', sourceSets.test.output.classesDirs.asPath - systemProperty 'testCasesDeclarations', testCasesDeclarationsDump - systemProperty 'overwrite.output', project.properties['overwrite.output'] - jvmArgs '-ea' -} diff --git a/binary-compatibility-validator/resources/api.properties b/binary-compatibility-validator/resources/api.properties deleted file mode 100644 index e15ad21a02..0000000000 --- a/binary-compatibility-validator/resources/api.properties +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. -# - -module.roots=/ integration reactive ui -module.marker=build.gradle -module.ignore=stdlib-stubs benchmarks knit binary-compatibility-validator site publication-validator kotlinx-coroutines-bom - -packages.internal=kotlinx.coroutines.internal \ No newline at end of file diff --git a/binary-compatibility-validator/src/PublicApiDump.kt b/binary-compatibility-validator/src/PublicApiDump.kt deleted file mode 100644 index 343df34b87..0000000000 --- a/binary-compatibility-validator/src/PublicApiDump.kt +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.tools - -import org.objectweb.asm.* -import org.objectweb.asm.tree.* -import java.io.* -import java.util.jar.* - -fun JarFile.classEntries() = entries().asSequence().filter { - !it.isDirectory && it.name.endsWith(".class") && !it.name.startsWith("META-INF/") -} - -fun getBinaryAPI(jar: JarFile, visibilityMap: Map): List = - getBinaryAPI(jar.classEntries().map { entry -> jar.getInputStream(entry) }, visibilityMap) - -fun getBinaryAPI( - classStreams: Sequence, - visibilityMap: Map -): List = - classStreams.map { - it.use { stream -> - val classNode = ClassNode() - ClassReader(stream).accept(classNode, ClassReader.SKIP_CODE) - classNode - } - }.map { - with(it) { - val classVisibility = visibilityMap[name] - val classAccess = AccessFlags(effectiveAccess and Opcodes.ACC_STATIC.inv()) - val supertypes = listOf(superName) - "java/lang/Object" + interfaces.sorted() - - val memberSignatures = ( - fields.map { - with(it) { - FieldBinarySignature( - name, - desc, - isPublishedApi(), - AccessFlags(access) - ) - } - } + - methods.map { - with(it) { - MethodBinarySignature( - name, - desc, - isPublishedApi(), - AccessFlags(access) - ) - } - } - ).filter { - it.isEffectivelyPublic(classAccess, classVisibility) - } - - ClassBinarySignature( - name, - superName, - outerClassName, - supertypes, - memberSignatures, - classAccess, - isEffectivelyPublic(classVisibility), - isFileOrMultipartFacade() || isDefaultImpls() - ) - } - }.asIterable().sortedBy { it.name } - - -fun List.filterOutNonPublic(nonPublicPackages: List = emptyList()): List { - val nonPublicPaths = nonPublicPackages.map { it.replace('.', '/') + '/' } - val classByName = associateBy { it.name } - - fun ClassBinarySignature.isInNonPublicPackage() = - nonPublicPaths.any { name.startsWith(it) } - - fun ClassBinarySignature.isPublicAndAccessible(): Boolean = - 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] }) - - fun ClassBinarySignature.flattenNonPublicBases(): ClassBinarySignature { - - val nonPublicSupertypes = supertypes(superName).takeWhile { !it.isPublicAndAccessible() }.toList() - if (nonPublicSupertypes.isEmpty()) - return this - - val inheritedStaticSignatures = - nonPublicSupertypes.flatMap { it.memberSignatures.filter { it.access.isStatic } } - - // not covered the case when there is public superclass after chain of private superclasses - return this.copy( - memberSignatures = memberSignatures + inheritedStaticSignatures, - supertypes = supertypes - superName - ) - } - - return filter { !it.isInNonPublicPackage() && it.isPublicAndAccessible() } - .map { it.flattenNonPublicBases() } - .filterNot { it.isNotUsedWhenEmpty && it.memberSignatures.isEmpty() } -} - -fun List.dump() = dump(to = System.out) - -fun List.dump(to: T): T = to.apply { - this@dump.forEach { - append(it.signature).appendln(" {") - it.memberSignatures.sortedWith(MEMBER_SORT_ORDER).forEach { append("\t").appendln(it.signature) } - appendln("}\n") - } -} - diff --git a/binary-compatibility-validator/src/asmUtils.kt b/binary-compatibility-validator/src/asmUtils.kt deleted file mode 100644 index b14cb8d5e6..0000000000 --- a/binary-compatibility-validator/src/asmUtils.kt +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.tools - -import org.objectweb.asm.* -import org.objectweb.asm.tree.* - -val ACCESS_NAMES = mapOf( - Opcodes.ACC_PUBLIC to "public", - Opcodes.ACC_PROTECTED to "protected", - Opcodes.ACC_PRIVATE to "private", - Opcodes.ACC_STATIC to "static", - Opcodes.ACC_FINAL to "final", - Opcodes.ACC_ABSTRACT to "abstract", - Opcodes.ACC_SYNTHETIC to "synthetic", - Opcodes.ACC_INTERFACE to "interface", - Opcodes.ACC_ANNOTATION to "annotation") - -data class ClassBinarySignature( - val name: String, - val superName: String, - val outerName: String?, - val supertypes: List, - val memberSignatures: List, - val access: AccessFlags, - val isEffectivelyPublic: Boolean, - val isNotUsedWhenEmpty: Boolean) { - - val signature: String - get() = "${access.getModifierString()} class $name" + if (supertypes.isEmpty()) "" else " : ${supertypes.joinToString()}" - -} - - -interface MemberBinarySignature { - val name: String - val desc: String - val access: AccessFlags - val isPublishedApi: Boolean - - fun isEffectivelyPublic(classAccess: AccessFlags, classVisibility: ClassVisibility?) - = access.isPublic && !(access.isProtected && classAccess.isFinal) - && (findMemberVisibility(classVisibility)?.isPublic(isPublishedApi) ?: true) - - fun findMemberVisibility(classVisibility: ClassVisibility?) - = classVisibility?.members?.get(MemberSignature(name, desc)) - - val signature: String -} - -data class MethodBinarySignature( - override val name: String, - override val desc: String, - override val isPublishedApi: Boolean, - override val access: AccessFlags) : MemberBinarySignature { - override val signature: String - get() = "${access.getModifierString()} fun $name $desc" - - override fun isEffectivelyPublic(classAccess: AccessFlags, classVisibility: ClassVisibility?) - = super.isEffectivelyPublic(classAccess, classVisibility) - && !isAccessOrAnnotationsMethod() - - private fun isAccessOrAnnotationsMethod() = access.isSynthetic && (name.startsWith("access\$") || name.endsWith("\$annotations")) -} - -data class FieldBinarySignature( - override val name: String, - override val desc: String, - override val isPublishedApi: Boolean, - override val access: AccessFlags) : MemberBinarySignature { - override val signature: String - get() = "${access.getModifierString()} field $name $desc" - - override fun findMemberVisibility(classVisibility: ClassVisibility?): MemberVisibility? { - val fieldVisibility = super.findMemberVisibility(classVisibility) ?: return null - - // good case for 'satisfying': fieldVisibility.satisfying { it.isLateInit() }?.let { classVisibility?.findSetterForProperty(it) } - if (fieldVisibility.isLateInit()) { - classVisibility?.findSetterForProperty(fieldVisibility)?.let { return it } - } - return fieldVisibility - } -} - -val MemberBinarySignature.kind: Int get() = when (this) { - is FieldBinarySignature -> 1 - is MethodBinarySignature -> 2 - else -> error("Unsupported $this") -} - -val MEMBER_SORT_ORDER = compareBy( - { it.kind }, - { it.name }, - { it.desc } -) - - -data class AccessFlags(val access: Int) { - val isPublic: Boolean get() = isPublic(access) - val isProtected: Boolean get() = isProtected(access) - val isStatic: Boolean get() = isStatic(access) - val isFinal: Boolean get() = isFinal(access) - val isSynthetic: Boolean get() = isSynthetic(access) - - fun getModifiers(): List = ACCESS_NAMES.entries.mapNotNull { if (access and it.key != 0) it.value else null } - fun getModifierString(): String = getModifiers().joinToString(" ") -} - -fun isPublic(access: Int) = access and Opcodes.ACC_PUBLIC != 0 || access and Opcodes.ACC_PROTECTED != 0 -fun isProtected(access: Int) = access and Opcodes.ACC_PROTECTED != 0 -fun isStatic(access: Int) = access and Opcodes.ACC_STATIC != 0 -fun isFinal(access: Int) = access and Opcodes.ACC_FINAL != 0 -fun isSynthetic(access: Int) = access and Opcodes.ACC_SYNTHETIC != 0 - - -fun ClassNode.isEffectivelyPublic(classVisibility: ClassVisibility?) = - isPublic(access) - && !isLocal() - && !isWhenMappings() - && (classVisibility?.isPublic(isPublishedApi()) ?: true) - - -val ClassNode.innerClassNode: InnerClassNode? get() = innerClasses.singleOrNull { it.name == name } -fun ClassNode.isLocal() = innerClassNode?.run { innerName == null && outerName == null} ?: false -fun ClassNode.isInner() = innerClassNode != null -fun ClassNode.isWhenMappings() = isSynthetic(access) && name.endsWith("\$WhenMappings") - -val ClassNode.effectiveAccess: Int get() = innerClassNode?.access ?: access -val ClassNode.outerClassName: String? get() = innerClassNode?.outerName - - -const val publishedApiAnnotationName = "kotlin/PublishedApi" -fun ClassNode.isPublishedApi() = findAnnotation(publishedApiAnnotationName, includeInvisible = true) != null -fun MethodNode.isPublishedApi() = findAnnotation(publishedApiAnnotationName, includeInvisible = true) != null -fun FieldNode.isPublishedApi() = findAnnotation(publishedApiAnnotationName, includeInvisible = true) != null - - -private object KotlinClassKind { - const val FILE = 2 - const val SYNTHETIC_CLASS = 3 - const val MULTIPART_FACADE = 4 - - val FILE_OR_MULTIPART_FACADE_KINDS = listOf(FILE, MULTIPART_FACADE) -} - -fun ClassNode.isFileOrMultipartFacade() = kotlinClassKind.let { it != null && it in KotlinClassKind.FILE_OR_MULTIPART_FACADE_KINDS } -fun ClassNode.isDefaultImpls() = isInner() && name.endsWith("\$DefaultImpls") && kotlinClassKind == KotlinClassKind.SYNTHETIC_CLASS - - -val ClassNode.kotlinClassKind: Int? - get() = findAnnotation("kotlin/Metadata", false)?.get("k") as Int? - -fun ClassNode.findAnnotation(annotationName: String, includeInvisible: Boolean = false) = findAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible) -fun MethodNode.findAnnotation(annotationName: String, includeInvisible: Boolean = false) = findAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible) -fun FieldNode.findAnnotation(annotationName: String, includeInvisible: Boolean = false) = findAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible) - -operator fun AnnotationNode.get(key: String): Any? = values.annotationValue(key) - -private fun List.annotationValue(key: String): Any? { - for (index in (0 .. size / 2 - 1)) { - if (this[index*2] == key) - return this[index*2 + 1] - } - return null -} - -private fun findAnnotation(annotationName: String, visibleAnnotations: List?, invisibleAnnotations: List?, includeInvisible: Boolean): AnnotationNode? = - visibleAnnotations?.firstOrNull { it.refersToName(annotationName) } ?: - if (includeInvisible) invisibleAnnotations?.firstOrNull { it.refersToName(annotationName) } else null - -fun AnnotationNode.refersToName(name: String) = desc.startsWith('L') && desc.endsWith(';') && desc.regionMatches(1, name, 0, name.length) \ No newline at end of file diff --git a/binary-compatibility-validator/src/kotlinVisibilities.kt b/binary-compatibility-validator/src/kotlinVisibilities.kt deleted file mode 100644 index 4322140c80..0000000000 --- a/binary-compatibility-validator/src/kotlinVisibilities.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.tools - -import com.google.gson.internal.* -import com.google.gson.stream.* -import java.io.* - -data class ClassVisibility(val name: String, val visibility: String?, val members: Map) -data class MemberVisibility(val member: MemberSignature, val declaration: String?, val visibility: String?) -data class MemberSignature(val name: String, val desc: String) - -private fun isPublic(visibility: String?, isPublishedApi: Boolean) = visibility == null || visibility == "public" || visibility == "protected" || (isPublishedApi && visibility == "internal") -fun ClassVisibility.isPublic(isPublishedApi: Boolean) = isPublic(visibility, isPublishedApi) -fun MemberVisibility.isPublic(isPublishedApi: Boolean) = isPublic(visibility, isPublishedApi) - -fun MemberVisibility.isLateInit() = declaration != null && "lateinit var " in declaration - -private val varValPrefix = Regex("va[lr]\\s+") -fun ClassVisibility.findSetterForProperty(property: MemberVisibility): MemberVisibility? { - // ad-hoc solution: - val declaration = property.declaration ?: return null - val match = varValPrefix.find(declaration) ?: return null - val name = declaration.substring(match.range.endInclusive + 1).substringBefore(':') - val setterName = "" - return members.values.find { it.declaration?.contains(setterName) ?: false } -} - -fun readKotlinVisibilities(declarationFile: File): Map { - val result = mutableListOf() - declarationFile.bufferedReader().use { reader -> - val jsonReader = JsonReader(reader) - jsonReader.beginArray() - while (jsonReader.hasNext()) { - val classObject = Streams.parse(jsonReader).asJsonObject - result += with (classObject) { - val name = getAsJsonPrimitive("class").asString - val visibility = getAsJsonPrimitive("visibility")?.asString - val members = getAsJsonArray("members").map { it -> - with(it.asJsonObject) { - val name = getAsJsonPrimitive("name").asString - val desc = getAsJsonPrimitive("desc").asString - val declaration = getAsJsonPrimitive("declaration")?.asString - val visibility = getAsJsonPrimitive("visibility")?.asString - MemberVisibility(MemberSignature(name, desc), declaration, visibility) - } - } - ClassVisibility(name, visibility, members.associateByTo(hashMapOf()) { it.member }) - } - } - jsonReader.endArray() - } - - return result.associateByTo(hashMapOf()) { it.name } -} diff --git a/binary-compatibility-validator/test/CasesPublicAPITest.kt b/binary-compatibility-validator/test/CasesPublicAPITest.kt deleted file mode 100644 index f0212e70a9..0000000000 --- a/binary-compatibility-validator/test/CasesPublicAPITest.kt +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.tools - -import org.junit.* -import org.junit.rules.* -import java.io.* - -class CasesPublicAPITest { - - companion object { - val visibilities by lazy { readKotlinVisibilities(File(System.getProperty("testCasesDeclarations")!!)) } - - val baseClassPaths: List = - System.getProperty("testCasesClassesDirs") - .let { requireNotNull(it) { "Specify testCasesClassesDirs with a system property" } } - .split(File.pathSeparator) - .map { File(it, "cases").canonicalFile } - val baseOutputPath = File("test/cases") - } - - @Rule - @JvmField - val testName = TestName() - - @Test - fun companions() { - snapshotAPIAndCompare(testName.methodName) - } - - @Test - fun inline() { - snapshotAPIAndCompare(testName.methodName) - } - - @Test - fun interfaces() { - 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 testClassPaths = baseClassPaths.map { it.resolve(testClassRelativePath) } - val testClasses = testClassPaths.flatMap { it.listFiles().orEmpty().asIterable() } - check(testClasses.isNotEmpty()) { "No class files are found in paths: $testClassPaths" } - val testClassStreams = testClasses.asSequence().filter { it.name.endsWith(".class") }.map { it.inputStream() } - val api = getBinaryAPI(testClassStreams, visibilities).filterOutNonPublic() - val target = baseOutputPath.resolve(testClassRelativePath).resolve(testName.methodName + ".txt") - api.dumpAndCompareWith(target) - } -} diff --git a/binary-compatibility-validator/test/PublicApiTest.kt b/binary-compatibility-validator/test/PublicApiTest.kt deleted file mode 100644 index fb4f55cc17..0000000000 --- a/binary-compatibility-validator/test/PublicApiTest.kt +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.tools - -import org.junit.* -import org.junit.runner.* -import org.junit.runners.* -import java.io.* -import java.util.* -import java.util.jar.* -import kotlin.collections.ArrayList - -@RunWith(Parameterized::class) -class PublicApiTest( - private val rootDir: String, - private val moduleName: String -) { - companion object { - private val apiProps = ClassLoader.getSystemClassLoader() - .getResource("api.properties").openStream().use { Properties().apply { load(it) } } - private val nonPublicPackages = apiProps.getProperty("packages.internal")!!.split(" ") - - @Parameterized.Parameters(name = "{1}") - @JvmStatic - fun modules(): List> { - val moduleRoots = apiProps.getProperty("module.roots").split(" ") - val moduleMarker = apiProps.getProperty("module.marker")!! - val moduleIgnore = apiProps.getProperty("module.ignore")!!.split(" ").toSet() - val modules = ArrayList>() - for (rootDir in moduleRoots) { - File("../$rootDir").listFiles( FileFilter { it.isDirectory })?.forEach { dir -> - if (dir.name !in moduleIgnore && File(dir, moduleMarker).exists()) { - modules += arrayOf(rootDir, dir.name) - } - } - } - return modules - } - } - - @Test - fun testApi() { - val libsDir = File("../$rootDir/$moduleName/build/libs").absoluteFile.normalize() - val jarPath = getJarPath(libsDir) - val kotlinJvmMappingsFiles = listOf(libsDir.resolve("../visibilities.json")) - val visibilities = - kotlinJvmMappingsFiles - .map { readKotlinVisibilities(it) } - .reduce { m1, m2 -> m1 + m2 } - JarFile(jarPath).use { jarFile -> - val api = getBinaryAPI(jarFile, visibilities).filterOutNonPublic(nonPublicPackages) - api.dumpAndCompareWith(File("reference-public-api").resolve("$moduleName.txt")) - // check for atomicfu leaks - jarFile.checkForAtomicFu() - } - } - - private fun getJarPath(libsDir: File): File { - val regex = Regex("$moduleName-.+\\.jar") - var files = (libsDir.listFiles() ?: throw Exception("Cannot list files in $libsDir")) - .filter { it.name.let { - it matches regex - && !it.endsWith("-sources.jar") - && !it.endsWith("-javadoc.jar") - && !it.endsWith("-tests.jar")} - && !it.name.contains("-metadata-")} - if (files.size > 1) // maybe multiplatform? - files = files.filter { it.name.startsWith("$moduleName-jvm-") } - return files.singleOrNull() ?: - error("No single file matching $regex in $libsDir:\n${files.joinToString("\n")}") - } -} - -private val ATOMIC_FU_REF = "Lkotlinx/atomicfu/".toByteArray() - -private fun JarFile.checkForAtomicFu() { - val foundClasses = mutableListOf() - for (e in entries()) { - if (!e.name.endsWith(".class")) continue - val bytes = getInputStream(e).use { it.readBytes() } - loop@for (i in 0 until bytes.size - ATOMIC_FU_REF.size) { - for (j in 0 until ATOMIC_FU_REF.size) { - if (bytes[i + j] != ATOMIC_FU_REF[j]) continue@loop - } - foundClasses += e.name // report error at the end with all class names - break@loop - } - } - if (foundClasses.isNotEmpty()) { - error("Found references to atomicfu in jar file $name in the following class files: ${ - foundClasses.joinToString("") { "\n\t\t" + it } - }") - } -} diff --git a/binary-compatibility-validator/test/cases/companions/companions.kt b/binary-compatibility-validator/test/cases/companions/companions.kt deleted file mode 100644 index ef59c6febb..0000000000 --- a/binary-compatibility-validator/test/cases/companions/companions.kt +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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 - } -} - diff --git a/binary-compatibility-validator/test/cases/companions/companions.txt b/binary-compatibility-validator/test/cases/companions/companions.txt deleted file mode 100644 index 691907ba0d..0000000000 --- a/binary-compatibility-validator/test/cases/companions/companions.txt +++ /dev/null @@ -1,66 +0,0 @@ -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 ()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 ()V -} - -public final class cases/companions/PublicClasses$PrivateCompanion { - public static final field Companion Lcases/companions/PublicClasses$PrivateCompanion$Companion; - public fun ()V -} - -public final class cases/companions/PublicClasses$ProtectedCompanion { - public static final field Companion Lcases/companions/PublicClasses$ProtectedCompanion$Companion; - public fun ()V -} - -public final class cases/companions/PublicClasses$PublicCompanion { - public static final field Companion Lcases/companions/PublicClasses$PublicCompanion$Companion; - public fun ()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 { -} - diff --git a/binary-compatibility-validator/test/cases/inline/inline.txt b/binary-compatibility-validator/test/cases/inline/inline.txt deleted file mode 100644 index 4961dbcfd4..0000000000 --- a/binary-compatibility-validator/test/cases/inline/inline.txt +++ /dev/null @@ -1,9 +0,0 @@ -public final class cases/inline/InlineExposedKt { - public static final fun exposedForInline ()V -} - -public final class cases/inline/InternalClassExposed { - public fun ()V - public final fun funExposed ()V -} - diff --git a/binary-compatibility-validator/test/cases/inline/inlineExposed.kt b/binary-compatibility-validator/test/cases/inline/inlineExposed.kt deleted file mode 100644 index 2e017b3832..0000000000 --- a/binary-compatibility-validator/test/cases/inline/inlineExposed.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.inline - -@PublishedApi -internal fun exposedForInline() {} - -@PublishedApi -internal class InternalClassExposed - @PublishedApi - internal constructor() { - - @PublishedApi - internal fun funExposed() {} - - // TODO: Cover unsupported cases: requires correctly reflecting annotations from properties - /* - @PublishedApi - internal var propertyExposed: String? = null - - @JvmField - @PublishedApi - internal var fieldExposed: String? = null - */ - -} diff --git a/binary-compatibility-validator/test/cases/inline/inlineOnly.kt b/binary-compatibility-validator/test/cases/inline/inlineOnly.kt deleted file mode 100644 index 9c1f01eb0e..0000000000 --- a/binary-compatibility-validator/test/cases/inline/inlineOnly.kt +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.inline - -@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") -@kotlin.internal.InlineOnly -public inline fun inlineOnly(f: () -> Unit) = f() \ No newline at end of file diff --git a/binary-compatibility-validator/test/cases/interfaces/interfaceWithEmptyImpls.kt b/binary-compatibility-validator/test/cases/interfaces/interfaceWithEmptyImpls.kt deleted file mode 100644 index 96a1628c82..0000000000 --- a/binary-compatibility-validator/test/cases/interfaces/interfaceWithEmptyImpls.kt +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.interfaces - -public interface EmptyImpls { - @SinceKotlin("1.1") - val property: String -} diff --git a/binary-compatibility-validator/test/cases/interfaces/interfaceWithImpls.kt b/binary-compatibility-validator/test/cases/interfaces/interfaceWithImpls.kt deleted file mode 100644 index d2e4ad0c36..0000000000 --- a/binary-compatibility-validator/test/cases/interfaces/interfaceWithImpls.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.interfaces - -public interface BaseWithImpl { - fun foo() = 42 -} - -public interface DerivedWithImpl : BaseWithImpl { - override fun foo(): Int { - return super.foo() + 1 - } -} - -public interface DerivedWithoutImpl : BaseWithImpl - diff --git a/binary-compatibility-validator/test/cases/interfaces/interfaces.txt b/binary-compatibility-validator/test/cases/interfaces/interfaces.txt deleted file mode 100644 index 4f37b42f3a..0000000000 --- a/binary-compatibility-validator/test/cases/interfaces/interfaces.txt +++ /dev/null @@ -1,27 +0,0 @@ -public abstract interface class cases/interfaces/BaseWithImpl { - public abstract fun foo ()I -} - -public final class cases/interfaces/BaseWithImpl$DefaultImpls { - public static fun foo (Lcases/interfaces/BaseWithImpl;)I -} - -public abstract interface class cases/interfaces/DerivedWithImpl : cases/interfaces/BaseWithImpl { - public abstract fun foo ()I -} - -public final class cases/interfaces/DerivedWithImpl$DefaultImpls { - public static fun foo (Lcases/interfaces/DerivedWithImpl;)I -} - -public abstract interface class cases/interfaces/DerivedWithoutImpl : cases/interfaces/BaseWithImpl { -} - -public final class cases/interfaces/DerivedWithoutImpl$DefaultImpls { - public static fun foo (Lcases/interfaces/DerivedWithoutImpl;)I -} - -public abstract interface class cases/interfaces/EmptyImpls { - public abstract fun getProperty ()Ljava/lang/String; -} - diff --git a/binary-compatibility-validator/test/cases/internal/internal.txt b/binary-compatibility-validator/test/cases/internal/internal.txt deleted file mode 100644 index 2ebfa3aff3..0000000000 --- a/binary-compatibility-validator/test/cases/internal/internal.txt +++ /dev/null @@ -1,3 +0,0 @@ -public final class cases/internal/PublicClass { -} - diff --git a/binary-compatibility-validator/test/cases/internal/internalClass.kt b/binary-compatibility-validator/test/cases/internal/internalClass.kt deleted file mode 100644 index 2410b65791..0000000000 --- a/binary-compatibility-validator/test/cases/internal/internalClass.kt +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.internal - -internal class InternalClass { - public val property = 1 - - public fun function() = property -} \ No newline at end of file diff --git a/binary-compatibility-validator/test/cases/internal/internalMultifile1.kt b/binary-compatibility-validator/test/cases/internal/internalMultifile1.kt deleted file mode 100644 index b4622b3afd..0000000000 --- a/binary-compatibility-validator/test/cases/internal/internalMultifile1.kt +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -@file:JvmName("MultifileKt") -@file:JvmMultifileClass -package cases.internal - -internal fun internalFun1() = internalVal diff --git a/binary-compatibility-validator/test/cases/internal/internalMultifile2.kt b/binary-compatibility-validator/test/cases/internal/internalMultifile2.kt deleted file mode 100644 index c375c01e16..0000000000 --- a/binary-compatibility-validator/test/cases/internal/internalMultifile2.kt +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -@file:JvmName("MultifileKt") -@file:JvmMultifileClass -package cases.internal - -internal val internalVal = "Internal" diff --git a/binary-compatibility-validator/test/cases/internal/internalPart.kt b/binary-compatibility-validator/test/cases/internal/internalPart.kt deleted file mode 100644 index b95ba6830e..0000000000 --- a/binary-compatibility-validator/test/cases/internal/internalPart.kt +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.internal - -internal fun internalFun() { - -} - -// TODO: var, val, const \ No newline at end of file diff --git a/binary-compatibility-validator/test/cases/internal/publicClassInternalMember.kt b/binary-compatibility-validator/test/cases/internal/publicClassInternalMember.kt deleted file mode 100644 index 11aac7c5cb..0000000000 --- a/binary-compatibility-validator/test/cases/internal/publicClassInternalMember.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.internal - -public class PublicClass internal constructor() { - - internal val property = 1 - - internal fun function() = property - -} diff --git a/binary-compatibility-validator/test/cases/java/Facade.java b/binary-compatibility-validator/test/cases/java/Facade.java deleted file mode 100644 index d11c16cd7f..0000000000 --- a/binary-compatibility-validator/test/cases/java/Facade.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.java; - -class Part1 { - public static void publicMethod(int param) { } - - public static class Part2 extends Part1 { - public static void publicMethod(String param) { } - } -} - - -public class Facade extends Part1.Part2 { } diff --git a/binary-compatibility-validator/test/cases/java/java.txt b/binary-compatibility-validator/test/cases/java/java.txt deleted file mode 100644 index 75bfd3179f..0000000000 --- a/binary-compatibility-validator/test/cases/java/java.txt +++ /dev/null @@ -1,6 +0,0 @@ -public class cases/java/Facade { - public fun ()V - public static fun publicMethod (I)V - public static fun publicMethod (Ljava/lang/String;)V -} - diff --git a/binary-compatibility-validator/test/cases/localClasses/fromStdlib.kt b/binary-compatibility-validator/test/cases/localClasses/fromStdlib.kt deleted file mode 100644 index 29f6994ec3..0000000000 --- a/binary-compatibility-validator/test/cases/localClasses/fromStdlib.kt +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.localClasses - -private val COMPARER = compareBy { it.length } \ No newline at end of file diff --git a/binary-compatibility-validator/test/cases/localClasses/lambdas.kt b/binary-compatibility-validator/test/cases/localClasses/lambdas.kt deleted file mode 100644 index a99c4497ff..0000000000 --- a/binary-compatibility-validator/test/cases/localClasses/lambdas.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.localClasses - - -class L { - internal fun a(lambda: () -> Unit) = lambda() - - @Suppress("NOTHING_TO_INLINE") - internal inline fun inlineLambda() { - a { - println("OK") - } - } -} - -fun box() { - L().inlineLambda() -} - - -// TODO: inline lambda from stdlib \ No newline at end of file diff --git a/binary-compatibility-validator/test/cases/localClasses/localClasses.kt b/binary-compatibility-validator/test/cases/localClasses/localClasses.kt deleted file mode 100644 index 1af4b77df9..0000000000 --- a/binary-compatibility-validator/test/cases/localClasses/localClasses.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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() - } -} diff --git a/binary-compatibility-validator/test/cases/localClasses/localClasses.txt b/binary-compatibility-validator/test/cases/localClasses/localClasses.txt deleted file mode 100644 index da0d668ced..0000000000 --- a/binary-compatibility-validator/test/cases/localClasses/localClasses.txt +++ /dev/null @@ -1,18 +0,0 @@ -public final class cases/localClasses/A { - public fun ()V - public final fun a ()Ljava/lang/String; -} - -public final class cases/localClasses/B { - public fun ()V - public final fun a (Ljava/lang/String;)Ljava/lang/String; -} - -public final class cases/localClasses/L { - public fun ()V -} - -public final class cases/localClasses/LambdasKt { - public static final fun box ()V -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/internalClass.kt b/binary-compatibility-validator/test/cases/nestedClasses/internalClass.kt deleted file mode 100644 index 7af2dda914..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/internalClass.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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 -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/internalInterface.kt b/binary-compatibility-validator/test/cases/nestedClasses/internalInterface.kt deleted file mode 100644 index a0affc53a6..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/internalInterface.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.nestedClasses - -internal interface InternalInterface { - public object ObjPublic - private object ObjPrivate - - public class NestedPublic - private class NestedPrivate - - public interface NestedPublicInterface - private interface NestedPrivateInterface - -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/internalObject.kt b/binary-compatibility-validator/test/cases/nestedClasses/internalObject.kt deleted file mode 100644 index ca3fd8344b..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/internalObject.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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 -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/nestedClasses.txt b/binary-compatibility-validator/test/cases/nestedClasses/nestedClasses.txt deleted file mode 100644 index 4ba38c780f..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/nestedClasses.txt +++ /dev/null @@ -1,86 +0,0 @@ -public abstract class cases/nestedClasses/PublicAbstractClass { - public fun ()V -} - -protected final class cases/nestedClasses/PublicAbstractClass$InnerProtected { - public fun (Lcases/nestedClasses/PublicAbstractClass;)V -} - -protected final class cases/nestedClasses/PublicAbstractClass$NestedProtected { - public fun ()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 ()V -} - -public final class cases/nestedClasses/PublicClass$InnerPublic { - public fun (Lcases/nestedClasses/PublicClass;)V -} - -public final class cases/nestedClasses/PublicClass$NestedPublic { - public fun ()V -} - -public abstract interface class cases/nestedClasses/PublicClass$NestedPublicInterface { -} - -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 ()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 ()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 ()V -} - -protected final class cases/nestedClasses/PublicOpenClass$InnerProtected { - public fun (Lcases/nestedClasses/PublicOpenClass;)V -} - -protected final class cases/nestedClasses/PublicOpenClass$NestedProtected { - public fun ()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; -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/privateClass.kt b/binary-compatibility-validator/test/cases/nestedClasses/privateClass.kt deleted file mode 100644 index 1e1fa8a8e3..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/privateClass.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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 -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/privateInterface.kt b/binary-compatibility-validator/test/cases/nestedClasses/privateInterface.kt deleted file mode 100644 index 8c936a1fdb..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/privateInterface.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.nestedClasses - -private interface PrivateInterface { - public object ObjPublic - private object ObjPrivate - - public class NestedPublic - private class NestedPrivate - - public interface NestedPublicInterface - private interface NestedPrivateInterface - -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/privateObject.kt b/binary-compatibility-validator/test/cases/nestedClasses/privateObject.kt deleted file mode 100644 index 4251d25e78..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/privateObject.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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 -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/publicAbstractClass.kt b/binary-compatibility-validator/test/cases/nestedClasses/publicAbstractClass.kt deleted file mode 100644 index 1da59a5b02..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/publicAbstractClass.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.nestedClasses - -public abstract class PublicAbstractClass { - protected object ObjProtected - - protected class NestedProtected - - protected interface NestedProtectedInterface - - protected inner class InnerProtected -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/publicClass.kt b/binary-compatibility-validator/test/cases/nestedClasses/publicClass.kt deleted file mode 100644 index 64f487d970..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/publicClass.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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 -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/publicInterface.kt b/binary-compatibility-validator/test/cases/nestedClasses/publicInterface.kt deleted file mode 100644 index 3ee24f549a..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/publicInterface.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.nestedClasses - -public interface PublicInterface { - public object ObjPublic - private object ObjPrivate - - public class NestedPublic - private class NestedPrivate - - public interface NestedPublicInterface - private interface NestedPrivateInterface - -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/publicObject.kt b/binary-compatibility-validator/test/cases/nestedClasses/publicObject.kt deleted file mode 100644 index 6ce2bcdd04..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/publicObject.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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 -} - diff --git a/binary-compatibility-validator/test/cases/nestedClasses/publicOpenClass.kt b/binary-compatibility-validator/test/cases/nestedClasses/publicOpenClass.kt deleted file mode 100644 index 1c9edef504..0000000000 --- a/binary-compatibility-validator/test/cases/nestedClasses/publicOpenClass.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.nestedClasses - -public open class PublicOpenClass { - protected object ObjProtected - - protected class NestedProtected - - protected interface NestedProtectedInterface - - protected inner class InnerProtected -} - diff --git a/binary-compatibility-validator/test/cases/private/private.txt b/binary-compatibility-validator/test/cases/private/private.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/binary-compatibility-validator/test/cases/private/privateClassMembers.kt b/binary-compatibility-validator/test/cases/private/privateClassMembers.kt deleted file mode 100644 index 92dd618372..0000000000 --- a/binary-compatibility-validator/test/cases/private/privateClassMembers.kt +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.private - -private open class PrivateClass public constructor() { - internal val internalVal = 1 - - protected fun protectedFun() = internalVal -} diff --git a/binary-compatibility-validator/test/cases/private/privateMultifile1.kt b/binary-compatibility-validator/test/cases/private/privateMultifile1.kt deleted file mode 100644 index 8f7535f869..0000000000 --- a/binary-compatibility-validator/test/cases/private/privateMultifile1.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -@file:JvmName("MultifileKt") -@file:JvmMultifileClass -package cases.private - -private val privateVal: Any? = 1 -private var privateVar: Any? = 1 - - diff --git a/binary-compatibility-validator/test/cases/private/privateMultifile2.kt b/binary-compatibility-validator/test/cases/private/privateMultifile2.kt deleted file mode 100644 index ee0a08049c..0000000000 --- a/binary-compatibility-validator/test/cases/private/privateMultifile2.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -@file:JvmName("MultifileKt") -@file:JvmMultifileClass -package cases.private - - -// const -private const val privateConst: Int = 4 - -// fun -@Suppress("UNUSED_PARAMETER") -private fun privateFun(x: Any) {} - - -private class PrivateClassInMultifile { - internal fun accessUsage() { - privateFun(privateConst) - } - -} diff --git a/binary-compatibility-validator/test/cases/private/privatePart.kt b/binary-compatibility-validator/test/cases/private/privatePart.kt deleted file mode 100644 index 93d4ec14a0..0000000000 --- a/binary-compatibility-validator/test/cases/private/privatePart.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.private - -// properties -private val privateVal: Any? = 1 -private var privateVar: Any? = 1 - -// constants - -private const val privateConst: Int = 4 - -// fun - -@Suppress("UNUSED_PARAMETER") -private fun privateFun(a: Any?) = privateConst - -// access -private class PrivateClassInPart { - internal fun accessUsage() { - privateFun(privateVal) - privateFun(privateVar) - privateFun(privateConst) - } - -} \ No newline at end of file diff --git a/binary-compatibility-validator/test/cases/protected/protected.txt b/binary-compatibility-validator/test/cases/protected/protected.txt deleted file mode 100644 index 3c28d7e163..0000000000 --- a/binary-compatibility-validator/test/cases/protected/protected.txt +++ /dev/null @@ -1,19 +0,0 @@ -public abstract class cases/protected/PublicAbstractClass { - protected fun ()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 { -} - -public class cases/protected/PublicOpenClass { - protected fun ()V - protected final fun getProtectedVal ()I - protected final fun getProtectedVar ()I - protected final fun protectedFun ()I - protected final fun setProtectedVar (I)V -} - diff --git a/binary-compatibility-validator/test/cases/protected/protectedInAbstract.kt b/binary-compatibility-validator/test/cases/protected/protectedInAbstract.kt deleted file mode 100644 index ab4e26fef6..0000000000 --- a/binary-compatibility-validator/test/cases/protected/protectedInAbstract.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.protected - -public abstract class PublicAbstractClass protected constructor() { - protected abstract val protectedVal: Int - protected abstract var protectedVar: Any? - - protected abstract fun protectedFun() -} diff --git a/binary-compatibility-validator/test/cases/protected/protectedInFinal.kt b/binary-compatibility-validator/test/cases/protected/protectedInFinal.kt deleted file mode 100644 index 419e3f420c..0000000000 --- a/binary-compatibility-validator/test/cases/protected/protectedInFinal.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.protected - -public class PublicFinalClass protected constructor() { - protected val protectedVal = 1 - protected var protectedVar = 2 - - protected fun protectedFun() = protectedVal -} diff --git a/binary-compatibility-validator/test/cases/protected/protectedInOpen.kt b/binary-compatibility-validator/test/cases/protected/protectedInOpen.kt deleted file mode 100644 index ee6868354f..0000000000 --- a/binary-compatibility-validator/test/cases/protected/protectedInOpen.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.protected - -public open class PublicOpenClass protected constructor() { - protected val protectedVal = 1 - protected var protectedVar = 2 - - protected fun protectedFun() = protectedVal -} diff --git a/binary-compatibility-validator/test/cases/public/public.txt b/binary-compatibility-validator/test/cases/public/public.txt deleted file mode 100644 index c9dd5dd2b7..0000000000 --- a/binary-compatibility-validator/test/cases/public/public.txt +++ /dev/null @@ -1,9 +0,0 @@ -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 -} - diff --git a/binary-compatibility-validator/test/cases/public/publicMultifile1.kt b/binary-compatibility-validator/test/cases/public/publicMultifile1.kt deleted file mode 100644 index ccc6823c3e..0000000000 --- a/binary-compatibility-validator/test/cases/public/publicMultifile1.kt +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -@file:JvmName("MultifileKt") -@file:JvmMultifileClass -package cases.public - -public fun publicFun1() = publicVal diff --git a/binary-compatibility-validator/test/cases/public/publicMultifile2.kt b/binary-compatibility-validator/test/cases/public/publicMultifile2.kt deleted file mode 100644 index 174bd43d39..0000000000 --- a/binary-compatibility-validator/test/cases/public/publicMultifile2.kt +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -@file:JvmName("MultifileKt") -@file:JvmMultifileClass -package cases.public - -public val publicVal = "Public" diff --git a/binary-compatibility-validator/test/cases/public/publicPart.kt b/binary-compatibility-validator/test/cases/public/publicPart.kt deleted file mode 100644 index 3ad78362d1..0000000000 --- a/binary-compatibility-validator/test/cases/public/publicPart.kt +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.public - -public fun publicFun() { - -} \ No newline at end of file diff --git a/binary-compatibility-validator/test/cases/special/hidden.kt b/binary-compatibility-validator/test/cases/special/hidden.kt deleted file mode 100644 index cb389b8d0d..0000000000 --- a/binary-compatibility-validator/test/cases/special/hidden.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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() {} diff --git a/binary-compatibility-validator/test/cases/special/internalLateinitMember.kt b/binary-compatibility-validator/test/cases/special/internalLateinitMember.kt deleted file mode 100644 index e9819fa4e8..0000000000 --- a/binary-compatibility-validator/test/cases/special/internalLateinitMember.kt +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.special - -public class ClassWithLateInitMembers internal constructor() { - - public lateinit var publicLateInitWithInternalSet: String - internal set - - internal lateinit var internalLateInit: String - -} \ No newline at end of file diff --git a/binary-compatibility-validator/test/cases/special/jvmField.kt b/binary-compatibility-validator/test/cases/special/jvmField.kt deleted file mode 100644 index 9a8c911711..0000000000 --- a/binary-compatibility-validator/test/cases/special/jvmField.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package cases.special - -public open class JvmFieldsClass { - @JvmField - public var publicField = "x" - - @JvmField - internal var internalField = "y" - - @JvmField - protected var protectedField = "y" - - public companion object JvmFieldsCompanion { - @JvmField - public var publicСField = "x" - - @JvmField - internal var internalСField = "y" - - @JvmField - protected var protectedСField = "y" - - public const val publicConst = 1 - internal const val internalConst = 2 - protected const val protectedConst = 3 - private const val privateConst = 4 - } -} - -public object JvmFieldsObject { - @JvmField - public var publicField = "x" - - @JvmField - internal var internalField = "y" - - public const val publicConst = 1 - internal const val internalConst = 2 - private const val privateConst = 4 -} - - -@JvmField -public var publicField = "x" - -@JvmField -internal var internalField = "y" - -public const val publicConst = 1 -internal const val internalConst = 2 -private const val privateConst = 4 diff --git a/binary-compatibility-validator/test/cases/special/jvmNames.kt b/binary-compatibility-validator/test/cases/special/jvmNames.kt deleted file mode 100644 index e304de01fe..0000000000 --- a/binary-compatibility-validator/test/cases/special/jvmNames.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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 - - - diff --git a/binary-compatibility-validator/test/cases/special/jvmOverloads.kt b/binary-compatibility-validator/test/cases/special/jvmOverloads.kt deleted file mode 100644 index 8f238138a2..0000000000 --- a/binary-compatibility-validator/test/cases/special/jvmOverloads.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -@file:Suppress("UNUSED_PARAMETER") - -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) {} - -} \ No newline at end of file diff --git a/binary-compatibility-validator/test/cases/special/special.txt b/binary-compatibility-validator/test/cases/special/special.txt deleted file mode 100644 index 40c074d245..0000000000 --- a/binary-compatibility-validator/test/cases/special/special.txt +++ /dev/null @@ -1,61 +0,0 @@ -public final class cases/special/ClassWithLateInitMembers { - 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 ()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/JvmFieldKt { - public static final field publicConst I - public static field publicField Ljava/lang/String; -} - -public class cases/special/JvmFieldsClass { - public static final field JvmFieldsCompanion Lcases/special/JvmFieldsClass$JvmFieldsCompanion; - protected static final field protectedConst I - protected field protectedField Ljava/lang/String; - protected static field protectedСField Ljava/lang/String; - public static final field publicConst I - public field publicField Ljava/lang/String; - public static field publicСField Ljava/lang/String; - public fun ()V -} - -public final class cases/special/JvmFieldsClass$JvmFieldsCompanion { -} - -public final class cases/special/JvmFieldsObject { - public static final field INSTANCE Lcases/special/JvmFieldsObject; - public static final field publicConst I - public static field publicField Ljava/lang/String; -} - -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 final fun publicFunWithOverloads ()V - public static final 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 -} - diff --git a/binary-compatibility-validator/test/cases/whenMappings/enumWhen.kt b/binary-compatibility-validator/test/cases/whenMappings/enumWhen.kt deleted file mode 100644 index ff3a1d01b5..0000000000 --- a/binary-compatibility-validator/test/cases/whenMappings/enumWhen.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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() -} diff --git a/binary-compatibility-validator/test/cases/whenMappings/sealedClassWhen.kt b/binary-compatibility-validator/test/cases/whenMappings/sealedClassWhen.kt deleted file mode 100644 index 5cd80b5d8d..0000000000 --- a/binary-compatibility-validator/test/cases/whenMappings/sealedClassWhen.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -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() -} diff --git a/binary-compatibility-validator/test/cases/whenMappings/whenMappings.txt b/binary-compatibility-validator/test/cases/whenMappings/whenMappings.txt deleted file mode 100644 index 1975cf1364..0000000000 --- a/binary-compatibility-validator/test/cases/whenMappings/whenMappings.txt +++ /dev/null @@ -1,33 +0,0 @@ -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 ()V -} - -public final class cases/whenMappings/SampleSealed$B : cases/whenMappings/SampleSealed { - public fun ()V -} - -public final class cases/whenMappings/SampleSealed$C : cases/whenMappings/SampleSealed { - public fun ()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 -} - diff --git a/binary-compatibility-validator/test/utils.kt b/binary-compatibility-validator/test/utils.kt deleted file mode 100644 index c7844108b1..0000000000 --- a/binary-compatibility-validator/test/utils.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.tools - -import java.io.* -import kotlin.test.* - -private val OVERWRITE_EXPECTED_OUTPUT = - System.getProperty("overwrite.output")?.toBoolean() ?: false // use -Doverwrite.output=true - -fun List.dumpAndCompareWith(to: File) { - if (!to.exists()) { - to.parentFile?.mkdirs() - to.bufferedWriter().use { dump(to = it) } - fail("Expected data file did not exist. Generated: $to") - } else { - val actual = dump(to = StringBuilder()) - assertEqualsToFile(to, actual) - } -} - -private fun assertEqualsToFile(to: File, actual: CharSequence) { - val actualText = actual.trimTrailingWhitespacesAndAddNewlineAtEOF() - val expectedText = to.readText().trimTrailingWhitespacesAndAddNewlineAtEOF() - if (expectedText == actualText) return // Ok - // Difference - if (OVERWRITE_EXPECTED_OUTPUT) { - to.writeText(actualText) - println("Generated: $to") - return // make test pass when overwriting output - } - // Fail on difference - assertEquals( - expectedText, - actualText, - "Actual data differs from file content: ${to.name}\nTo overwrite the expected API rerun with -Doverwrite.output=true parameter\n" - ) -} - -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]+") diff --git a/build.gradle b/build.gradle index 94db6c08c8..c141343b00 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ def rootModule = "kotlinx.coroutines" def coreModule = "kotlinx-coroutines-core" // Not applicable for Kotlin plugin def sourceless = ['kotlinx.coroutines', 'site', 'kotlinx-coroutines-bom'] -def internal = ['kotlinx.coroutines', 'site', 'benchmarks', 'knit', 'js-stub', 'stdlib-stubs', 'binary-compatibility-validator'] +def internal = ['kotlinx.coroutines', 'site', 'benchmarks', 'knit', 'js-stub', 'stdlib-stubs'] // Not published def unpublished = internal + ['example-frontend-js', 'android-unit-tests'] @@ -68,6 +68,7 @@ buildscript { classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version" classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomicfu_version" classpath "com.moowork.gradle:gradle-node-plugin:$gradle_node_version" + classpath "org.jetbrains.kotlinx:binary-compatibility-validator:0.1.1" // JMH plugins classpath "com.github.jengelman.gradle.plugins:shadow:5.1.0" @@ -119,6 +120,14 @@ allprojects { } } +apply plugin: "binary-compatibility-validator" +apiValidation { + ignoredProjects += ["stdlib-stubs", "benchmarks", "knit", "site", + "kotlinx-coroutines-bom", "android-unit-tests", "js-stub"] + ignoredPackages += "kotlinx.coroutines.internal" +} + + allprojects { apply plugin: 'kotlinx-atomicfu' // it also adds all the necessary dependencies def projectName = it.name diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-guava.txt b/integration/kotlinx-coroutines-guava/api/kotlinx-coroutines-guava.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-guava.txt rename to integration/kotlinx-coroutines-guava/api/kotlinx-coroutines-guava.api diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-jdk8.txt b/integration/kotlinx-coroutines-jdk8/api/kotlinx-coroutines-jdk8.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-jdk8.txt rename to integration/kotlinx-coroutines-jdk8/api/kotlinx-coroutines-jdk8.api diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-play-services.txt b/integration/kotlinx-coroutines-play-services/api/kotlinx-coroutines-play-services.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-play-services.txt rename to integration/kotlinx-coroutines-play-services/api/kotlinx-coroutines-play-services.api diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-slf4j.txt b/integration/kotlinx-coroutines-slf4j/api/kotlinx-coroutines-slf4j.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-slf4j.txt rename to integration/kotlinx-coroutines-slf4j/api/kotlinx-coroutines-slf4j.api diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-core.txt b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-core.txt rename to kotlinx-coroutines-core/api/kotlinx-coroutines-core.api diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-debug.txt b/kotlinx-coroutines-debug/api/kotlinx-coroutines-debug.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-debug.txt rename to kotlinx-coroutines-debug/api/kotlinx-coroutines-debug.api diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-test.txt b/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-test.txt rename to kotlinx-coroutines-test/api/kotlinx-coroutines-test.api diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-reactive.txt b/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-reactive.txt rename to reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-reactor.txt b/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-reactor.txt rename to reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-rx2.txt b/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-rx2.txt rename to reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api diff --git a/settings.gradle b/settings.gradle index e161cfeada..2925355dc1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -18,8 +18,6 @@ include('benchmarks') include('knit') include('site') -module('binary-compatibility-validator') - include "kotlinx-coroutines-core" module('kotlinx-coroutines-test') diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-android.txt b/ui/kotlinx-coroutines-android/api/kotlinx-coroutines-android.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-android.txt rename to ui/kotlinx-coroutines-android/api/kotlinx-coroutines-android.api diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-javafx.txt b/ui/kotlinx-coroutines-javafx/api/kotlinx-coroutines-javafx.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-javafx.txt rename to ui/kotlinx-coroutines-javafx/api/kotlinx-coroutines-javafx.api diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-swing.txt b/ui/kotlinx-coroutines-swing/api/kotlinx-coroutines-swing.api similarity index 100% rename from binary-compatibility-validator/reference-public-api/kotlinx-coroutines-swing.txt rename to ui/kotlinx-coroutines-swing/api/kotlinx-coroutines-swing.api From b97d277595fdb68812534fa720f0bdda948226e9 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 7 Feb 2020 16:57:55 +0300 Subject: [PATCH 2/5] break binary compatibility in MPP module --- kotlinx-coroutines-core/common/src/CancellableContinuation.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kotlinx-coroutines-core/common/src/CancellableContinuation.kt b/kotlinx-coroutines-core/common/src/CancellableContinuation.kt index d1e99529a5..ebb612f3bb 100644 --- a/kotlinx-coroutines-core/common/src/CancellableContinuation.kt +++ b/kotlinx-coroutines-core/common/src/CancellableContinuation.kt @@ -187,6 +187,8 @@ public interface CancellableContinuation : Continuation { public fun resume(value: T, onCancellation: (cause: Throwable) -> Unit) } +fun foo() {} + /** * Suspends the coroutine like [suspendCoroutine], but providing a [CancellableContinuation] to * the [block]. This function throws a [CancellationException] if the coroutine is cancelled or completed while suspended. From 1848a5a4acf93a2361d5737b121d4fe6eb6dfc6e Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 7 Feb 2020 17:06:59 +0300 Subject: [PATCH 3/5] break binary compatibility in JVM module --- kotlinx-coroutines-core/common/src/CancellableContinuation.kt | 2 -- ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/CancellableContinuation.kt b/kotlinx-coroutines-core/common/src/CancellableContinuation.kt index ebb612f3bb..d1e99529a5 100644 --- a/kotlinx-coroutines-core/common/src/CancellableContinuation.kt +++ b/kotlinx-coroutines-core/common/src/CancellableContinuation.kt @@ -187,8 +187,6 @@ public interface CancellableContinuation : Continuation { public fun resume(value: T, onCancellation: (cause: Throwable) -> Unit) } -fun foo() {} - /** * Suspends the coroutine like [suspendCoroutine], but providing a [CancellableContinuation] to * the [block]. This function throws a [CancellationException] if the coroutine is cancelled or completed while suspended. diff --git a/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt b/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt index 8d4cecb0e0..d365e64f66 100644 --- a/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt +++ b/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt @@ -99,6 +99,9 @@ internal fun Looper.asHandler(async: Boolean): Handler { @Deprecated("Use Dispatchers.Main instead", level = DeprecationLevel.HIDDEN) internal val Main: HandlerDispatcher? = runCatching { HandlerContext(Looper.getMainLooper().asHandler(async = true), "Main") }.getOrNull() +fun foo() { + +} /** * Implements [CoroutineDispatcher] on top of an arbitrary Android [Handler]. */ From a37a3f8b2d24bfe2012aac5756ed9f44a1f98e22 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 7 Feb 2020 17:15:16 +0300 Subject: [PATCH 4/5] Restore binary compatibility --- ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt b/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt index d365e64f66..8d4cecb0e0 100644 --- a/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt +++ b/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt @@ -99,9 +99,6 @@ internal fun Looper.asHandler(async: Boolean): Handler { @Deprecated("Use Dispatchers.Main instead", level = DeprecationLevel.HIDDEN) internal val Main: HandlerDispatcher? = runCatching { HandlerContext(Looper.getMainLooper().asHandler(async = true), "Main") }.getOrNull() -fun foo() { - -} /** * Implements [CoroutineDispatcher] on top of an arbitrary Android [Handler]. */ From 953740bca17a0cd11afa9e10a8b3f9eec9d0ed78 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 10 Feb 2020 20:41:03 +0300 Subject: [PATCH 5/5] Extract bcv version to gradle.properties --- build.gradle | 2 +- gradle.properties | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index c141343b00..e03179dddb 100644 --- a/build.gradle +++ b/build.gradle @@ -68,7 +68,7 @@ buildscript { classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version" classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomicfu_version" classpath "com.moowork.gradle:gradle-node-plugin:$gradle_node_version" - classpath "org.jetbrains.kotlinx:binary-compatibility-validator:0.1.1" + classpath "org.jetbrains.kotlinx:binary-compatibility-validator:$binary_compatibility_validator_version" // JMH plugins classpath "com.github.jengelman.gradle.plugins:shadow:5.1.0" diff --git a/gradle.properties b/gradle.properties index 6d8456a5a8..b693ededcd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,6 +17,7 @@ byte_buddy_version=1.9.3 reactor_vesion=3.2.5.RELEASE reactive_streams_version=1.0.2 rxjava2_version=2.2.8 +binary_compatibility_validator_version=0.1.1 # JS gradle_node_version=1.2.0 @@ -32,4 +33,4 @@ kotlin.incremental.multiplatform=true kotlin.native.ignoreDisabledTargets=true # Site deneration -jekyll_version=4.0 \ No newline at end of file +jekyll_version=4.0