From 00faa6fa01dd1d14e9407bdd99e85ad3745979ce Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Thu, 22 Feb 2024 15:47:58 +0200 Subject: [PATCH] [Tests] Support language features from test data in .knm meta compiler Mute test failure revealed by unblocked context receivers (KTIJ-28885) KTIJ-28668 --- .../konan/AbstractDecompiledKnmFileTest.kt | 7 +++++++ .../ContextReceiversCallableMembers.kt | 3 --- .../ContextReceiversOnClass.kt | 3 --- .../ContextReceiversOnFunctionType.kt | 3 +-- .../ContextReceiversOnTopLevelCallables.kt | 3 --- .../org/jetbrains/kotlin/test/KlibTestUtil.kt | 18 +++++++++++++++--- 6 files changed, 23 insertions(+), 14 deletions(-) diff --git a/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/AbstractDecompiledKnmFileTest.kt b/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/AbstractDecompiledKnmFileTest.kt index 6c1614e99ba..35298c2cc18 100644 --- a/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/AbstractDecompiledKnmFileTest.kt +++ b/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/AbstractDecompiledKnmFileTest.kt @@ -22,6 +22,7 @@ import java.nio.file.Paths import java.util.stream.Collectors import kotlin.io.path.absolutePathString import kotlin.io.path.extension +import kotlin.io.path.readText abstract class AbstractDecompiledKnmFileTest : KotlinTestWithEnvironment() { abstract val knmTestSupport: KnmTestSupport @@ -60,10 +61,16 @@ abstract class AbstractDecompiledKnmFileTest : KotlinTestWithEnvironment() { private fun compileCommonKlib(testDirectory: Path): File { val ktFiles = Files.list(testDirectory).filter { it.extension == "kt" }.collect(Collectors.toList()) val testKlib = KtTestUtil.tmpDir("testLibrary").resolve("library.klib") + val additionalArgumentsFromLanguageDirectives = ktFiles.flatMap { path -> + path.readText().let { fileText -> + InTextDirectivesUtils.findListWithPrefixes(fileText, "// !LANGUAGE: ").map { "-XXLanguage:$it" } + } + } KlibTestUtil.compileCommonSourcesToKlib( ktFiles.map(Path::toFile), libraryName = "library", testKlib, + additionalArgumentsFromLanguageDirectives, ) return testKlib diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversCallableMembers/ContextReceiversCallableMembers.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversCallableMembers/ContextReceiversCallableMembers.kt index 5b5bcc63319..c84a7e02d35 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversCallableMembers/ContextReceiversCallableMembers.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversCallableMembers/ContextReceiversCallableMembers.kt @@ -1,8 +1,5 @@ // FIR_IDENTICAL // !LANGUAGE: +ContextReceivers -/* Unsupported arguments in test metadata compiler */ -// KNM_K2_IGNORE -// KNM_FE10_IGNORE private open class ContextReceiversCallableMembers { context(A, B) diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnClass/ContextReceiversOnClass.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnClass/ContextReceiversOnClass.kt index 04d37ee7cc3..f842b2c2c37 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnClass/ContextReceiversOnClass.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnClass/ContextReceiversOnClass.kt @@ -1,8 +1,5 @@ // FIR_IDENTICAL // !LANGUAGE: +ContextReceivers -/* Unsupported arguments in test metadata compiler */ -// KNM_K2_IGNORE -// KNM_FE10_IGNORE context(A, B) private open class ContextReceiversOnClass { diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnFunctionType/ContextReceiversOnFunctionType.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnFunctionType/ContextReceiversOnFunctionType.kt index 35be302fe41..7e48d21b840 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnFunctionType/ContextReceiversOnFunctionType.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnFunctionType/ContextReceiversOnFunctionType.kt @@ -1,9 +1,8 @@ // FIR_IDENTICAL // JVM_FILE_NAME: ContextReceiversOnFunctionTypeKt // !LANGUAGE: +ContextReceivers -/* Unsupported arguments in test metadata compiler */ +/* KTIJ-28885 */ // KNM_K2_IGNORE -// KNM_FE10_IGNORE fun f(g: context(A, B) Int.(Int) -> Int) {} diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnTopLevelCallables/ContextReceiversOnTopLevelCallables.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnTopLevelCallables/ContextReceiversOnTopLevelCallables.kt index 58c790797f6..81d443dfd2a 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnTopLevelCallables/ContextReceiversOnTopLevelCallables.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnTopLevelCallables/ContextReceiversOnTopLevelCallables.kt @@ -1,9 +1,6 @@ // FIR_IDENTICAL // JVM_FILE_NAME: ContextReceiversOnTopLevelCallablesKt // !LANGUAGE: +ContextReceivers -/* Unsupported arguments in test metadata compiler */ -// KNM_K2_IGNORE -// KNM_FE10_IGNORE context(A, B) private fun Int.function(): Int = valueA + valueB diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KlibTestUtil.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KlibTestUtil.kt index 2b33fc0f0c4..411907ff577 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KlibTestUtil.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KlibTestUtil.kt @@ -13,10 +13,14 @@ import org.jetbrains.kotlin.analyzer.common.CommonResolverForModuleFactory import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataMonolithicSerializer import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments +import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport +import org.jetbrains.kotlin.cli.common.messages.FilteringMessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageRenderer import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector +import org.jetbrains.kotlin.cli.common.setupCommonArguments import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoot @@ -50,19 +54,27 @@ import java.nio.file.Path import org.jetbrains.kotlin.konan.file.File as KFile object KlibTestUtil { - fun compileCommonSourcesToKlib(sourceFiles: Collection, libraryName: String, klibFile: File) { + fun compileCommonSourcesToKlib( + sourceFiles: Collection, + libraryName: String, + klibFile: File, + additionalArguments: List = emptyList(), + ) { require(!Name.guessByFirstCharacter(libraryName).isSpecial) { "Invalid library name: $libraryName" } val configuration = KotlinTestUtils.newConfiguration() configuration.put( CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, - PrintingMessageCollector(System.err, MessageRenderer.PLAIN_RELATIVE_PATHS, false) + FilteringMessageCollector( + PrintingMessageCollector(System.err, MessageRenderer.PLAIN_RELATIVE_PATHS, false) + ) /* decline = */ { !it.isError } ) configuration.put(CommonConfigurationKeys.MODULE_NAME, libraryName) configuration.addKotlinSourceRoots(sourceFiles.map { it.absolutePath }) val stdlibFile = ForTestCompileRuntime.stdlibCommonForTests() // support for the legacy version of kotlin-stdlib-common (JAR with .kotlin_metadata) configuration.addJvmClasspathRoot(stdlibFile) + configuration.setupCommonArguments(parseCommandLineArguments(additionalArguments)) val rootDisposable = Disposer.newDisposable("Disposable for ${KlibTestUtil::class.simpleName}.compileCommonSourcesToKlib") val module = try { @@ -77,7 +89,7 @@ object KlibTestUtil { val analyzer = AnalyzerWithCompilerReport( configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY), configuration.languageVersionSettings, - configuration.getBoolean(CLIConfigurationKeys.RENDER_DIAGNOSTIC_INTERNAL_NAME) + renderDiagnosticName = true, ) analyzer.analyzeAndReport(environment.getSourceFiles()) {