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) {
val previousLanguageVersionSettings = getUserData(LANGUAGE_VERSION_SETTINGS)
try {
putUserData( putUserData(
LANGUAGE_VERSION_SETTINGS, LANGUAGE_VERSION_SETTINGS,
CachedValuesManager.getManager(project).createCachedValue({ CachedValuesManager.getManager(project).createCachedValue(
{
CachedValueProvider.Result( CachedValueProvider.Result(
value, ProjectRootModificationTracker.getInstance(project) value, ProjectRootModificationTracker.getInstance(project)
) )
}, false) },
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,10 +59,12 @@ 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) {
val languageVersionSettings = languageVersionSettingsFromText(listOf(psiFile.text))
module.withLanguageVersionSettings(languageVersionSettings) {
psiFile.acceptChildren( psiFile.acceptChildren(
object : KtVisitorVoid() { object : KtVisitorVoid() {
override fun visitNamedFunction(function: KtNamedFunction) { override fun visitNamedFunction(function: KtNamedFunction) {
functionVisitor(createModuleResult.module, function) functionVisitor(languageVersionSettings, function)
} }
}, },
) )
@@ -69,6 +72,7 @@ class RunConfigurationTest : AbstractRunConfigurationTest() {
} }
} }
} }
}
fun testDependencyModuleClasspath() { fun testDependencyModuleClasspath() {
val dependencyModuleSrcDir = configureModule(moduleDirPath("module"), getTestProject().baseDir!!).srcOutputDir val dependencyModuleSrcDir = configureModule(moduleDirPath("module"), getTestProject().baseDir!!).srcOutputDir
@@ -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)