diff --git a/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.kt b/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.kt new file mode 100644 index 00000000000..6a2eea8d006 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.kt @@ -0,0 +1,9 @@ +inline fun inlineFun1(p: () -> Unit) { + p() + inlineFun2(p) +} + +inline fun inlineFun2(p: () -> Unit) { + p() + inlineFun1(p) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.txt b/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.txt new file mode 100644 index 00000000000..66a2506dc5e --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.txt @@ -0,0 +1,4 @@ +package + +public inline fun inlineFun1(/*0*/ p: () -> kotlin.Unit): kotlin.Unit +public inline fun inlineFun2(/*0*/ p: () -> kotlin.Unit): kotlin.Unit diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJvmBackend.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJvmBackend.kt new file mode 100644 index 00000000000..ff4334495de --- /dev/null +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTestWithJvmBackend.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2010-2020 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 org.jetbrains.kotlin.analyzer.AnalysisResult +import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig +import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory +import org.jetbrains.kotlin.backend.jvm.jvmPhases +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.codegen.ClassBuilderFactories +import org.jetbrains.kotlin.codegen.DefaultCodegenFactory +import org.jetbrains.kotlin.codegen.KotlinCodegenFacade +import org.jetbrains.kotlin.codegen.state.GenerationState +import org.jetbrains.kotlin.config.JvmTarget +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.context.ModuleContext +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.resolve.BindingTrace + +abstract class AbstractDiagnosticsTestWithJvmBackend : AbstractDiagnosticsTest() { + + override fun analyzeModuleContents( + moduleContext: ModuleContext, + files: List, + moduleTrace: BindingTrace, + languageVersionSettings: LanguageVersionSettings, + separateModules: Boolean, + jvmTarget: JvmTarget + ): AnalysisResult { + val analysisResult = + super.analyzeModuleContents( + moduleContext, files, moduleTrace, languageVersionSettings, separateModules, jvmTarget + ) + + val generationState = + GenerationState.Builder( + project, ClassBuilderFactories.TEST, analysisResult.moduleDescriptor, analysisResult.bindingContext, + files, environment.configuration + ).setupGenerationState().build() + + KotlinCodegenFacade.compileCorrectFiles(generationState) + + for (diagnostic in generationState.collectedExtraJvmDiagnostics.all()) { + moduleTrace.report(diagnostic) + } + return analysisResult + } + + protected abstract fun GenerationState.Builder.setupGenerationState(): GenerationState.Builder +} + +abstract class AbstractDiagnosticsTestWithOldJvmBackend : AbstractDiagnosticsTestWithJvmBackend() { + + override fun GenerationState.Builder.setupGenerationState(): GenerationState.Builder = + codegenFactory(DefaultCodegenFactory).isIrBackend(false) +} + +abstract class AbstractDiagnosticsTestWithJvmIrBackend : AbstractDiagnosticsTestWithJvmBackend() { + + override fun GenerationState.Builder.setupGenerationState(): GenerationState.Builder = + codegenFactory( + JvmIrCodegenFactory( + environment.configuration.get(CLIConfigurationKeys.PHASE_CONFIG) + ?: PhaseConfig(jvmPhases) + ) + ).isIrBackend(true) +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJvmIrBackendGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJvmIrBackendGenerated.java new file mode 100644 index 00000000000..824b16c02c6 --- /dev/null +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJvmIrBackendGenerated.java @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2020 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.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/diagnostics/testsWithJvmBackend") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class DiagnosticsTestWithJvmIrBackendGenerated extends AbstractDiagnosticsTestWithJvmIrBackend { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInTestsWithJvmBackend() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJvmBackend"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @TestMetadata("inlineCycle.kt") + public void testInlineCycle() throws Exception { + runTest("compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.kt"); + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithOldJvmBackendGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithOldJvmBackendGenerated.java new file mode 100644 index 00000000000..08e9c3db78f --- /dev/null +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithOldJvmBackendGenerated.java @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2020 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.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/diagnostics/testsWithJvmBackend") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class DiagnosticsTestWithOldJvmBackendGenerated extends AbstractDiagnosticsTestWithOldJvmBackend { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInTestsWithJvmBackend() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJvmBackend"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @TestMetadata("inlineCycle.kt") + public void testInlineCycle() throws Exception { + runTest("compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.kt"); + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateCompilerTests.kt b/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateCompilerTests.kt index b6e68270084..b04f593062d 100644 --- a/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateCompilerTests.kt +++ b/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateCompilerTests.kt @@ -126,6 +126,14 @@ fun main(args: Array) { model("diagnostics/testsWithExplicitApi") } + testClass { + model("diagnostics/testsWithJvmBackend") + } + + testClass { + model("diagnostics/testsWithJvmBackend") + } + testClass { model("multiplatform", extension = null, recursive = true, excludeParentDirs = true) }