Clean LANGUAGE_VERSION_SETTINGS after the test

This commit is contained in:
Nikolay Krasko
2020-02-14 21:10:01 +03:00
committed by Nikolay Krasko
parent 19bc39d3ab
commit 6c83e9fb85
2 changed files with 35 additions and 23 deletions
@@ -169,16 +169,27 @@ val Module.languageVersionSettings: LanguageVersionSettings
return cachedValue.value
}
@TestOnly // public for tests
fun Module.setLanguageVersionSettings(value: LanguageVersionSettings) =
putUserData(
LANGUAGE_VERSION_SETTINGS,
CachedValuesManager.getManager(project).createCachedValue({
CachedValueProvider.Result(
value, ProjectRootModificationTracker.getInstance(project)
)
}, false)
)
@TestOnly
fun Module.withLanguageVersionSettings(value: LanguageVersionSettings, body: () -> Unit) {
val previousLanguageVersionSettings = getUserData(LANGUAGE_VERSION_SETTINGS)
try {
putUserData(
LANGUAGE_VERSION_SETTINGS,
CachedValuesManager.getManager(project).createCachedValue(
{
CachedValueProvider.Result(
value, ProjectRootModificationTracker.getInstance(project)
)
},
false
)
)
body()
} finally {
putUserData(LANGUAGE_VERSION_SETTINGS, previousLanguageVersionSettings)
}
}
private fun Module.createCachedValueForLanguageVersionSettings(): CachedValue<LanguageVersionSettings> {
return CachedValuesManager.getManager(project).createCachedValue({
@@ -18,10 +18,11 @@ import com.intellij.psi.PsiManager
import com.intellij.refactoring.RefactoringFactory
import com.intellij.testFramework.MapDataContext
import org.jetbrains.kotlin.checkers.languageVersionSettingsFromText
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.project.setLanguageVersionSettings
import org.jetbrains.kotlin.idea.project.withLanguageVersionSettings
import org.jetbrains.kotlin.idea.search.allScope
import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex
import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionFqnNameIndex
@@ -58,13 +59,16 @@ class RunConfigurationTest : AbstractRunConfigurationTest() {
createModuleResult.srcDir?.children?.filter { it.extension == "kt" }?.forEach {
val psiFile = PsiManager.getInstance(createModuleResult.module.project).findFile(it)
if (psiFile is KtFile) {
psiFile.acceptChildren(
object : KtVisitorVoid() {
override fun visitNamedFunction(function: KtNamedFunction) {
functionVisitor(createModuleResult.module, function)
}
},
)
val languageVersionSettings = languageVersionSettingsFromText(listOf(psiFile.text))
module.withLanguageVersionSettings(languageVersionSettings) {
psiFile.acceptChildren(
object : KtVisitorVoid() {
override fun visitNamedFunction(function: KtNamedFunction) {
functionVisitor(languageVersionSettings, function)
}
},
)
}
}
}
}
@@ -209,7 +213,7 @@ class RunConfigurationTest : AbstractRunConfigurationTest() {
}
companion object {
private fun functionVisitor(module: Module, function: KtNamedFunction) {
private fun functionVisitor(fileLanguageSettings: LanguageVersionSettings, function: KtNamedFunction) {
val project = function.project
val file = function.containingKtFile
val options = function.bodyExpression?.allChildren?.filterIsInstance<PsiComment>()
@@ -220,10 +224,7 @@ class RunConfigurationTest : AbstractRunConfigurationTest() {
val assertIsMain = "yes" in options
val assertIsNotMain = "no" in options
val languageVersionSettings = languageVersionSettingsFromText(listOf(file.text))
module.setLanguageVersionSettings(languageVersionSettings)
val isMainFunction =
MainFunctionDetector(languageVersionSettings) { it.resolveToDescriptorIfAny() }.isMain(function)
val isMainFunction = MainFunctionDetector(fileLanguageSettings) { it.resolveToDescriptorIfAny() }.isMain(function)
if (assertIsMain) {
assertTrue("$file: The function ${function.fqName?.asString()} should be main", isMainFunction)