KTIJ-650 [Code completion]: test framework fix

This commit fixes test infrastructure issue.
Usage of "COMPILER_ARGUMENTS" test-data-instruction resulted in side
effect. Test cases following the one that used it got broken
LanguageVersionSetting - LanguageFeature.MultiPlatformProjects escaped,
languageVersion could be wrong.

Why it happened

KotlinProjectDescriptorWithFacet defines default values
of (language-version, isMultiplatform) settings for the test-case.
The values themselves are stored in KotlinFacetSettings and passed there
only once. After every test-case (if it uses "COMPILER_ARGUMENTS")
infrastructure calls
KotlinLightCodeInsightFixtureTestCaseKt#rollbackCompilerOptions which
resets mentioned values (among others) in KotlinFacetSettings.
Instances of KotlinProjectDescriptorWithFacet are reused hence facet
settings remained reset.
This commit is contained in:
Andrei Klunnyi
2020-12-17 15:45:28 +01:00
parent efc7ab5023
commit 27ebb6c946
2 changed files with 20 additions and 8 deletions
@@ -23,9 +23,9 @@ abstract class AbstractKeywordCompletionTest : KotlinFixtureCompletionBaseTestCa
}
override fun getProjectDescriptor(): KotlinLightProjectDescriptor = when {
"LangLevel10" in fileName() -> KotlinProjectDescriptorWithFacet.KOTLIN_10
"LangLevel11" in fileName() -> KotlinProjectDescriptorWithFacet.KOTLIN_11
else -> KotlinProjectDescriptorWithFacet.KOTLIN_STABLE_WITH_MULTIPLATFORM
"LangLevel10" in fileName() -> KotlinProjectDescriptorWithFacet.KOTLIN_10.apply { replicateToFacetSettings() }
"LangLevel11" in fileName() -> KotlinProjectDescriptorWithFacet.KOTLIN_11.apply { replicateToFacetSettings() }
else -> KotlinProjectDescriptorWithFacet.KOTLIN_STABLE_WITH_MULTIPLATFORM.apply { replicateToFacetSettings() }
}
override fun defaultInvocationCount() = 1
@@ -30,13 +30,25 @@ class KotlinProjectDescriptorWithFacet(
private val languageVersion: LanguageVersion,
private val multiPlatform: Boolean = false
) : KotlinLightProjectDescriptor() {
private var facetConfig: KotlinFacetConfiguration? = null
override fun configureModule(module: Module, model: ModifiableRootModel, contentEntry: ContentEntry) {
configureKotlinFacet(module) {
settings.languageLevel = languageVersion
if (multiPlatform) {
settings.compilerSettings = CompilerSettings().apply {
additionalArguments += " -Xmulti-platform"
}
facetConfig = this
toFacetConfig(this)
}
}
fun replicateToFacetSettings() {
facetConfig?.let { toFacetConfig(it) }
}
private fun toFacetConfig(configuration: KotlinFacetConfiguration) {
configuration.settings.languageLevel = languageVersion
if (multiPlatform) {
configuration.settings.compilerSettings = CompilerSettings().apply {
additionalArguments += " -Xmulti-platform"
}
}
}