Create fir visualizer abstract test class and extract common code with psi tests

This commit is contained in:
Ivan Cilcic
2019-08-28 15:30:12 +03:00
committed by Mikhail Glukhikh
parent fe328f8c7a
commit 2179f97006
3 changed files with 113 additions and 31 deletions
@@ -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<Void?, Void?>() {
lateinit var replacement: Pair<String, String>
override fun createTestModule(name: String): Void? = null
override fun createTestFile(module: Void?, fileName: String?, text: String?, directives: MutableMap<String, String>?): Void? = null
override fun doMultiFileTest(file: File, modules: MutableMap<String, ModuleAndDependencies>?, files: MutableList<Void?>) {
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)
}
}
@@ -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<FirProvider>() 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)
}
}
@@ -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<Void?, Void?>() {
lateinit var replacement: Pair<String, String>
override fun createTestModule(name: String): Void? = null
override fun createTestFile(module: Void?, fileName: String?, text: String?, directives: MutableMap<String, String>?): Void? = null
override fun doMultiFileTest(file: File, modules: MutableMap<String, ModuleAndDependencies>?, files: MutableList<Void?>) {
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<Void?, Void?>(
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)
}
}