Fix requirements

This commit is contained in:
Mikhail Bogdanov
2020-03-27 16:12:12 +01:00
parent c11f38688e
commit 7bcbae9826
6 changed files with 157 additions and 38 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.serialization
import org.jetbrains.kotlin.config.AnalysisFlag
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.descriptors.ClassDescriptor
@@ -28,19 +29,17 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
expectedVersionKind: ProtoBuf.VersionRequirement.VersionKind,
expectedErrorCode: Int?,
customLanguageVersion: LanguageVersion = LanguageVersionSettingsImpl.DEFAULT.languageVersion,
fqNames: List<String>
analysisFlags: Map<AnalysisFlag<*>, Any?> = emptyMap(),
fqNamesWithRequirements: List<String>,
fqNamesWithoutRequirement: List<String> = emptyList()
) {
compileFiles(listOf(File("compiler/testData/versionRequirement/${getTestName(true)}.kt")), tmpdir, customLanguageVersion)
compileFiles(listOf(File("compiler/testData/versionRequirement/${getTestName(true)}.kt")), tmpdir, customLanguageVersion, analysisFlags)
val module = loadModule(tmpdir)
for (fqName in fqNames) {
for (fqName in fqNamesWithRequirements) {
val descriptor = module.findUnambiguousDescriptorByFqName(fqName)
val requirement = when (descriptor) {
is DeserializedMemberDescriptor -> descriptor.versionRequirements.singleOrNull()
is DeserializedClassDescriptor -> descriptor.versionRequirements.singleOrNull()
else -> throw AssertionError("Unknown descriptor: $descriptor")
} ?: throw AssertionError("No VersionRequirement for $descriptor")
val requirement = extractRequirement(descriptor) ?: throw AssertionError("No VersionRequirement for $descriptor")
assertEquals("Incorrect version for $fqName", expectedVersionRequirement, requirement.version)
assertEquals("Incorrect level for $fqName", expectedLevel, requirement.level)
@@ -48,6 +47,21 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
assertEquals("Incorrect versionKind for $fqName", expectedVersionKind, requirement.kind)
assertEquals("Incorrect errorCode for $fqName", expectedErrorCode, requirement.errorCode)
}
for (fqName in fqNamesWithoutRequirement) {
val descriptor = module.findUnambiguousDescriptorByFqName(fqName)
val requirenment = extractRequirement(descriptor)
assertNull("Expecting absence of any requirements for $fqName, but `$requirenment`", requirenment)
}
}
private fun extractRequirement(descriptor: DeclarationDescriptor): VersionRequirement? {
return when (descriptor) {
is DeserializedMemberDescriptor -> descriptor.versionRequirements.singleOrNull()
is DeserializedClassDescriptor -> descriptor.versionRequirements.singleOrNull()
else -> throw AssertionError("Unknown descriptor: $descriptor")
}
}
private fun ModuleDescriptor.findUnambiguousDescriptorByFqName(fqName: String): DeclarationDescriptor {
@@ -71,7 +85,12 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
return descriptor
}
protected abstract fun compileFiles(files: List<File>, outputDirectory: File, languageVersion: LanguageVersion)
protected abstract fun compileFiles(
files: List<File>,
outputDirectory: File,
languageVersion: LanguageVersion,
analysisFlags: Map<AnalysisFlag<*>, Any?>
)
protected abstract fun loadModule(directory: File): ModuleDescriptor
@@ -79,7 +98,7 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
doTest(
VersionRequirement.Version(1, 3), DeprecationLevel.ERROR, null, ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, null,
customLanguageVersion = LanguageVersion.KOTLIN_1_3,
fqNames = listOf(
fqNamesWithRequirements = listOf(
"test.topLevel",
"test.Foo.member",
"test.Foo.<init>",
@@ -96,7 +115,7 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
doTest(
VersionRequirement.Version(1, 1), DeprecationLevel.WARNING, "message",
ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, 42,
fqNames = listOf(
fqNamesWithRequirements = listOf(
"test.Klass",
"test.Konstructor.<init>",
"test.Typealias",
@@ -109,7 +128,7 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
fun testApiVersionViaAnnotation() {
doTest(
VersionRequirement.Version(1, 1), DeprecationLevel.WARNING, "message", ProtoBuf.VersionRequirement.VersionKind.API_VERSION, 42,
fqNames = listOf(
fqNamesWithRequirements = listOf(
"test.Klass",
"test.Konstructor.<init>",
"test.Typealias",
@@ -123,7 +142,7 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
doTest(
VersionRequirement.Version(1, 1), DeprecationLevel.WARNING, "message",
ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION, 42,
fqNames = listOf(
fqNamesWithRequirements = listOf(
"test.Klass",
"test.Konstructor.<init>",
"test.Typealias",
@@ -137,7 +156,7 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
doTest(
VersionRequirement.Version(1, 1, 50), DeprecationLevel.HIDDEN, null,
ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, null,
fqNames = listOf("test.Klass")
fqNamesWithRequirements = listOf("test.Klass")
)
}
@@ -145,7 +164,7 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
doTest(
VersionRequirement.Version(1, 3), DeprecationLevel.ERROR, null, ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, null,
customLanguageVersion = LanguageVersion.KOTLIN_1_3,
fqNames = listOf(
fqNamesWithRequirements = listOf(
"test.Outer.Inner.Deep",
"test.Outer.Inner.Deep.<init>",
"test.Outer.Inner.Deep.f",
@@ -160,7 +179,7 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
fun testInlineClassesAndRelevantDeclarations() {
doTest(
VersionRequirement.Version(1, 3), DeprecationLevel.ERROR, null, ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, null,
fqNames = listOf(
fqNamesWithRequirements = listOf(
"test.IC",
"test.Ctor.<init>",
"test.simpleFun",