LL API: add checks to the compiler based tests to ensure ConeTypeVariableType are not leaked
This commit is contained in:
committed by
TeamCityServer
parent
7ed4984d11
commit
30b1487afc
+5
-1
@@ -11,11 +11,11 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilt
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.createResolveStateForNoCaching
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.FirLazyTransformerForIDE
|
||||
import org.jetbrains.kotlin.analysis.project.structure.*
|
||||
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
||||
import org.jetbrains.kotlin.test.TestConfiguration
|
||||
import org.jetbrains.kotlin.test.bind
|
||||
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
|
||||
import org.jetbrains.kotlin.test.builders.firHandlersStep
|
||||
import org.jetbrains.kotlin.test.builders.testConfiguration
|
||||
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives
|
||||
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
|
||||
@@ -54,6 +54,10 @@ abstract class AbstractCompilerBasedTest : AbstractKotlinCompilerTest() {
|
||||
|
||||
useAdditionalService(::TestKtModuleProvider)
|
||||
usePreAnalysisHandlers(::ModuleRegistrarPreAnalysisHandler.bind(disposable))
|
||||
|
||||
firHandlersStep {
|
||||
useHandlers(::LLDiagnosticParameterChecker)
|
||||
}
|
||||
}
|
||||
|
||||
open fun TestConfigurationBuilder.configureTest() {}
|
||||
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright 2010-2021 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.analysis.low.level.api.fir.compiler.based
|
||||
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.ConeTypeVariableType
|
||||
import org.jetbrains.kotlin.fir.types.contains
|
||||
import org.jetbrains.kotlin.test.frontend.fir.FirOutputArtifact
|
||||
import org.jetbrains.kotlin.test.frontend.fir.handlers.FirAnalysisHandler
|
||||
import org.jetbrains.kotlin.test.model.TestModule
|
||||
import org.jetbrains.kotlin.test.services.TestServices
|
||||
import org.jetbrains.kotlin.test.services.assertions
|
||||
|
||||
internal class LLDiagnosticParameterChecker(testServices: TestServices) : FirAnalysisHandler(testServices) {
|
||||
override fun processModule(module: TestModule, info: FirOutputArtifact) {
|
||||
val diagnostics = info.firAnalyzerFacade.runCheckers().values.flatten()
|
||||
|
||||
for (diagnostic in diagnostics) {
|
||||
checkDiagnosticIsSuitableForFirIde(diagnostic)
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkDiagnosticIsSuitableForFirIde(diagnostic: FirDiagnostic) {
|
||||
val parameters = diagnostic.allParameters()
|
||||
for (parameter in parameters) {
|
||||
checkDiagnosticParameter(diagnostic, parameter)
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkDiagnosticParameter(diagnostic: FirDiagnostic, parameter: Any?) {
|
||||
when (parameter) {
|
||||
is ConeKotlinType -> checkType(parameter, diagnostic)
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkType(parameter: ConeKotlinType, diagnostic: FirDiagnostic) {
|
||||
val containsTypeVariableType = parameter.contains { it is ConeTypeVariableType }
|
||||
if (containsTypeVariableType) {
|
||||
val rendered = FirDefaultErrorMessages.getRendererForDiagnostic(diagnostic).render(diagnostic)
|
||||
testServices.assertions.fail {
|
||||
"ConeTypeVariableType should not be exposed from diagnostic. But it was for ${diagnostic.factoryName} $rendered"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirDiagnostic.allParameters(): List<Any?> = when (this) {
|
||||
is FirPsiDiagnosticWithParameters1<*> -> listOf(a)
|
||||
is FirPsiDiagnosticWithParameters2<*, *> -> listOf(a, b)
|
||||
is FirPsiDiagnosticWithParameters3<*, *, *> -> listOf(a, b, c)
|
||||
is FirPsiDiagnosticWithParameters4<*, *, *, *> -> listOf(a, b, c, d)
|
||||
is FirPsiSimpleDiagnostic -> emptyList()
|
||||
else -> error("Unexpected diagnostic $this")
|
||||
}
|
||||
|
||||
override fun processAfterAllModules(someAssertionWasFailed: Boolean) {}
|
||||
}
|
||||
Reference in New Issue
Block a user