Use different transformers per module in FIR diagnostics tests

Before this commit, we used same transformers for all modules,
which provoked using same ScopeSession for all modules.
Now we re-create transformers for any new module.
This fixes some problems with incorrect caching in ScopeSession.

NB: this provokes ambiguities in some old FE tests,
mostly they're correct (same as old FE).
This commit is contained in:
Mikhail Glukhikh
2019-12-19 16:24:45 +03:00
parent c4e6f8a640
commit fe8d68ecc7
7 changed files with 32 additions and 26 deletions
@@ -84,7 +84,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
FirJavaModuleBasedSession(info, sessionProvider, scope) FirJavaModuleBasedSession(info, sessionProvider, scope)
} }
val firFiles = mutableListOf<FirFile>() val firFilesPerSession = mutableMapOf<FirSession, List<FirFile>>()
// TODO: make module/session/transformer handling like in AbstractFirMultiModuleTest (IDE) // TODO: make module/session/transformer handling like in AbstractFirMultiModuleTest (IDE)
for ((testModule, testFilesInModule) in groupedByModule) { for ((testModule, testFilesInModule) in groupedByModule) {
@@ -92,10 +92,12 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
val session = configToSession.getValue(testModule) val session = configToSession.getValue(testModule)
val firFiles = mutableListOf<FirFile>()
mapKtFilesToFirFiles(session, ktFiles, firFiles, useLightTree) mapKtFilesToFirFiles(session, ktFiles, firFiles, useLightTree)
firFilesPerSession[session] = firFiles
} }
runAnalysis(testDataFile, files, firFiles) runAnalysis(testDataFile, files, firFilesPerSession)
} }
private fun mapKtFilesToFirFiles(session: FirSession, ktFiles: List<KtFile>, firFiles: MutableList<FirFile>, useLightTree: Boolean) { private fun mapKtFilesToFirFiles(session: FirSession, ktFiles: List<KtFile>, firFiles: MutableList<FirFile>, useLightTree: Boolean) {
@@ -116,7 +118,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
} }
} }
protected abstract fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFiles: List<FirFile>) protected abstract fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFilesPerSession: Map<FirSession, List<FirFile>>)
private fun createModules( private fun createModules(
groupedByModule: Map<TestModule?, List<TestFile>> groupedByModule: Map<TestModule?, List<TestFile>>
@@ -8,22 +8,22 @@ package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.AbstractDiagnosticCollector import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.AbstractDiagnosticCollector
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.FirDiagnosticsCollector import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.FirDiagnosticsCollector
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.ParallelDiagnosticsCollector
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.registerAllComponents
import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveTransformer
import org.jetbrains.kotlin.test.ConfigurationKind
import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils
import java.io.File import java.io.File
abstract class AbstractFirDiagnosticsTest : AbstractFirBaseDiagnosticsTest() { abstract class AbstractFirDiagnosticsTest : AbstractFirBaseDiagnosticsTest() {
override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFiles: List<FirFile>) { override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFilesPerSession: Map<FirSession, List<FirFile>>) {
doFirResolveTestBench( for ((_, firFiles) in firFilesPerSession) {
firFiles, doFirResolveTestBench(
FirTotalResolveTransformer().transformers, firFiles,
gc = false FirTotalResolveTransformer().transformers,
) gc = false
checkDiagnostics(testDataFile, testFiles, firFiles) )
checkFir(testDataFile, firFiles) }
val allFirFiles = firFilesPerSession.values.flatten()
checkDiagnostics(testDataFile, testFiles, allFirFiles)
checkFir(testDataFile, allFirFiles)
} }
fun checkFir(testDataFile: File, firFiles: List<FirFile>) { fun checkFir(testDataFile: File, firFiles: List<FirFile>) {
@@ -39,9 +39,10 @@ abstract class AbstractFirDiagnosticsWithCfgTest : AbstractFirDiagnosticsTest()
return ConfigurationKind.ALL return ConfigurationKind.ALL
} }
override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFiles: List<FirFile>) { override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFilesPerSession: Map<FirSession, List<FirFile>>) {
super.runAnalysis(testDataFile, testFiles, firFiles) super.runAnalysis(testDataFile, testFiles, firFilesPerSession)
checkCfg(testDataFile, firFiles) val allFirFiles = firFilesPerSession.values.flatten()
checkCfg(testDataFile, allFirFiles)
} }
fun checkCfg(testDataFile: File, firFiles: List<FirFile>) { fun checkCfg(testDataFile: File, firFiles: List<FirFile>) {
@@ -24,21 +24,24 @@ abstract class AbstractFirOldFrontendDiagnosticsTest : AbstractFirDiagnosticsTes
} }
} }
override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFiles: List<FirFile>) { override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFilesPerSession: Map<FirSession, List<FirFile>>) {
val failure: AssertionError? = try { val failure: AssertionError? = try {
doFirResolveTestBench(firFiles, FirTotalResolveTransformer().transformers, gc = false) for ((_, firFiles) in firFilesPerSession) {
doFirResolveTestBench(firFiles, FirTotalResolveTransformer().transformers, gc = false)
}
null null
} catch (e: AssertionError) { } catch (e: AssertionError) {
e e
} }
val failureFile = File(testDataFile.path.replace(".kt", ".fail")) val failureFile = File(testDataFile.path.replace(".kt", ".fail"))
if (failure == null) { if (failure == null) {
checkResultingFirFiles(firFiles, testDataFile) val allFirFiles = firFilesPerSession.values.flatten()
checkResultingFirFiles(allFirFiles, testDataFile)
assertFalse("Test is good but there is expected exception", failureFile.exists()) assertFalse("Test is good but there is expected exception", failureFile.exists())
checkDiagnostics(testDataFile, testFiles, firFiles) checkDiagnostics(testDataFile, testFiles, allFirFiles)
val needDump = testFiles.any { it.directives.containsKey("FIR_DUMP") } val needDump = testFiles.any { it.directives.containsKey("FIR_DUMP") }
if (needDump) { if (needDump) {
checkFir(testDataFile, firFiles) checkFir(testDataFile, allFirFiles)
} }
} else { } else {
if (!failureFile.exists()) { if (!failureFile.exists()) {
@@ -29,6 +29,6 @@ import p.*
fun <Y, Z> test(b: B<Y, Z>?) { fun <Y, Z> test(b: B<Y, Z>?) {
if (b is C<Y, Z>) { if (b is C<Y, Z>) {
b?.foo(null) b?.<!AMBIGUITY!>foo<!>(null)
} }
} }
@@ -30,8 +30,8 @@ import p.*
fun test(b: B?, c: C) { fun test(b: B?, c: C) {
b?.foo(1, 1) b?.foo(1, 1)
c.foo(1, 1) c.<!AMBIGUITY!>foo<!>(1, 1)
if (b is C) { if (b is C) {
b?.foo(1, 1) b?.<!AMBIGUITY!>foo<!>(1, 1)
} }
} }
@@ -38,6 +38,6 @@ import p.*
fun test(b: B?) { fun test(b: B?) {
if (b is C) { if (b is C) {
b?.foo(null, null) b?.<!AMBIGUITY!>foo<!>(null, null)
} }
} }