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