Provide language version settings correctly for platform modules

So #KT-24546 Fixed
This commit is contained in:
Mikhail Glukhikh
2018-05-24 12:59:32 +03:00
parent 6c3d69f74c
commit f8f3b1c6f1
8 changed files with 36 additions and 13 deletions
@@ -424,7 +424,7 @@ interface SourceForBinaryModuleInfo : IdeaModuleInfo {
} }
class PlatformModuleInfo( class PlatformModuleInfo(
private val platformModule: ModuleSourceInfo, internal val platformModule: ModuleSourceInfo,
private val commonModules: List<ModuleSourceInfo> private val commonModules: List<ModuleSourceInfo>
) : IdeaModuleInfo, CombinedModuleInfo, TrackableModuleInfo { ) : IdeaModuleInfo, CombinedModuleInfo, TrackableModuleInfo {
override val capabilities: Map<ModuleDescriptor.Capability<*>, Any?> override val capabilities: Map<ModuleDescriptor.Capability<*>, Any?>
@@ -33,10 +33,7 @@ import org.jetbrains.kotlin.config.AnalysisFlag
import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.TargetPlatformVersion import org.jetbrains.kotlin.config.TargetPlatformVersion
import org.jetbrains.kotlin.idea.caches.project.LibraryInfo import org.jetbrains.kotlin.idea.caches.project.*
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.caches.project.ScriptDependenciesInfo
import org.jetbrains.kotlin.idea.caches.project.ScriptModuleInfo
import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings
import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.idea.project.targetPlatform import org.jetbrains.kotlin.idea.project.targetPlatform
@@ -44,12 +41,12 @@ import org.jetbrains.kotlin.script.KotlinScriptDefinition
object IDELanguageSettingsProvider : LanguageSettingsProvider { object IDELanguageSettingsProvider : LanguageSettingsProvider {
override fun getLanguageVersionSettings(moduleInfo: ModuleInfo, project: Project): LanguageVersionSettings = override fun getLanguageVersionSettings(moduleInfo: ModuleInfo, project: Project): LanguageVersionSettings =
when { when (moduleInfo) {
moduleInfo is ModuleSourceInfo -> moduleInfo.module.languageVersionSettings is ModuleSourceInfo -> moduleInfo.module.languageVersionSettings
moduleInfo is LibraryInfo -> project.getLanguageVersionSettings(extraAnalysisFlags = getExtraAnalysisFlags(project)) is LibraryInfo -> project.getLanguageVersionSettings(extraAnalysisFlags = getExtraAnalysisFlags(project))
moduleInfo is ScriptModuleInfo -> getVersionLanguageSettingsForScripts(project, moduleInfo.scriptDefinition) is ScriptModuleInfo -> getVersionLanguageSettingsForScripts(project, moduleInfo.scriptDefinition)
moduleInfo is ScriptDependenciesInfo.ForFile -> is ScriptDependenciesInfo.ForFile -> getVersionLanguageSettingsForScripts(project, moduleInfo.scriptDefinition)
getVersionLanguageSettingsForScripts(project, moduleInfo.scriptDefinition) is PlatformModuleInfo -> moduleInfo.platformModule.module.languageVersionSettings
else -> project.getLanguageVersionSettings() else -> project.getLanguageVersionSettings()
} }
@@ -0,0 +1,2 @@
// !CHECK_HIGHLIGHTING
fun some() {}
@@ -0,0 +1,5 @@
suspend fun foo(
block: suspend () -> Unit
) {
block()
}
@@ -99,6 +99,11 @@ public class MultiModuleHighlightingTestGenerated extends AbstractMultiModuleHig
runTest("idea/testData/multiModuleHighlighting/multiplatform/suppressHeaderWithoutImpl/"); runTest("idea/testData/multiModuleHighlighting/multiplatform/suppressHeaderWithoutImpl/");
} }
@TestMetadata("suspend")
public void testSuspend() throws Exception {
runTest("idea/testData/multiModuleHighlighting/multiplatform/suspend/");
}
@TestMetadata("transitive") @TestMetadata("transitive")
public void testTransitive() throws Exception { public void testTransitive() throws Exception {
runTest("idea/testData/multiModuleHighlighting/multiplatform/transitive/"); runTest("idea/testData/multiModuleHighlighting/multiplatform/transitive/");
@@ -54,6 +54,7 @@ fun AbstractMultiModuleTest.setupMppProjectFromDirStructure(testRoot: File) {
PluginTestCaseBase.jdk(TestJdkKind.FULL_JDK) PluginTestCaseBase.jdk(TestJdkKind.FULL_JDK)
}) })
} }
is CoroutinesDependency -> module.enableCoroutines()
} }
} }
} }
@@ -140,6 +141,7 @@ private fun parseDependency(it: String): Dependency {
return when { return when {
dependencyString.equals("stdlib", ignoreCase = true) -> StdlibDependency dependencyString.equals("stdlib", ignoreCase = true) -> StdlibDependency
dependencyString.equals("fulljdk", ignoreCase = true) -> FullJdkDependency dependencyString.equals("fulljdk", ignoreCase = true) -> FullJdkDependency
dependencyString.equals("coroutines", ignoreCase = true) -> CoroutinesDependency
else -> ModuleDependency(parseModuleId(dependencyString.split("-"))) else -> ModuleDependency(parseModuleId(dependencyString.split("-")))
} }
} }
@@ -187,4 +189,5 @@ private data class RootInfo(
private sealed class Dependency private sealed class Dependency
private class ModuleDependency(val moduleId: ModuleId) : Dependency() private class ModuleDependency(val moduleId: ModuleId) : Dependency()
private object StdlibDependency : Dependency() private object StdlibDependency : Dependency()
private object FullJdkDependency : Dependency() private object FullJdkDependency : Dependency()
private object CoroutinesDependency : Dependency()
@@ -54,6 +54,7 @@ fun AbstractMultiModuleTest.setupMppProjectFromDirStructure(testRoot: File) {
PluginTestCaseBase.jdk(TestJdkKind.FULL_JDK) PluginTestCaseBase.jdk(TestJdkKind.FULL_JDK)
}) })
} }
is CoroutinesDependency -> module.enableCoroutines()
} }
} }
} }
@@ -140,6 +141,7 @@ private fun parseDependency(it: String): Dependency {
return when { return when {
dependencyString.equals("stdlib", ignoreCase = true) -> StdlibDependency dependencyString.equals("stdlib", ignoreCase = true) -> StdlibDependency
dependencyString.equals("fulljdk", ignoreCase = true) -> FullJdkDependency dependencyString.equals("fulljdk", ignoreCase = true) -> FullJdkDependency
dependencyString.equals("coroutines", ignoreCase = true) -> CoroutinesDependency
else -> ModuleDependency(parseModuleId(dependencyString.split("-"))) else -> ModuleDependency(parseModuleId(dependencyString.split("-")))
} }
} }
@@ -187,4 +189,5 @@ private data class RootInfo(
private sealed class Dependency private sealed class Dependency
private class ModuleDependency(val moduleId: ModuleId) : Dependency() private class ModuleDependency(val moduleId: ModuleId) : Dependency()
private object StdlibDependency : Dependency() private object StdlibDependency : Dependency()
private object FullJdkDependency : Dependency() private object FullJdkDependency : Dependency()
private object CoroutinesDependency : Dependency()
@@ -24,6 +24,7 @@ import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess
import com.intellij.testFramework.PsiTestUtil import com.intellij.testFramework.PsiTestUtil
import org.jetbrains.kotlin.config.CompilerSettings import org.jetbrains.kotlin.config.CompilerSettings
import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.idea.facet.getOrCreateFacet import org.jetbrains.kotlin.idea.facet.getOrCreateFacet
import org.jetbrains.kotlin.idea.facet.initializeIfNeeded import org.jetbrains.kotlin.idea.facet.initializeIfNeeded
@@ -103,6 +104,13 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() {
} }
} }
fun Module.enableCoroutines() {
createFacet()
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this)
facetSettings.useProjectSettings = false
facetSettings.coroutineSupport = LanguageFeature.State.ENABLED
}
protected fun checkFiles(shouldCheckFile: () -> Boolean = { true }, check: () -> Unit) { protected fun checkFiles(shouldCheckFile: () -> Boolean = { true }, check: () -> Unit) {
var atLeastOneFile = false var atLeastOneFile = false
myProject.allKotlinFiles().forEach { file -> myProject.allKotlinFiles().forEach { file ->