From be4f6beddb25804d52195a10c996ebd3e5812caa Mon Sep 17 00:00:00 2001 From: Alexander Korepanov Date: Tue, 12 Sep 2023 17:00:40 +0200 Subject: [PATCH] [JS Tests] Prepare JS tests for testing backend diagnostics - Introducing a backend diagnostic handler. - Moving JS diagnostic tests from test-common to js.test to avoid circular module dependencies. ^KT-61886 Fixed --- .../inline/recursionCycle.kt | 5 +- .../inline/recursionCycleLambda.kt | 5 +- .../inline/recursionCycleWithPublicFun.kt | 5 +- .../inline/recursionCycleWithStdlibCall.kt | 3 + .../unsupportedFeatures/annotations.kt | 3 + .../test/backend/handlers/HandlerUtils.kt | 36 ++++++- .../handlers/JvmBackendDiagnosticsHandler.kt | 29 +---- .../kotlin/test/model/ResultingArtifacts.kt | 3 +- .../AbstractDiagnosticsTestWithJsStdLib.kt | 100 ------------------ ...csTestWithJsStdLibAndBackendCompilation.kt | 51 --------- .../generators/GenerateJUnit3CompilerTests.kt | 5 - .../generators/GenerateJUnit5CompilerTests.kt | 4 - .../generators/tests/GenerateJsTests.kt | 34 +++++- .../test/converters/FirJsKlibBackendFacade.kt | 2 +- .../js/test/converters/JsKlibBackendFacade.kt | 2 +- .../fir/AbstractFirPsiJsDiagnosticTest.kt | 34 +++++- .../handlers/JsBackendDiagnosticsHandler.kt | 20 ++++ .../ir/AbstractDiagnosticsTestWithJsStdLib.kt | 91 ++++++++++++++++ .../converters/FirWasmKlibBackendFacade.kt | 2 +- 19 files changed, 236 insertions(+), 198 deletions(-) delete mode 100644 compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLib.kt delete mode 100644 compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLibAndBackendCompilation.kt create mode 100644 js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsBackendDiagnosticsHandler.kt create mode 100644 js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractDiagnosticsTestWithJsStdLib.kt diff --git a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycle.kt b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycle.kt index 5fc5b471f4e..3cb84c75dc5 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycle.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycle.kt @@ -1,7 +1,10 @@ +// IGNORE_BACKEND: JS_IR +// TODO: fix in KT-61881 // !DIAGNOSTICS: -NOTHING_TO_INLINE +// FIR_IDENTICAL inline fun f(): Unit = g() inline fun g(): Unit = h() -inline fun h(): Unit = f() \ No newline at end of file +inline fun h(): Unit = f() diff --git a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleLambda.kt b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleLambda.kt index 6443d3635e6..eb66a94998d 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleLambda.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleLambda.kt @@ -1,7 +1,10 @@ +// IGNORE_BACKEND: JS_IR +// TODO: fix in KT-61881 // !DIAGNOSTICS: -NOTHING_TO_INLINE +// FIR_IDENTICAL inline fun f(): Unit = g() inline fun g(): Unit = h { f() } -inline fun h(fn: ()->Unit): Unit = fn() \ No newline at end of file +inline fun h(fn: ()->Unit): Unit = fn() diff --git a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleWithPublicFun.kt b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleWithPublicFun.kt index 028f6f03ace..b4fc10f20b7 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleWithPublicFun.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleWithPublicFun.kt @@ -1,7 +1,10 @@ +// IGNORE_BACKEND: JS_IR +// TODO: fix in KT-61881 // !DIAGNOSTICS: -NOTHING_TO_INLINE +// FIR_IDENTICAL public inline fun f():Unit = g() public inline fun g(): Unit = h() -public inline fun h(): Unit = f() \ No newline at end of file +public inline fun h(): Unit = f() diff --git a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleWithStdlibCall.kt b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleWithStdlibCall.kt index 479363857f0..ae8b7eeaf8c 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleWithStdlibCall.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/inline/recursionCycleWithStdlibCall.kt @@ -1,4 +1,7 @@ +// IGNORE_BACKEND: JS_IR +// TODO: fix in KT-61881 // !DIAGNOSTICS: -NOTHING_TO_INLINE +// FIR_IDENTICAL inline fun f(): Unit = g() diff --git a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/unsupportedFeatures/annotations.kt b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/unsupportedFeatures/annotations.kt index 2a0f2f7eb42..5c408098a13 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/unsupportedFeatures/annotations.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLibAndBackendCompilation/unsupportedFeatures/annotations.kt @@ -1,5 +1,8 @@ +// IGNORE_BACKEND: JS_IR +// TODO: fix in KT-61882 // !LANGUAGE: -RestrictRetentionForExpressionAnnotations // !DIAGNOSTICS: -UNUSED_PARAMETER +// FIR_IDENTICAL package foo diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/HandlerUtils.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/HandlerUtils.kt index 1240aebddde..a94f3476d94 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/HandlerUtils.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/HandlerUtils.kt @@ -5,9 +5,17 @@ package org.jetbrains.kotlin.test.backend.handlers +import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.ir.declarations.IrModuleFragment +import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.backend.ir.IrBackendInput +import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives +import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue +import org.jetbrains.kotlin.test.frontend.fir.handlers.toMetaInfos +import org.jetbrains.kotlin.test.model.BinaryArtifactHandler import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.dependencyProvider +import org.jetbrains.kotlin.test.services.globalMetadataInfoHandler inline fun IrBackendInput.processAllIrModuleFragments( module: TestModule, @@ -15,4 +23,30 @@ inline fun IrBackendInput.processAllIrModuleFragments( ) { dependentIrModuleFragments.forEach { processor(it, it.name.asString()) } processor(irModuleFragment, module.name) -} \ No newline at end of file +} + +fun BinaryArtifactHandler<*>.reportKtDiagnostics(module: TestModule, ktDiagnosticReporter: BaseDiagnosticsCollector) { + val globalMetadataInfoHandler = testServices.globalMetadataInfoHandler + val firParser = module.directives.singleOrZeroValue(FirDiagnosticsDirectives.FIR_PARSER) + val lightTreeComparingModeEnabled = firParser != null && FirDiagnosticsDirectives.COMPARE_WITH_LIGHT_TREE in module.directives + val lightTreeEnabled = firParser == FirParser.LightTree + + val processedModules = mutableSetOf() + + fun processModule(module: TestModule) { + if (!processedModules.add(module)) return + for (testFile in module.files) { + val ktDiagnostics = ktDiagnosticReporter.diagnosticsByFilePath["/${testFile.name}"] ?: continue + ktDiagnostics.forEach { + val metaInfos = it.toMetaInfos(module, testFile, globalMetadataInfoHandler, lightTreeEnabled, lightTreeComparingModeEnabled) + globalMetadataInfoHandler.addMetadataInfosForFile(testFile, metaInfos) + } + } + for ((moduleName, _, _) in module.dependsOnDependencies) { + val dependantModule = testServices.dependencyProvider.getTestModule(moduleName) + processModule(dependantModule) + } + } + + processModule(module) +} diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt index f8975ffeac1..fe0a888090b 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt @@ -15,16 +15,11 @@ import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.jvm.diagnostics.KtDefaultJvmErrorMessages -import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives -import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives -import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue import org.jetbrains.kotlin.test.frontend.classic.handlers.ClassicDiagnosticReporter import org.jetbrains.kotlin.test.frontend.classic.handlers.withNewInferenceModeEnabled import org.jetbrains.kotlin.test.frontend.fir.handlers.FirDiagnosticCodeMetaInfo -import org.jetbrains.kotlin.test.frontend.fir.handlers.toMetaInfos import org.jetbrains.kotlin.test.model.BinaryArtifacts -import org.jetbrains.kotlin.test.model.DependencyKind import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly @@ -57,29 +52,7 @@ class JvmBackendDiagnosticsHandler(testServices: TestServices) : JvmBinaryArtifa private fun reportKtDiagnostics(module: TestModule, info: BinaryArtifacts.Jvm) { val ktDiagnosticReporter = info.classFileFactory.generationState.diagnosticReporter as BaseDiagnosticsCollector - val globalMetadataInfoHandler = testServices.globalMetadataInfoHandler - val firParser = module.directives.singleOrZeroValue(FirDiagnosticsDirectives.FIR_PARSER) - val lightTreeComparingModeEnabled = firParser != null && FirDiagnosticsDirectives.COMPARE_WITH_LIGHT_TREE in module.directives - val lightTreeEnabled = firParser == FirParser.LightTree - - val processedModules = mutableSetOf() - - fun processModule(module: TestModule) { - if (!processedModules.add(module)) return - for (testFile in module.files) { - val ktDiagnostics = ktDiagnosticReporter.diagnosticsByFilePath["/${testFile.name}"] ?: continue - ktDiagnostics.forEach { - val metaInfos = it.toMetaInfos(module, testFile, globalMetadataInfoHandler, lightTreeEnabled, lightTreeComparingModeEnabled) - globalMetadataInfoHandler.addMetadataInfosForFile(testFile, metaInfos) - } - } - for ((moduleName, _, _) in module.dependsOnDependencies) { - val dependantModule = testServices.dependencyProvider.getTestModule(moduleName) - processModule(dependantModule) - } - } - - processModule(module) + reportKtDiagnostics(module, ktDiagnosticReporter) } private fun checkFullDiagnosticRender(module: TestModule) { diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/model/ResultingArtifacts.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/model/ResultingArtifacts.kt index e5f721a4745..ae20d845adc 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/model/ResultingArtifacts.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/model/ResultingArtifacts.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.test.model import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.backend.wasm.WasmCompilerResult import org.jetbrains.kotlin.codegen.ClassFileFactory +import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.fileClasses.JvmFileClassInfo import org.jetbrains.kotlin.ir.backend.js.CompilerResult import org.jetbrains.kotlin.js.facade.TranslationResult @@ -58,7 +59,7 @@ object BinaryArtifacts { get() = ArtifactKinds.Wasm } - class KLib(val outputFile: File) : ResultingArtifact.Binary() { + class KLib(val outputFile: File, val reporter: BaseDiagnosticsCollector) : ResultingArtifact.Binary() { override val kind: BinaryKind get() = ArtifactKinds.KLib } diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLib.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLib.kt deleted file mode 100644 index 605d71cb237..00000000000 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLib.kt +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.checkers - -import com.intellij.openapi.util.text.StringUtil -import org.jetbrains.kotlin.ObsoleteTestInfrastructure -import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport -import org.jetbrains.kotlin.cli.js.klib.TopDownAnalyzerFacadeForJSIR -import org.jetbrains.kotlin.cli.js.klib.TopDownAnalyzerFacadeForWasm -import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.config.CommonConfigurationKeys -import org.jetbrains.kotlin.config.JvmTarget -import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.config.languageVersionSettings -import org.jetbrains.kotlin.context.ModuleContext -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import org.jetbrains.kotlin.ir.backend.js.prepareAnalyzedSourceModule -import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS -import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult -import org.jetbrains.kotlin.js.config.JSConfigurationKeys -import org.jetbrains.kotlin.js.config.JsConfig -import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices -import org.jetbrains.kotlin.js.resolve.MODULE_KIND -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.CompilerEnvironment -import org.jetbrains.kotlin.serialization.js.ModuleKind -import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.test.KotlinTestUtils -import java.util.* - -@ObsoleteTestInfrastructure("org.jetbrains.kotlin.test.runners.AbstractDiagnosticsTestWithJsStdLib") -abstract class AbstractDiagnosticsTestWithJsStdLib : AbstractDiagnosticsTest() { - private var lazyConfig: Lazy? = lazy(LazyThreadSafetyMode.NONE) { - JsConfig(project, environment.configuration.copy().apply { - put(CommonConfigurationKeys.MODULE_NAME, KotlinTestUtils.TEST_MODULE_NAME) - put(JSConfigurationKeys.LIBRARIES, JsConfig.JS_STDLIB) - }, CompilerEnvironment) - } - - protected val config: JsConfig get() = lazyConfig!!.value - - override fun tearDown() { - lazyConfig = null - super.tearDown() - } - - override fun getEnvironmentConfigFiles(): EnvironmentConfigFiles = EnvironmentConfigFiles.JS_CONFIG_FILES - - override fun analyzeModuleContents( - moduleContext: ModuleContext, - files: List, - moduleTrace: BindingTrace, - languageVersionSettings: LanguageVersionSettings, - separateModules: Boolean, - jvmTarget: JvmTarget - ): JsAnalysisResult { - config.configuration.languageVersionSettings = languageVersionSettings - - val sourceModule = prepareAnalyzedSourceModule( - config.project, - files, - config.configuration, - config.configuration[JSConfigurationKeys.LIBRARIES]!!.toList(), - emptyList(), - AnalyzerWithCompilerReport(config.configuration), - analyzerFacade = TopDownAnalyzerFacadeForJSIR - ) - - return sourceModule.jsFrontEndResult.jsAnalysisResult as JsAnalysisResult - } - - override fun getAdditionalDependencies(module: ModuleDescriptorImpl): List = - config.moduleDescriptors - - override fun shouldSkipJvmSignatureDiagnostics(groupedByModule: Map>): Boolean = true - - override fun createModule(moduleName: String, storageManager: StorageManager): ModuleDescriptorImpl = - ModuleDescriptorImpl(Name.special("<$moduleName>"), storageManager, JsPlatformAnalyzerServices.builtIns) - - override fun createSealedModule(storageManager: StorageManager): ModuleDescriptorImpl { - val module = createModule("kotlin-js-test-module", storageManager) - - val dependencies = ArrayList() - dependencies.add(module) - - dependencies.addAll(getAdditionalDependencies(module)) - - dependencies.add(module.builtIns.builtInsModule) - module.setDependencies(dependencies) - - return module - } -} diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLibAndBackendCompilation.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLibAndBackendCompilation.kt deleted file mode 100644 index ed55c3e6985..00000000000 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJsStdLibAndBackendCompilation.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.checkers - -import org.jetbrains.kotlin.ObsoleteTestInfrastructure -import org.jetbrains.kotlin.config.JvmTarget -import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.context.ModuleContext -import org.jetbrains.kotlin.diagnostics.DiagnosticUtils.hasError -import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult -import org.jetbrains.kotlin.js.config.JsConfig -import org.jetbrains.kotlin.js.facade.K2JSTranslator -import org.jetbrains.kotlin.js.facade.MainCallParameters -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.resolve.BindingTrace - -@OptIn(ObsoleteTestInfrastructure::class) -abstract class AbstractDiagnosticsTestWithJsStdLibAndBackendCompilation : AbstractDiagnosticsTestWithJsStdLib() { - override fun analyzeModuleContents( - moduleContext: ModuleContext, - files: List, - moduleTrace: BindingTrace, - languageVersionSettings: LanguageVersionSettings, - separateModules: Boolean, - jvmTarget: JvmTarget - ): JsAnalysisResult { - val analysisResult = super.analyzeModuleContents(moduleContext, files, moduleTrace, languageVersionSettings, separateModules, jvmTarget) - val diagnostics = analysisResult.bindingTrace.bindingContext.diagnostics - - if (!hasError(diagnostics)) { - val translator = K2JSTranslator(config, false) - translator.translate(object : JsConfig.Reporter() {}, files, MainCallParameters.noCall(), analysisResult) - } - - return analysisResult - } -} diff --git a/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit3CompilerTests.kt b/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit3CompilerTests.kt index 4af5ad369f4..41f7a62ed28 100644 --- a/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit3CompilerTests.kt +++ b/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit3CompilerTests.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.asJava.AbstractCompilerLightClassTest import org.jetbrains.kotlin.cfg.AbstractControlFlowTest import org.jetbrains.kotlin.cfg.AbstractDataFlowTest import org.jetbrains.kotlin.cfg.AbstractPseudoValueTest -import org.jetbrains.kotlin.checkers.AbstractDiagnosticsTestWithJsStdLibAndBackendCompilation import org.jetbrains.kotlin.cli.AbstractCliTest import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.defaultConstructor.AbstractDefaultArgumentsReflectionTest @@ -53,10 +52,6 @@ fun generateJUnit3CompilerTests(args: Array, mainClassName: String?) { generateTestGroupSuite(args, mainClassName) { testGroup("compiler/tests-gen", "compiler/testData") { - testClass { - model("diagnostics/testsWithJsStdLibAndBackendCompilation") - } - testClass { model("multiplatform", extension = null, recursive = true, excludeParentDirs = true) } diff --git a/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit5CompilerTests.kt b/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit5CompilerTests.kt index 39c9f23111a..17d14c1c296 100644 --- a/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit5CompilerTests.kt +++ b/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit5CompilerTests.kt @@ -35,10 +35,6 @@ fun generateJUnit5CompilerTests(args: Array, mainClassName: String?) { model("diagnostics/tests/javac", pattern = "^(.*)\\.kts?$", excludedPattern = excludedCustomTestdataPattern) } - testClass { - model("diagnostics/testsWithJsStdLib", excludedPattern = excludedCustomTestdataPattern) - } - testClass { model( "diagnostics/testsWithJvmBackend", diff --git a/js/js.tests/test/org/jetbrains/kotlin/generators/tests/GenerateJsTests.kt b/js/js.tests/test/org/jetbrains/kotlin/generators/tests/GenerateJsTests.kt index 6be9354ea4b..bdbbb19879b 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/generators/tests/GenerateJsTests.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/generators/tests/GenerateJsTests.kt @@ -191,7 +191,39 @@ fun main(args: Array) { } testClass(suiteTestClassName = "FirPsiJsOldFrontendDiagnosticsTestGenerated") { - model("diagnostics/testsWithJsStdLib", pattern = "^([^_](.+))\\.kt$", excludedPattern = excludedFirTestdataPattern) + model( + relativeRootPath = "diagnostics/testsWithJsStdLib", + pattern = "^([^_](.+))\\.kt$", + excludedPattern = excludedFirTestdataPattern, + targetBackend = TargetBackend.JS_IR + ) + } + + testClass(suiteTestClassName = "FirPsiJsOldFrontendDiagnosticsWithBackendTestGenerated") { + model( + relativeRootPath = "diagnostics/testsWithJsStdLibAndBackendCompilation", + pattern = "^([^_](.+))\\.kt$", + excludedPattern = excludedFirTestdataPattern, + targetBackend = TargetBackend.JS_IR + ) + } + + testClass(suiteTestClassName = "DiagnosticsWithJsStdLibTestGenerated") { + model( + relativeRootPath = "diagnostics/testsWithJsStdLib", + pattern = "^([^_](.+))\\.kt$", + excludedPattern = excludedFirTestdataPattern, + targetBackend = TargetBackend.JS_IR + ) + } + + testClass(suiteTestClassName = "DiagnosticsWithJsStdLibAndBackendTestGenerated") { + model( + relativeRootPath = "diagnostics/testsWithJsStdLibAndBackendCompilation", + pattern = "^([^_](.+))\\.kt$", + excludedPattern = excludedFirTestdataPattern, + targetBackend = TargetBackend.JS_IR + ) } testClass { diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt index a3a24617cf6..8e7db279079 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt @@ -102,6 +102,6 @@ class FirJsKlibBackendFacade( } testServices.libraryProvider.setDescriptorAndLibraryByName(outputFile, moduleDescriptor, lib) - return BinaryArtifacts.KLib(File(outputFile)) + return BinaryArtifacts.KLib(File(outputFile), inputArtifact.diagnosticReporter) } } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsKlibBackendFacade.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsKlibBackendFacade.kt index b73acc12fa5..5e0ed98b634 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsKlibBackendFacade.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsKlibBackendFacade.kt @@ -88,6 +88,6 @@ class JsKlibBackendFacade( } testServices.libraryProvider.setDescriptorAndLibraryByName(outputFile, moduleDescriptor, lib) - return BinaryArtifacts.KLib(File(outputFile)) + return BinaryArtifacts.KLib(File(outputFile), inputArtifact.diagnosticReporter) } } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractFirPsiJsDiagnosticTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractFirPsiJsDiagnosticTest.kt index 770a346f87b..e8ce717d98c 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractFirPsiJsDiagnosticTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/fir/AbstractFirPsiJsDiagnosticTest.kt @@ -6,13 +6,19 @@ package org.jetbrains.kotlin.js.test.fir import org.jetbrains.kotlin.js.test.JsAdditionalSourceProvider +import org.jetbrains.kotlin.js.test.converters.FirJsKlibBackendFacade +import org.jetbrains.kotlin.js.test.handlers.JsBackendDiagnosticsHandler import org.jetbrains.kotlin.platform.js.JsPlatforms import org.jetbrains.kotlin.test.FirParser +import org.jetbrains.kotlin.test.TargetBackend +import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.firHandlersStep +import org.jetbrains.kotlin.test.builders.klibArtifactsHandlersStep import org.jetbrains.kotlin.test.directives.ConfigurationDirectives import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives import org.jetbrains.kotlin.test.directives.configureFirParser +import org.jetbrains.kotlin.test.frontend.fir.Fir2IrJsResultsConverter import org.jetbrains.kotlin.test.frontend.fir.FirFrontendFacade import org.jetbrains.kotlin.test.frontend.fir.handlers.* import org.jetbrains.kotlin.test.model.DependencyKind @@ -25,13 +31,16 @@ import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurato import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider abstract class AbstractFirJsDiagnosticTestBase(val parser: FirParser) : AbstractKotlinCompilerTest() { - override fun TestConfigurationBuilder.configuration() { + protected open fun configureTestBuilder(builder: TestConfigurationBuilder) = builder.apply { globalDefaults { frontend = FrontendKinds.FIR targetPlatform = JsPlatforms.defaultJsPlatform + targetBackend = TargetBackend.JS_IR dependencyKind = DependencyKind.Source } + useAfterAnalysisCheckers(::BlackBoxCodegenSuppressor) + defaultDirectives { +ConfigurationDirectives.WITH_STDLIB DiagnosticsDirectives.DIAGNOSTICS with listOf("-warnings", "-infos") @@ -67,6 +76,29 @@ abstract class AbstractFirJsDiagnosticTestBase(val parser: FirParser) : Abstract ) } } + + final override fun TestConfigurationBuilder.configuration() { + configureTestBuilder(this@configuration) + } +} + +abstract class AbstractFirJsDiagnosticWithBackendTestBase(parser: FirParser) : AbstractFirJsDiagnosticTestBase(parser) { + override fun configureTestBuilder(builder: TestConfigurationBuilder) = builder.apply { + super.configureTestBuilder(builder) + + facadeStep(::Fir2IrJsResultsConverter) + facadeStep { FirJsKlibBackendFacade(it, true) } + + // TODO: Currently do not run lowerings, because they don't report anything; + // see KT-61881, KT-61882 + // facadeStep { JsIrBackendFacade(it, firstTimeCompilation = true) } + + klibArtifactsHandlersStep { + useHandlers(::JsBackendDiagnosticsHandler) + } + } } abstract class AbstractFirPsiJsDiagnosticTest : AbstractFirJsDiagnosticTestBase(FirParser.Psi) + +abstract class AbstractFirPsiJsDiagnosticWithBackendTest : AbstractFirJsDiagnosticWithBackendTestBase(FirParser.Psi) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsBackendDiagnosticsHandler.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsBackendDiagnosticsHandler.kt new file mode 100644 index 00000000000..de35b6071a0 --- /dev/null +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsBackendDiagnosticsHandler.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.js.test.handlers + +import org.jetbrains.kotlin.test.backend.handlers.KlibArtifactHandler +import org.jetbrains.kotlin.test.backend.handlers.reportKtDiagnostics +import org.jetbrains.kotlin.test.model.BinaryArtifacts +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.* + +class JsBackendDiagnosticsHandler(testServices: TestServices) : KlibArtifactHandler(testServices) { + override fun processModule(module: TestModule, info: BinaryArtifacts.KLib) { + reportKtDiagnostics(module, info.reporter) + } + + override fun processAfterAllModules(someAssertionWasFailed: Boolean) {} +} diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractDiagnosticsTestWithJsStdLib.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractDiagnosticsTestWithJsStdLib.kt new file mode 100644 index 00000000000..de281dba9d9 --- /dev/null +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractDiagnosticsTestWithJsStdLib.kt @@ -0,0 +1,91 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.js.test.ir + +import org.jetbrains.kotlin.js.test.converters.JsIrBackendFacade +import org.jetbrains.kotlin.js.test.converters.JsKlibBackendFacade +import org.jetbrains.kotlin.js.test.handlers.JsBackendDiagnosticsHandler +import org.jetbrains.kotlin.platform.js.JsPlatforms +import org.jetbrains.kotlin.test.TargetBackend +import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor +import org.jetbrains.kotlin.test.builders.* +import org.jetbrains.kotlin.test.directives.ConfigurationDirectives +import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives +import org.jetbrains.kotlin.test.frontend.classic.handlers.ClassicDiagnosticsHandler +import org.jetbrains.kotlin.test.frontend.classic.handlers.DeclarationsDumpHandler +import org.jetbrains.kotlin.test.frontend.classic.handlers.DynamicCallsDumpHandler +import org.jetbrains.kotlin.test.frontend.classic.handlers.OldNewInferenceMetaInfoProcessor +import org.jetbrains.kotlin.test.model.DependencyKind +import org.jetbrains.kotlin.test.model.FrontendKinds +import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest +import org.jetbrains.kotlin.test.services.LibraryProvider +import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator +import org.jetbrains.kotlin.test.services.sourceProviders.AdditionalDiagnosticsSourceFilesProvider +import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider +import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator + +abstract class AbstractDiagnosticsTestWithJsStdLib : AbstractKotlinCompilerTest() { + protected open fun configureTestBuilder(builder: TestConfigurationBuilder) = builder.apply { + globalDefaults { + frontend = FrontendKinds.ClassicFrontend + targetPlatform = JsPlatforms.defaultJsPlatform + targetBackend = TargetBackend.JS_IR + dependencyKind = DependencyKind.Source + } + + useAfterAnalysisCheckers(::BlackBoxCodegenSuppressor) + + defaultDirectives { + +ConfigurationDirectives.WITH_STDLIB + +JvmEnvironmentConfigurationDirectives.USE_PSI_CLASS_FILES_READING + } + + useAdditionalService(::LibraryProvider) + + enableMetaInfoHandler() + + useConfigurators( + ::CommonEnvironmentConfigurator, + ::JsEnvironmentConfigurator, + ) + + useMetaInfoProcessors(::OldNewInferenceMetaInfoProcessor) + useAdditionalSourceProviders( + ::AdditionalDiagnosticsSourceFilesProvider, + ::CoroutineHelpersSourceFilesProvider, + ) + + classicFrontendStep() + classicFrontendHandlersStep { + useHandlers( + ::DeclarationsDumpHandler, + ::ClassicDiagnosticsHandler, + ::DynamicCallsDumpHandler, + ) + } + } + + final override fun TestConfigurationBuilder.configuration() { + configureTestBuilder(this@configuration) + } +} + +abstract class AbstractDiagnosticsTestWithJsStdLibWithBackend : AbstractDiagnosticsTestWithJsStdLib() { + override fun configureTestBuilder(builder: TestConfigurationBuilder) = builder.apply { + super.configureTestBuilder(builder) + + psi2IrStep() + facadeStep { JsKlibBackendFacade(it, true) } + + // TODO: Currently do not run lowerings, because they don't report anything; + // see KT-61881, KT-61882 + // facadeStep { JsIrBackendFacade(it, firstTimeCompilation = true) } + + klibArtifactsHandlersStep { + useHandlers(::JsBackendDiagnosticsHandler) + } + } +} diff --git a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/FirWasmKlibBackendFacade.kt b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/FirWasmKlibBackendFacade.kt index 03b11805712..5a9cf9351ce 100644 --- a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/FirWasmKlibBackendFacade.kt +++ b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/FirWasmKlibBackendFacade.kt @@ -99,6 +99,6 @@ class FirWasmKlibBackendFacade( testServices.moduleDescriptorProvider.replaceModuleDescriptorForModule(module, moduleDescriptor) testServices.libraryProvider.setDescriptorAndLibraryByName(outputFile, moduleDescriptor, lib) - return BinaryArtifacts.KLib(File(outputFile)) + return BinaryArtifacts.KLib(File(outputFile), inputArtifact.diagnosticReporter) } }