[TEST] Migrate AbstractFirDiagnosticsWithLightTreeTest to new test runners
Also this commit adds AbstractTwoAttributesMetaInfoProcessor which can be used for reporting diagnostics with two attributes (OI/NI, PSI/Light tree)
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.test.model
|
package org.jetbrains.kotlin.test.model
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
|
||||||
import org.jetbrains.kotlin.test.services.ServiceRegistrationData
|
import org.jetbrains.kotlin.test.services.ServiceRegistrationData
|
||||||
import org.jetbrains.kotlin.test.services.TestServices
|
import org.jetbrains.kotlin.test.services.TestServices
|
||||||
|
|
||||||
@@ -16,6 +17,9 @@ abstract class AbstractTestFacade<I : ResultingArtifact<I>, O : ResultingArtifac
|
|||||||
|
|
||||||
open val additionalServices: List<ServiceRegistrationData>
|
open val additionalServices: List<ServiceRegistrationData>
|
||||||
get() = emptyList()
|
get() = emptyList()
|
||||||
|
|
||||||
|
open val additionalDirectives: List<DirectivesContainer>
|
||||||
|
get() = emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class FrontendFacade<R : ResultingArtifact.FrontendOutput<R>>(
|
abstract class FrontendFacade<R : ResultingArtifact.FrontendOutput<R>>(
|
||||||
|
|||||||
+563
-238
File diff suppressed because it is too large
Load Diff
+11
@@ -24,4 +24,15 @@ object FirDiagnosticsDirectives : SimpleDirectivesContainer() {
|
|||||||
val FIR_IDENTICAL by directive(
|
val FIR_IDENTICAL by directive(
|
||||||
description = "Contents of fir test data file and FE 1.0 are identical"
|
description = "Contents of fir test data file and FE 1.0 are identical"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val USE_LIGHT_TREE by directive(
|
||||||
|
description = "Enables light tree parser instead of PSI"
|
||||||
|
)
|
||||||
|
|
||||||
|
val COMPARE_WITH_LIGHT_TREE by directive(
|
||||||
|
description = """
|
||||||
|
Enable comparing diagnostics between PSI and light tree modes
|
||||||
|
For enabling light tree mode use $USE_LIGHT_TREE directive
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-55
@@ -6,9 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.test.frontend.classic.handlers
|
package org.jetbrains.kotlin.test.frontend.classic.handlers
|
||||||
|
|
||||||
import org.jetbrains.kotlin.checkers.utils.DiagnosticsRenderingConfiguration
|
import org.jetbrains.kotlin.checkers.utils.DiagnosticsRenderingConfiguration
|
||||||
import org.jetbrains.kotlin.codeMetaInfo.model.CodeMetaInfo
|
|
||||||
import org.jetbrains.kotlin.codeMetaInfo.model.DiagnosticCodeMetaInfo
|
import org.jetbrains.kotlin.codeMetaInfo.model.DiagnosticCodeMetaInfo
|
||||||
import org.jetbrains.kotlin.codeMetaInfo.model.ParsedCodeMetaInfo
|
|
||||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
@@ -20,6 +18,7 @@ import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives
|
|||||||
import org.jetbrains.kotlin.test.model.TestFile
|
import org.jetbrains.kotlin.test.model.TestFile
|
||||||
import org.jetbrains.kotlin.test.model.TestModule
|
import org.jetbrains.kotlin.test.model.TestModule
|
||||||
import org.jetbrains.kotlin.test.services.*
|
import org.jetbrains.kotlin.test.services.*
|
||||||
|
import org.jetbrains.kotlin.test.utils.AbstractTwoAttributesMetaInfoProcessor
|
||||||
|
|
||||||
class ClassicDiagnosticReporter(private val testServices: TestServices) {
|
class ClassicDiagnosticReporter(private val testServices: TestServices) {
|
||||||
private val globalMetadataInfoHandler: GlobalMetadataInfoHandler
|
private val globalMetadataInfoHandler: GlobalMetadataInfoHandler
|
||||||
@@ -81,66 +80,21 @@ class ClassicDiagnosticReporter(private val testServices: TestServices) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class OldNewInferenceMetaInfoProcessor(testServices: TestServices) : AdditionalMetaInfoProcessor(testServices) {
|
class OldNewInferenceMetaInfoProcessor(testServices: TestServices) : AbstractTwoAttributesMetaInfoProcessor(testServices) {
|
||||||
companion object {
|
companion object {
|
||||||
const val OI = "OI"
|
const val OI = "OI"
|
||||||
const val NI = "NI"
|
const val NI = "NI"
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun processMetaInfos(module: TestModule, file: TestFile) {
|
override val firstAttribute: String get() = NI
|
||||||
/*
|
override val secondAttribute: String get() = OI
|
||||||
* Rules for OI/NI attribute:
|
|
||||||
* ┌──────────┬──────┬──────┬──────────┐
|
|
||||||
* │ │ OI │ NI │ nothing │ <- reported
|
|
||||||
* ├──────────┼──────┼──────┼──────────┤
|
|
||||||
* │ nothing │ both │ both │ nothing │
|
|
||||||
* │ OI │ OI │ both │ OI │
|
|
||||||
* │ NI │ both │ NI │ NI │
|
|
||||||
* │ both │ both │ both │ opposite │ <- OI if NI enabled in test and vice versa
|
|
||||||
* └──────────┴──────┴──────┴──────────┘
|
|
||||||
* ^ existed
|
|
||||||
*/
|
|
||||||
if (!testServices.withNewInferenceModeEnabled()) return
|
|
||||||
val newInferenceEnabled = module.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
|
|
||||||
val (currentFlag, otherFlag) = when (newInferenceEnabled) {
|
|
||||||
true -> NI to OI
|
|
||||||
false -> OI to NI
|
|
||||||
}
|
|
||||||
val matchedExistedInfos = mutableSetOf<ParsedCodeMetaInfo>()
|
|
||||||
val matchedReportedInfos = mutableSetOf<CodeMetaInfo>()
|
|
||||||
val allReportedInfos = globalMetadataInfoHandler.getReportedMetaInfosForFile(file)
|
|
||||||
for ((_, reportedInfos) in allReportedInfos.groupBy { Triple(it.start, it.end, it.tag) }) {
|
|
||||||
val existedInfos = globalMetadataInfoHandler.getExistingMetaInfosForActualMetadata(file, reportedInfos.first())
|
|
||||||
for ((reportedInfo, existedInfo) in reportedInfos.zip(existedInfos)) {
|
|
||||||
matchedExistedInfos += existedInfo
|
|
||||||
matchedReportedInfos += reportedInfo
|
|
||||||
if (currentFlag !in reportedInfo.attributes) continue
|
|
||||||
if (currentFlag in existedInfo.attributes) continue
|
|
||||||
reportedInfo.attributes.remove(currentFlag)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (allReportedInfos.size != matchedReportedInfos.size) {
|
override fun processorEnabled(module: TestModule): Boolean {
|
||||||
for (info in allReportedInfos) {
|
return DiagnosticsDirectives.WITH_NEW_INFERENCE in module.directives
|
||||||
if (info !in matchedReportedInfos) {
|
}
|
||||||
info.attributes.remove(currentFlag)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val allExistedInfos = globalMetadataInfoHandler.getExistingMetaInfosForFile(file)
|
override fun firstAttributeEnabled(module: TestModule): Boolean {
|
||||||
if (allExistedInfos.size == matchedExistedInfos.size) return
|
return module.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
|
||||||
|
|
||||||
val newInfos = allExistedInfos.mapNotNull {
|
|
||||||
if (it in matchedExistedInfos) return@mapNotNull null
|
|
||||||
if (currentFlag in it.attributes) return@mapNotNull null
|
|
||||||
it.copy().apply {
|
|
||||||
if (otherFlag !in attributes) {
|
|
||||||
attributes += otherFlag
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
globalMetadataInfoHandler.addMetadataInfosForFile(file, newInfos)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
-2
@@ -16,8 +16,12 @@ import org.jetbrains.kotlin.fir.analysis.FirAnalyzerFacade
|
|||||||
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
|
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
|
||||||
import org.jetbrains.kotlin.fir.session.FirJvmModuleInfo
|
import org.jetbrains.kotlin.fir.session.FirJvmModuleInfo
|
||||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
||||||
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives
|
||||||
|
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
|
||||||
import org.jetbrains.kotlin.test.model.*
|
import org.jetbrains.kotlin.test.model.*
|
||||||
import org.jetbrains.kotlin.test.services.*
|
import org.jetbrains.kotlin.test.services.*
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
class FirFrontendFacade(
|
class FirFrontendFacade(
|
||||||
testServices: TestServices
|
testServices: TestServices
|
||||||
@@ -25,6 +29,9 @@ class FirFrontendFacade(
|
|||||||
override val additionalServices: List<ServiceRegistrationData>
|
override val additionalServices: List<ServiceRegistrationData>
|
||||||
get() = listOf(service(::FirModuleInfoProvider))
|
get() = listOf(service(::FirModuleInfoProvider))
|
||||||
|
|
||||||
|
override val additionalDirectives: List<DirectivesContainer>
|
||||||
|
get() = listOf(FirDiagnosticsDirectives)
|
||||||
|
|
||||||
override fun analyze(module: TestModule): FirOutputArtifact {
|
override fun analyze(module: TestModule): FirOutputArtifact {
|
||||||
val moduleInfoProvider = testServices.firModuleInfoProvider
|
val moduleInfoProvider = testServices.firModuleInfoProvider
|
||||||
val compilerConfigurationProvider = testServices.compilerConfigurationProvider
|
val compilerConfigurationProvider = testServices.compilerConfigurationProvider
|
||||||
@@ -34,7 +41,12 @@ class FirFrontendFacade(
|
|||||||
|
|
||||||
PsiElementFinder.EP.getPoint(project).unregisterExtension(JavaElementFinder::class.java)
|
PsiElementFinder.EP.getPoint(project).unregisterExtension(JavaElementFinder::class.java)
|
||||||
|
|
||||||
val ktFiles = testServices.sourceFileProvider.getKtFilesForSourceFiles(module.files, project).values
|
val lightTreeEnabled = FirDiagnosticsDirectives.USE_LIGHT_TREE in module.directives
|
||||||
|
val (ktFiles, originalFiles) = if (lightTreeEnabled) {
|
||||||
|
emptyList<KtFile>() to module.files.filter { it.isKtFile }.map { testServices.sourceFileProvider.getRealFileForSourceFile(it) }
|
||||||
|
} else {
|
||||||
|
testServices.sourceFileProvider.getKtFilesForSourceFiles(module.files, project).values to emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
val sessionProvider = moduleInfoProvider.firSessionProvider
|
val sessionProvider = moduleInfoProvider.firSessionProvider
|
||||||
|
|
||||||
@@ -55,7 +67,7 @@ class FirFrontendFacade(
|
|||||||
languageVersionSettings = languageVersionSettings
|
languageVersionSettings = languageVersionSettings
|
||||||
)
|
)
|
||||||
|
|
||||||
val firAnalyzerFacade = FirAnalyzerFacade(session, languageVersionSettings, ktFiles)
|
val firAnalyzerFacade = FirAnalyzerFacade(session, languageVersionSettings, ktFiles, originalFiles, lightTreeEnabled)
|
||||||
val firFiles = firAnalyzerFacade.runResolution()
|
val firFiles = firAnalyzerFacade.runResolution()
|
||||||
val filesMap = firFiles.mapNotNull { firFile ->
|
val filesMap = firFiles.mapNotNull { firFile ->
|
||||||
val testFile = module.files.firstOrNull { it.name == firFile.name } ?: return@mapNotNull null
|
val testFile = module.files.firstOrNull { it.name == firFile.name } ?: return@mapNotNull null
|
||||||
|
|||||||
+47
-7
@@ -32,11 +32,13 @@ import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid
|
|||||||
import org.jetbrains.kotlin.name.FqNameUnsafe
|
import org.jetbrains.kotlin.name.FqNameUnsafe
|
||||||
import org.jetbrains.kotlin.resolve.AnalyzingUtils
|
import org.jetbrains.kotlin.resolve.AnalyzingUtils
|
||||||
import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives
|
import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives
|
||||||
|
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives
|
||||||
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
|
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
|
||||||
import org.jetbrains.kotlin.test.frontend.fir.FirOutputArtifact
|
import org.jetbrains.kotlin.test.frontend.fir.FirOutputArtifact
|
||||||
import org.jetbrains.kotlin.test.model.TestFile
|
import org.jetbrains.kotlin.test.model.TestFile
|
||||||
import org.jetbrains.kotlin.test.model.TestModule
|
import org.jetbrains.kotlin.test.model.TestModule
|
||||||
import org.jetbrains.kotlin.test.services.*
|
import org.jetbrains.kotlin.test.services.*
|
||||||
|
import org.jetbrains.kotlin.test.utils.AbstractTwoAttributesMetaInfoProcessor
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
|
|
||||||
@@ -62,6 +64,8 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes
|
|||||||
|
|
||||||
override fun processModule(module: TestModule, info: FirOutputArtifact) {
|
override fun processModule(module: TestModule, info: FirOutputArtifact) {
|
||||||
val diagnosticsPerFile = info.firAnalyzerFacade.runCheckers()
|
val diagnosticsPerFile = info.firAnalyzerFacade.runCheckers()
|
||||||
|
val lightTreeComparingModeEnabled = FirDiagnosticsDirectives.COMPARE_WITH_LIGHT_TREE in module.directives
|
||||||
|
val lightTreeEnabled = FirDiagnosticsDirectives.USE_LIGHT_TREE in module.directives
|
||||||
|
|
||||||
for (file in module.files) {
|
for (file in module.files) {
|
||||||
val firFile = info.firFiles[file] ?: continue
|
val firFile = info.firFiles[file] ?: continue
|
||||||
@@ -71,29 +75,42 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes
|
|||||||
// SYNTAX errors will be reported later
|
// SYNTAX errors will be reported later
|
||||||
if (diagnostic.factory == FirErrors.SYNTAX) return@mapNotNull null
|
if (diagnostic.factory == FirErrors.SYNTAX) return@mapNotNull null
|
||||||
if (!diagnostic.isValid) return@mapNotNull null
|
if (!diagnostic.isValid) return@mapNotNull null
|
||||||
diagnostic.toMetaInfo(file)
|
diagnostic.toMetaInfo(file, lightTreeEnabled, lightTreeComparingModeEnabled)
|
||||||
}
|
}
|
||||||
globalMetadataInfoHandler.addMetadataInfosForFile(file, diagnosticsMetadataInfos)
|
globalMetadataInfoHandler.addMetadataInfosForFile(file, diagnosticsMetadataInfos)
|
||||||
collectSyntaxDiagnostics(file, firFile)
|
collectSyntaxDiagnostics(file, firFile, lightTreeEnabled, lightTreeComparingModeEnabled)
|
||||||
collectDebugInfoDiagnostics(file, firFile)
|
collectDebugInfoDiagnostics(file, firFile, lightTreeEnabled, lightTreeComparingModeEnabled)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirDiagnostic<*>.toMetaInfo(file: TestFile, forceRenderArguments: Boolean = false): FirDiagnosticCodeMetaInfo {
|
private fun FirDiagnostic<*>.toMetaInfo(
|
||||||
|
file: TestFile,
|
||||||
|
lightTreeEnabled: Boolean,
|
||||||
|
lightTreeComparingModeEnabled: Boolean,
|
||||||
|
forceRenderArguments: Boolean = false
|
||||||
|
): FirDiagnosticCodeMetaInfo {
|
||||||
val metaInfo = FirDiagnosticCodeMetaInfo(this, FirMetaInfoUtils.renderDiagnosticNoArgs)
|
val metaInfo = FirDiagnosticCodeMetaInfo(this, FirMetaInfoUtils.renderDiagnosticNoArgs)
|
||||||
val shouldRenderArguments = forceRenderArguments || globalMetadataInfoHandler.getExistingMetaInfosForActualMetadata(file, metaInfo)
|
val shouldRenderArguments = forceRenderArguments || globalMetadataInfoHandler.getExistingMetaInfosForActualMetadata(file, metaInfo)
|
||||||
.any { it.description != null }
|
.any { it.description != null }
|
||||||
if (shouldRenderArguments) {
|
if (shouldRenderArguments) {
|
||||||
metaInfo.replaceRenderConfiguration(FirMetaInfoUtils.renderDiagnosticWithArgs)
|
metaInfo.replaceRenderConfiguration(FirMetaInfoUtils.renderDiagnosticWithArgs)
|
||||||
}
|
}
|
||||||
|
if (lightTreeComparingModeEnabled) {
|
||||||
|
metaInfo.attributes += if (lightTreeEnabled) PsiLightTreeMetaInfoProcessor.LT else PsiLightTreeMetaInfoProcessor.PSI
|
||||||
|
}
|
||||||
return metaInfo
|
return metaInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun collectSyntaxDiagnostics(testFile: TestFile, firFile: FirFile) {
|
private fun collectSyntaxDiagnostics(
|
||||||
|
testFile: TestFile,
|
||||||
|
firFile: FirFile,
|
||||||
|
lightTreeEnabled: Boolean,
|
||||||
|
lightTreeComparingModeEnabled: Boolean
|
||||||
|
) {
|
||||||
// TODO: support in light tree
|
// TODO: support in light tree
|
||||||
val psiFile = firFile.psi ?: return
|
val psiFile = firFile.psi ?: return
|
||||||
val metaInfos = AnalyzingUtils.getSyntaxErrorRanges(psiFile).map {
|
val metaInfos = AnalyzingUtils.getSyntaxErrorRanges(psiFile).map {
|
||||||
FirErrors.SYNTAX.on(FirRealPsiSourceElement(it)).toMetaInfo(testFile)
|
FirErrors.SYNTAX.on(FirRealPsiSourceElement(it)).toMetaInfo(testFile, lightTreeEnabled, lightTreeComparingModeEnabled)
|
||||||
}
|
}
|
||||||
globalMetadataInfoHandler.addMetadataInfosForFile(testFile, metaInfos)
|
globalMetadataInfoHandler.addMetadataInfosForFile(testFile, metaInfos)
|
||||||
}
|
}
|
||||||
@@ -101,6 +118,8 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes
|
|||||||
private fun collectDebugInfoDiagnostics(
|
private fun collectDebugInfoDiagnostics(
|
||||||
testFile: TestFile,
|
testFile: TestFile,
|
||||||
firFile: FirFile,
|
firFile: FirFile,
|
||||||
|
lightTreeEnabled: Boolean,
|
||||||
|
lightTreeComparingModeEnabled: Boolean
|
||||||
) {
|
) {
|
||||||
val result = mutableListOf<FirDiagnostic<*>>()
|
val result = mutableListOf<FirDiagnostic<*>>()
|
||||||
val diagnosedRangesToDiagnosticNames = globalMetadataInfoHandler.getExistingMetaInfosForFile(testFile).groupBy(
|
val diagnosedRangesToDiagnosticNames = globalMetadataInfoHandler.getExistingMetaInfosForFile(testFile).groupBy(
|
||||||
@@ -128,7 +147,10 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes
|
|||||||
super.visitFunctionCall(functionCall)
|
super.visitFunctionCall(functionCall)
|
||||||
}
|
}
|
||||||
}.let(firFile::accept)
|
}.let(firFile::accept)
|
||||||
globalMetadataInfoHandler.addMetadataInfosForFile(testFile, result.map { it.toMetaInfo(testFile, forceRenderArguments = true) })
|
globalMetadataInfoHandler.addMetadataInfosForFile(
|
||||||
|
testFile,
|
||||||
|
result.map { it.toMetaInfo(testFile, lightTreeEnabled, lightTreeComparingModeEnabled, forceRenderArguments = true) }
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createExpressionTypeDiagnosticIfExpected(
|
fun createExpressionTypeDiagnosticIfExpected(
|
||||||
@@ -230,3 +252,21 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes
|
|||||||
|
|
||||||
override fun processAfterAllModules(someAssertionWasFailed: Boolean) {}
|
override fun processAfterAllModules(someAssertionWasFailed: Boolean) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PsiLightTreeMetaInfoProcessor(testServices: TestServices) : AbstractTwoAttributesMetaInfoProcessor(testServices) {
|
||||||
|
companion object {
|
||||||
|
const val PSI = "PSI"
|
||||||
|
const val LT = "LT" // Light Tree
|
||||||
|
}
|
||||||
|
|
||||||
|
override val firstAttribute: String get() = PSI
|
||||||
|
override val secondAttribute: String get() = LT
|
||||||
|
|
||||||
|
override fun processorEnabled(module: TestModule): Boolean {
|
||||||
|
return FirDiagnosticsDirectives.COMPARE_WITH_LIGHT_TREE in module.directives
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun firstAttributeEnabled(module: TestModule): Boolean {
|
||||||
|
return FirDiagnosticsDirectives.USE_LIGHT_TREE !in module.directives
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+7
-3
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.test.generators
|
package org.jetbrains.kotlin.test.generators
|
||||||
|
|
||||||
import org.jetbrains.kotlin.generators.util.TestGeneratorUtil
|
import org.jetbrains.kotlin.generators.util.TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME
|
||||||
import org.jetbrains.kotlin.test.TargetBackend
|
import org.jetbrains.kotlin.test.TargetBackend
|
||||||
import org.jetbrains.kotlin.test.runners.*
|
import org.jetbrains.kotlin.test.runners.*
|
||||||
|
|
||||||
@@ -47,8 +47,12 @@ fun main(args: Array<String>) {
|
|||||||
|
|
||||||
testGroup("compiler/tests-common-new/tests-gen", "compiler/fir/analysis-tests/testData") {
|
testGroup("compiler/tests-common-new/tests-gen", "compiler/fir/analysis-tests/testData") {
|
||||||
testClass<AbstractFirDiagnosticTest> {
|
testClass<AbstractFirDiagnosticTest> {
|
||||||
model("resolve", pattern = TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME)
|
model("resolve", pattern = KT_WITHOUT_DOTS_IN_NAME)
|
||||||
model("resolveWithStdlib", pattern = TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME)
|
model("resolveWithStdlib", pattern = KT_WITHOUT_DOTS_IN_NAME)
|
||||||
|
}
|
||||||
|
|
||||||
|
testClass<AbstractFirDiagnosticsWithLightTreeTest> {
|
||||||
|
model("resolve", pattern = KT_WITHOUT_DOTS_IN_NAME)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-1
@@ -123,7 +123,12 @@ class TestConfigurationImpl(
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
testServices.apply {
|
testServices.apply {
|
||||||
this@TestConfigurationImpl.facades.values.forEach { it.values.forEach { facade -> register(facade.additionalServices) } }
|
this@TestConfigurationImpl.facades.values.forEach {
|
||||||
|
it.values.forEach { facade ->
|
||||||
|
register(facade.additionalServices)
|
||||||
|
allDirectives += facade.additionalDirectives
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+20
-2
@@ -8,7 +8,11 @@ package org.jetbrains.kotlin.test.runners
|
|||||||
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
||||||
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
|
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
|
||||||
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives
|
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives
|
||||||
|
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives.COMPARE_WITH_LIGHT_TREE
|
||||||
|
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives.FIR_DUMP
|
||||||
|
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives.USE_LIGHT_TREE
|
||||||
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives
|
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives
|
||||||
|
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.WITH_STDLIB
|
||||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives
|
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives
|
||||||
import org.jetbrains.kotlin.test.frontend.fir.FirFailingTestSuppressor
|
import org.jetbrains.kotlin.test.frontend.fir.FirFailingTestSuppressor
|
||||||
import org.jetbrains.kotlin.test.frontend.fir.FirFrontendFacade
|
import org.jetbrains.kotlin.test.frontend.fir.FirFrontendFacade
|
||||||
@@ -45,6 +49,8 @@ abstract class AbstractFirDiagnosticTest : AbstractKotlinCompilerTest() {
|
|||||||
::FirCfgConsistencyHandler,
|
::FirCfgConsistencyHandler,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
useMetaInfoProcessors(::PsiLightTreeMetaInfoProcessor)
|
||||||
|
|
||||||
forTestsMatching("compiler/testData/diagnostics/*") {
|
forTestsMatching("compiler/testData/diagnostics/*") {
|
||||||
useAfterAnalysisCheckers(
|
useAfterAnalysisCheckers(
|
||||||
::FirIdenticalChecker,
|
::FirIdenticalChecker,
|
||||||
@@ -55,7 +61,8 @@ abstract class AbstractFirDiagnosticTest : AbstractKotlinCompilerTest() {
|
|||||||
|
|
||||||
forTestsMatching("compiler/fir/analysis-tests/testData/*") {
|
forTestsMatching("compiler/fir/analysis-tests/testData/*") {
|
||||||
defaultDirectives {
|
defaultDirectives {
|
||||||
+FirDiagnosticsDirectives.FIR_DUMP
|
+FIR_DUMP
|
||||||
|
+COMPARE_WITH_LIGHT_TREE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +72,18 @@ abstract class AbstractFirDiagnosticTest : AbstractKotlinCompilerTest() {
|
|||||||
"compiler/testData/diagnostics/tests/unsignedTypes/*"
|
"compiler/testData/diagnostics/tests/unsignedTypes/*"
|
||||||
) {
|
) {
|
||||||
defaultDirectives {
|
defaultDirectives {
|
||||||
+JvmEnvironmentConfigurationDirectives.WITH_STDLIB
|
+WITH_STDLIB
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class AbstractFirDiagnosticsWithLightTreeTest : AbstractFirDiagnosticTest() {
|
||||||
|
override fun configure(builder: TestConfigurationBuilder) {
|
||||||
|
super.configure(builder)
|
||||||
|
with(builder) {
|
||||||
|
defaultDirectives {
|
||||||
|
+USE_LIGHT_TREE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+76
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* 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.test.utils
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.codeMetaInfo.model.CodeMetaInfo
|
||||||
|
import org.jetbrains.kotlin.codeMetaInfo.model.ParsedCodeMetaInfo
|
||||||
|
import org.jetbrains.kotlin.test.model.TestFile
|
||||||
|
import org.jetbrains.kotlin.test.model.TestModule
|
||||||
|
import org.jetbrains.kotlin.test.services.AdditionalMetaInfoProcessor
|
||||||
|
import org.jetbrains.kotlin.test.services.TestServices
|
||||||
|
|
||||||
|
abstract class AbstractTwoAttributesMetaInfoProcessor(testServices: TestServices) : AdditionalMetaInfoProcessor(testServices) {
|
||||||
|
protected abstract val firstAttribute: String
|
||||||
|
protected abstract val secondAttribute: String
|
||||||
|
|
||||||
|
protected abstract fun processorEnabled(module: TestModule): Boolean
|
||||||
|
protected abstract fun firstAttributeEnabled(module: TestModule): Boolean
|
||||||
|
|
||||||
|
override fun processMetaInfos(module: TestModule, file: TestFile) {
|
||||||
|
/*
|
||||||
|
* Rules for OI/NI attribute:
|
||||||
|
* ┌──────────┬───────┬────────┬──────────┐
|
||||||
|
* │ │ first │ second │ nothing │ <- reported
|
||||||
|
* ├──────────┼───────┼────────┼──────────┤
|
||||||
|
* │ nothing │ both │ both │ nothing │
|
||||||
|
* │ first │ first │ both │ first │
|
||||||
|
* │ second │ both │ second │ second │
|
||||||
|
* │ both │ both │ both │ opposite │ <- first if second enabled in test and vice versa
|
||||||
|
* └──────────┴───────┴────────┴──────────┘
|
||||||
|
* ^ existed
|
||||||
|
*/
|
||||||
|
if (!processorEnabled(module)) return
|
||||||
|
val (currentFlag, otherFlag) = when (firstAttributeEnabled(module)) {
|
||||||
|
true -> firstAttribute to secondAttribute
|
||||||
|
false -> secondAttribute to firstAttribute
|
||||||
|
}
|
||||||
|
val matchedExistedInfos = mutableSetOf<ParsedCodeMetaInfo>()
|
||||||
|
val matchedReportedInfos = mutableSetOf<CodeMetaInfo>()
|
||||||
|
val allReportedInfos = globalMetadataInfoHandler.getReportedMetaInfosForFile(file)
|
||||||
|
for ((_, reportedInfos) in allReportedInfos.groupBy { Triple(it.start, it.end, it.tag) }) {
|
||||||
|
val existedInfos = globalMetadataInfoHandler.getExistingMetaInfosForActualMetadata(file, reportedInfos.first())
|
||||||
|
for ((reportedInfo, existedInfo) in reportedInfos.zip(existedInfos)) {
|
||||||
|
matchedExistedInfos += existedInfo
|
||||||
|
matchedReportedInfos += reportedInfo
|
||||||
|
if (currentFlag !in reportedInfo.attributes) continue
|
||||||
|
if (currentFlag in existedInfo.attributes) continue
|
||||||
|
reportedInfo.attributes.remove(currentFlag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allReportedInfos.size != matchedReportedInfos.size) {
|
||||||
|
for (info in allReportedInfos) {
|
||||||
|
if (info !in matchedReportedInfos) {
|
||||||
|
info.attributes.remove(currentFlag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val allExistedInfos = globalMetadataInfoHandler.getExistingMetaInfosForFile(file)
|
||||||
|
if (allExistedInfos.size == matchedExistedInfos.size) return
|
||||||
|
|
||||||
|
val newInfos = allExistedInfos.mapNotNull {
|
||||||
|
if (it in matchedExistedInfos) return@mapNotNull null
|
||||||
|
if (currentFlag in it.attributes) return@mapNotNull null
|
||||||
|
it.copy().apply {
|
||||||
|
if (otherFlag !in attributes) {
|
||||||
|
attributes += otherFlag
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
globalMetadataInfoHandler.addMetadataInfosForFile(file, newInfos)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -603,14 +603,9 @@ fun main(args: Array<String>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
testGroup("compiler/fir/analysis-tests/tests-gen", "compiler/fir/analysis-tests/testData") {
|
testGroup("compiler/fir/analysis-tests/tests-gen", "compiler/fir/analysis-tests/testData") {
|
||||||
testClass<AbstractFirDiagnosticsWithLightTreeTest> {
|
|
||||||
model("resolve", pattern = KT_WITHOUT_DOTS_IN_NAME)
|
|
||||||
}
|
|
||||||
|
|
||||||
testClass<AbstractLazyBodyIsNotTouchedTilContractsPhaseTest> {
|
testClass<AbstractLazyBodyIsNotTouchedTilContractsPhaseTest> {
|
||||||
model("resolve", pattern = KT_WITHOUT_DOTS_IN_NAME)
|
model("resolve", pattern = KT_WITHOUT_DOTS_IN_NAME)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
testGroup("compiler/fir/analysis-tests/tests-gen", "compiler/testData") {
|
testGroup("compiler/fir/analysis-tests/tests-gen", "compiler/testData") {
|
||||||
|
|||||||
Reference in New Issue
Block a user