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:
+5
-3
@@ -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>) {
|
||||||
|
|||||||
+4
-3
@@ -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>) {
|
||||||
|
|||||||
+8
-5
@@ -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()) {
|
||||||
|
|||||||
+1
-1
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-2
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Vendored
+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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user