From 2179f97006616e4bf075e8586fc449414807abeb Mon Sep 17 00:00:00 2001 From: Ivan Cilcic Date: Wed, 28 Aug 2019 15:30:12 +0300 Subject: [PATCH] Create fir visualizer abstract test class and extract common code with psi tests --- .../kotlin/visualizer/AbstractVisualizer.kt | 49 +++++++++++++++ .../visualizer/fir/AbstractFirVisualizer.kt | 60 +++++++++++++++++++ .../visualizer/psi/AbstractPsiVisualizer.kt | 35 ++--------- 3 files changed, 113 insertions(+), 31 deletions(-) create mode 100644 compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt create mode 100644 compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt diff --git a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt new file mode 100644 index 00000000000..10dedaeab32 --- /dev/null +++ b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2019 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.visualizer + +import org.jetbrains.kotlin.checkers.KotlinMultiFileTestWithJava +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.test.ConfigurationKind +import org.jetbrains.kotlin.test.TestJdkKind +import java.io.File + +abstract class AbstractVisualizer : KotlinMultiFileTestWithJava() { + lateinit var replacement: Pair + + override fun createTestModule(name: String): Void? = null + + override fun createTestFile(module: Void?, fileName: String?, text: String?, directives: MutableMap?): Void? = null + + override fun doMultiFileTest(file: File, modules: MutableMap?, files: MutableList) { + val environment = createEnvironment(file) + doVisualizerTest(file, environment) + } + + abstract fun doVisualizerTest(file: File, environment: KotlinCoreEnvironment) + + override fun isKotlinSourceRootNeeded(): Boolean { + return true + } + + override fun getTestJdkKind(file: File): TestJdkKind { + return TestJdkKind.FULL_JDK + } + + override fun getConfigurationKind(): ConfigurationKind { + return ConfigurationKind.ALL + } + + fun doFirBuilderDataTest(filePath: String) { + replacement = "fir\\psi2fir" to "visualizer" + doTest(filePath) + } + + fun doUncommonCasesTest(filePath: String) { + replacement = "testFiles" to "resultFiles" + doTest(filePath) + } +} \ No newline at end of file diff --git a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt new file mode 100644 index 00000000000..a561ff221f3 --- /dev/null +++ b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2010-2019 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.visualizer.fir + +import com.intellij.openapi.extensions.Extensions +import com.intellij.psi.PsiElementFinder +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.asJava.finder.JavaElementFinder +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM +import org.jetbrains.kotlin.compiler.visualizer.FirVisualizer +import org.jetbrains.kotlin.fir.builder.RawFirBuilder +import org.jetbrains.kotlin.fir.createSession +import org.jetbrains.kotlin.fir.render +import org.jetbrains.kotlin.fir.resolve.FirProvider +import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl +import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveTransformer +import org.jetbrains.kotlin.fir.service +import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.kotlin.visualizer.AbstractVisualizer +import java.io.File + +abstract class AbstractFirVisualizer : AbstractVisualizer() { + override fun doVisualizerTest(file: File, environment: KotlinCoreEnvironment) { + Extensions.getArea(environment.project) + .getExtensionPoint(PsiElementFinder.EP_NAME) + .unregisterExtension(JavaElementFinder::class.java) + + val ktFiles = environment.getSourceFiles() + val scope = GlobalSearchScope.filesScope(environment.project, ktFiles.mapNotNull { it.virtualFile }) + .uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(environment.project)) + val session = createSession(environment, scope) + + val builder = RawFirBuilder(session, stubMode = false) + + val transformer = FirTotalResolveTransformer() + val firFiles = ktFiles.map { + val firFile = builder.buildFirFile(it) + (session.service() as FirProviderImpl).recordFile(firFile) + firFile + }.also { + try { + transformer.processFiles(it) + } catch (e: Exception) { + it.forEach { println(it.render()) } + throw e + } + } + + //compare + val renderer = FirVisualizer(firFiles.first()) + val psiRenderResult = renderer.render() + + val expectedPath = file.absolutePath.replace(replacement.first, replacement.second) + KotlinTestUtils.assertEqualsToFile(File(expectedPath), psiRenderResult) + } +} diff --git a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/AbstractPsiVisualizer.kt b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/AbstractPsiVisualizer.kt index 9786d4b575f..828695a911d 100644 --- a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/AbstractPsiVisualizer.kt +++ b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/AbstractPsiVisualizer.kt @@ -6,22 +6,17 @@ package org.jetbrains.kotlin.visualizer.psi import org.jetbrains.kotlin.checkers.KotlinMultiFileTestWithJava +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.compiler.visualizer.PsiRenderer import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil import org.jetbrains.kotlin.test.ConfigurationKind import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.TestJdkKind +import org.jetbrains.kotlin.visualizer.AbstractVisualizer import java.io.File -abstract class AbstractPsiVisualizer: KotlinMultiFileTestWithJava() { - lateinit var replacement: Pair - - override fun createTestModule(name: String): Void? = null - - override fun createTestFile(module: Void?, fileName: String?, text: String?, directives: MutableMap?): Void? = null - - override fun doMultiFileTest(file: File, modules: MutableMap?, files: MutableList) { - val environment = createEnvironment(file) +abstract class AbstractPsiVisualizer : AbstractVisualizer() { + override fun doVisualizerTest(file: File, environment: KotlinCoreEnvironment) { val ktFiles = environment.getSourceFiles() val analysisResult = JvmResolveUtil.analyze(ktFiles, environment) @@ -31,26 +26,4 @@ abstract class AbstractPsiVisualizer: KotlinMultiFileTestWithJava( val expectedPath = file.absolutePath.replace(replacement.first, replacement.second) KotlinTestUtils.assertEqualsToFile(File(expectedPath), psiRenderResult) } - - override fun isKotlinSourceRootNeeded(): Boolean { - return true - } - - override fun getTestJdkKind(file: File): TestJdkKind { - return TestJdkKind.FULL_JDK - } - - override fun getConfigurationKind(): ConfigurationKind { - return ConfigurationKind.ALL - } - - fun doFirBuilderDataTest(filePath: String) { - replacement = "fir\\psi2fir" to "visualizer" - doTest(filePath) - } - - fun doUncommonCasesTest(filePath: String) { - replacement = "testFiles" to "resultFiles" - doTest(filePath) - } }