From 5873511f647d50a15dcd5025f5639c48a4f7563a Mon Sep 17 00:00:00 2001 From: pyos Date: Thu, 29 Jul 2021 15:56:03 +0200 Subject: [PATCH] Generalize AbstractForeignAnnotationsTestBase to FIR --- .../handlers/FirTestDataConsistencyHandler.kt | 43 ++++--------- .../AbstractFirForeignAnnotationsTest.kt | 56 +++++++++++++++++ .../runners/AbstractForeignAnnotationsTest.kt | 61 ++++++++++++------- 3 files changed, 107 insertions(+), 53 deletions(-) create mode 100644 compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractFirForeignAnnotationsTest.kt diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/handlers/FirTestDataConsistencyHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/handlers/FirTestDataConsistencyHandler.kt index de90a119cdf..08ddc3a2259 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/handlers/FirTestDataConsistencyHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/handlers/FirTestDataConsistencyHandler.kt @@ -5,16 +5,14 @@ package org.jetbrains.kotlin.test.frontend.classic.handlers -import org.jetbrains.kotlin.codeMetaInfo.clearTextFromDiagnosticMarkup import org.jetbrains.kotlin.test.WrappedException import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives import org.jetbrains.kotlin.test.directives.model.DirectivesContainer +import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives import org.jetbrains.kotlin.test.model.AfterAnalysisChecker -import org.jetbrains.kotlin.test.runners.AbstractFirDiagnosticTest -import org.jetbrains.kotlin.test.services.TestServices -import org.jetbrains.kotlin.test.services.assertions -import org.jetbrains.kotlin.test.services.moduleStructure -import org.jetbrains.kotlin.test.services.testInfo +import org.jetbrains.kotlin.test.model.TestFile +import org.jetbrains.kotlin.test.services.* +import org.jetbrains.kotlin.test.util.convertLineSeparators import org.jetbrains.kotlin.test.utils.firTestDataFile import java.io.File @@ -28,32 +26,17 @@ class FirTestDataConsistencyHandler(testServices: TestServices) : AfterAnalysisC if (testData.extension == "kts") return if (FirDiagnosticsDirectives.FIR_IDENTICAL in moduleStructure.allDirectives) return val firTestData = testData.firTestDataFile - if (!firTestData.exists()) { - runFirTestAndGeneratedTestData(testData, firTestData) - return + testServices.assertions.assertTrue(firTestData.exists()) { + "FIR test data does not exist; run the corresponding FIR test to generate it" } - var originalFileContent = clearTextFromDiagnosticMarkup(testData.readText()).trim() - var firFileContent = clearTextFromDiagnosticMarkup(firTestData.readText()).trim() - if (System.lineSeparator() != "\n") { - originalFileContent = originalFileContent.replace("\r\n", "\n") - firFileContent = firFileContent.replace("\r\n", "\n") - } - if (originalFileContent != firFileContent) { - testServices.assertions.assertEqualsToFile( - firTestData, - originalFileContent, - message = { - "Original and fir test data aren't identical. " + - "Please, add changes from ${testData.name} to ${firTestData.name}" - } - ) + testServices.assertions.assertEquals(firTestData.preprocessSource(), testData.preprocessSource()) { + "Original and fir test data aren't identical. " + + "Please, add changes from ${testData.name} to ${firTestData.name}" } } - private fun runFirTestAndGeneratedTestData(testData: File, firTestData: File) { - firTestData.writeText(clearTextFromDiagnosticMarkup(testData.readText())) - val test = object : AbstractFirDiagnosticTest() {} - test.initTestInfo(testServices.testInfo.copy(className = "${testServices.testInfo.className}_fir_anonymous")) - test.runTest(firTestData.absolutePath) - } + private fun File.preprocessSource(): String = + testServices.sourceFileProvider.getContentOfSourceFile( + TestFile(path, readText().trim().convertLineSeparators(), this, 0, isAdditional = false, RegisteredDirectives.Empty) + ) } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractFirForeignAnnotationsTest.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractFirForeignAnnotationsTest.kt new file mode 100644 index 00000000000..d55fc9eceb9 --- /dev/null +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractFirForeignAnnotationsTest.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2010-2021 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.test.runners + +import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder +import org.jetbrains.kotlin.test.builders.firFrontendStep +import org.jetbrains.kotlin.test.builders.firHandlersStep +import org.jetbrains.kotlin.test.frontend.fir.FirFailingTestSuppressor +import org.jetbrains.kotlin.test.frontend.fir.handlers.* +import org.jetbrains.kotlin.test.model.FrontendKinds +import org.jetbrains.kotlin.test.preprocessors.JspecifyMarksCleanupPreprocessor +import org.jetbrains.kotlin.test.services.fir.FirOldFrontendMetaConfigurator + +private val configureFir: TestConfigurationBuilder.() -> Unit = { + globalDefaults { + frontend = FrontendKinds.FIR + } + + useMetaInfoProcessors(::PsiLightTreeMetaInfoProcessor) + firFrontendStep() + firHandlersStep { + useHandlers( + ::FirDiagnosticsHandler, + ::FirDumpHandler, + ::FirCfgDumpHandler, + ::FirCfgConsistencyHandler, + ::FirNoImplicitTypesHandler, + ) + } + + forTestsMatching("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/*") { + // TODO: port JspecifyDiagnosticComplianceHandler (it doesn't really use the frontend artifact) + useSourcePreprocessor(::JspecifyMarksCleanupPreprocessor) + } + + forTestsMatching("compiler/testData/diagnostics/*") { + useAfterAnalysisCheckers( + ::FirIdenticalChecker, + ::FirFailingTestSuppressor, + ) + useMetaTestConfigurators(::FirOldFrontendMetaConfigurator) + } +} + +abstract class AbstractFirForeignAnnotationsTestBase : AbstractForeignAnnotationsTestBase(configureFir) + +abstract class AbstractFirForeignAnnotationsSourceJavaTest : AbstractFirForeignAnnotationsTestBase() + +abstract class AbstractFirForeignAnnotationsCompiledJavaTest : + AbstractForeignAnnotationsCompiledJavaTest(configureFir) + +abstract class AbstractFirForeignAnnotationsCompiledJavaWithPsiClassReadingTest : + AbstractForeignAnnotationsCompiledJavaWithPsiClassReadingTest(configureFir) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractForeignAnnotationsTest.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractForeignAnnotationsTest.kt index b121b079c95..e2bb43e37e2 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractForeignAnnotationsTest.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractForeignAnnotationsTest.kt @@ -22,10 +22,7 @@ import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirective import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.WITH_FOREIGN_ANNOTATIONS import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.WITH_JSR305_TEST_ANNOTATIONS import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade -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.JspecifyDiagnosticComplianceHandler -import org.jetbrains.kotlin.test.frontend.classic.handlers.OldNewInferenceMetaInfoProcessor +import org.jetbrains.kotlin.test.frontend.classic.handlers.* import org.jetbrains.kotlin.test.model.DependencyKind import org.jetbrains.kotlin.test.model.FrontendKinds import org.jetbrains.kotlin.test.preprocessors.JspecifyMarksCleanupPreprocessor @@ -35,10 +32,36 @@ import org.jetbrains.kotlin.test.services.jvm.PsiClassFilesReadingForCompiledJav import org.jetbrains.kotlin.test.services.sourceProviders.AdditionalDiagnosticsSourceFilesProvider import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider -abstract class AbstractForeignAnnotationsTestBase : AbstractKotlinCompilerTest() { +private val configureClassicFrontend: TestConfigurationBuilder.() -> Unit = { + globalDefaults { + frontend = FrontendKinds.ClassicFrontend + } + + useMetaInfoProcessors(::OldNewInferenceMetaInfoProcessor) + classicFrontendStep() + classicFrontendHandlersStep { + useHandlers( + ::DeclarationsDumpHandler, + ::ClassicDiagnosticsHandler, + ) + } + + forTestsMatching("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/*") { + configureClassicFrontendHandlersStep { + useHandlers(::JspecifyDiagnosticComplianceHandler) + } + useSourcePreprocessor(::JspecifyMarksCleanupPreprocessor) + } + + useAfterAnalysisCheckers(::FirTestDataConsistencyHandler) +} + +abstract class AbstractForeignAnnotationsTestBase( + private val configureFrontend: TestConfigurationBuilder.() -> Unit = configureClassicFrontend +) : AbstractKotlinCompilerTest() { + override fun TestConfigurationBuilder.configuration() { globalDefaults { - frontend = FrontendKinds.ClassicFrontend targetPlatform = JvmPlatforms.defaultJvmPlatform dependencyKind = DependencyKind.Source } @@ -56,19 +79,12 @@ abstract class AbstractForeignAnnotationsTestBase : AbstractKotlinCompilerTest() ::JvmEnvironmentConfigurator ) - useMetaInfoProcessors(::OldNewInferenceMetaInfoProcessor) useAdditionalSourceProviders( ::AdditionalDiagnosticsSourceFilesProvider, ::CoroutineHelpersSourceFilesProvider, ) - classicFrontendStep() - classicFrontendHandlersStep { - useHandlers( - ::DeclarationsDumpHandler, - ::ClassicDiagnosticsHandler, - ) - } + configureFrontend() forTestsMatching("compiler/testData/diagnostics/foreignAnnotationsTests/tests/*") { defaultDirectives { @@ -90,19 +106,15 @@ abstract class AbstractForeignAnnotationsTestBase : AbstractKotlinCompilerTest() COMPILE_JAVA_USING with TestJavacVersion.JAVAC_9 } } - - forTestsMatching("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/*") { - configureClassicFrontendHandlersStep { - useHandlers(::JspecifyDiagnosticComplianceHandler) - } - useSourcePreprocessor(::JspecifyMarksCleanupPreprocessor) - } } } abstract class AbstractForeignAnnotationsSourceJavaTest : AbstractForeignAnnotationsTestBase() -abstract class AbstractForeignAnnotationsCompiledJavaTest : AbstractForeignAnnotationsTestBase() { +abstract class AbstractForeignAnnotationsCompiledJavaTest : AbstractForeignAnnotationsTestBase { + constructor() : super() + constructor(configureFrontend: TestConfigurationBuilder.() -> Unit) : super(configureFrontend) + override fun configure(builder: TestConfigurationBuilder) { super.configure(builder) with(builder) { @@ -116,7 +128,10 @@ abstract class AbstractForeignAnnotationsCompiledJavaTest : AbstractForeignAnnot } } -abstract class AbstractForeignAnnotationsCompiledJavaWithPsiClassReadingTest : AbstractForeignAnnotationsCompiledJavaTest() { +abstract class AbstractForeignAnnotationsCompiledJavaWithPsiClassReadingTest : AbstractForeignAnnotationsCompiledJavaTest { + constructor() : super() + constructor(configureFrontend: TestConfigurationBuilder.() -> Unit) : super(configureFrontend) + override fun configure(builder: TestConfigurationBuilder) { super.configure(builder) with(builder) {