diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt index f5375667cd7..88901e0c42e 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt @@ -56,7 +56,7 @@ data class ScriptModuleInfo( } override val platform: TargetPlatform - get() = TargetPlatformDetector.getPlatform(project, scriptDefinition) + get() = TargetPlatformDetector.getPlatform4Script(project, scriptFile, scriptDefinition) override val analyzerServices: PlatformDependentAnalyzerServices get() = JvmPlatformAnalyzerServices diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt index 5c398f1d76a..62f3a21a10d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt @@ -16,10 +16,13 @@ package org.jetbrains.kotlin.idea.compiler +import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.ProjectFileIndex import com.intellij.openapi.roots.ProjectRootModificationTracker import com.intellij.openapi.util.Key +import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager @@ -33,12 +36,16 @@ import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.idea.caches.project.* +import org.jetbrains.kotlin.idea.core.script.scriptRelatedModuleName +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.project.platform +import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatformVersion import org.jetbrains.kotlin.platform.jvm.JdkPlatform import org.jetbrains.kotlin.platform.subplatformsOfType +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition import org.jetbrains.kotlin.utils.Jsr305State @@ -53,8 +60,20 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider { is LibraryInfo -> project.getLanguageVersionSettings( jsr305State = computeJsr305State(project), isReleaseCoroutines = isReleaseCoroutines ) - is ScriptModuleInfo -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).languageVersionSettings - is ScriptDependenciesInfo.ForFile -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).languageVersionSettings + is ScriptModuleInfo -> { + getLanguageSettingsForScripts( + project, + moduleInfo.scriptFile, + moduleInfo.scriptDefinition + ).languageVersionSettings + } + + is ScriptDependenciesInfo.ForFile -> + getLanguageSettingsForScripts( + project, + moduleInfo.scriptFile, + moduleInfo.scriptDefinition + ).languageVersionSettings is PlatformModuleInfo -> moduleInfo.platformModule.module.languageVersionSettings else -> project.getLanguageVersionSettings() } @@ -77,10 +96,11 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider { // TODO(dsavvinov): get rid of this method; instead store proper instance of TargetPlatformVersion in platform-instance override fun getTargetPlatform(moduleInfo: ModuleInfo, project: Project): TargetPlatformVersion = when (moduleInfo) { - is ModuleSourceInfo -> moduleInfo.module.platform?.subplatformsOfType()?.firstOrNull()?.targetVersion - ?: TargetPlatformVersion.NoVersion - is ScriptModuleInfo -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).targetPlatformVersion - is ScriptDependenciesInfo.ForFile -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).targetPlatformVersion + is ModuleSourceInfo -> + moduleInfo.module.platform?.subplatformsOfType()?.firstOrNull()?.targetVersion + ?: TargetPlatformVersion.NoVersion + is ScriptModuleInfo, + is ScriptDependenciesInfo.ForFile -> detectDefaultTargetPlatformVersion(moduleInfo.platform) else -> TargetPlatformVersion.NoVersion } } @@ -92,21 +112,30 @@ private data class ScriptLanguageSettings( private val SCRIPT_LANGUAGE_SETTINGS = Key.create>("SCRIPT_LANGUAGE_SETTINGS") -fun getTargetPlatformVersionForScripts(project: Project, scriptDefinition: ScriptDefinition): TargetPlatformVersion { - return getLanguageSettingsForScripts(project, scriptDefinition).targetPlatformVersion +fun getTargetPlatformVersionForScript(project: Project, file: VirtualFile, scriptDefinition: ScriptDefinition): TargetPlatformVersion { + return getLanguageSettingsForScripts(project, file, scriptDefinition).targetPlatformVersion } -private fun getLanguageSettingsForScripts(project: Project, scriptDefinition: ScriptDefinition): ScriptLanguageSettings { +private fun detectDefaultTargetPlatformVersion(platform: TargetPlatform?): TargetPlatformVersion { + return platform?.subplatformsOfType()?.firstOrNull()?.targetVersion ?: TargetPlatformVersion.NoVersion +} + +private fun getLanguageSettingsForScripts(project: Project, file: VirtualFile, scriptDefinition: ScriptDefinition): ScriptLanguageSettings { + val scriptModule = file.let { + it.scriptRelatedModuleName?.let { ModuleManager.getInstance(project).findModuleByName(it) } + ?: ProjectFileIndex.SERVICE.getInstance(project).getModuleForFile(it) + } + val args = scriptDefinition.compilerOptions return if (args == null || args.none()) { - ScriptLanguageSettings(project.getLanguageVersionSettings(), TargetPlatformVersion.NoVersion) + ScriptLanguageSettings(project.getLanguageVersionSettings(), detectDefaultTargetPlatformVersion(scriptModule?.platform)) } else { val settings = scriptDefinition.getUserData(SCRIPT_LANGUAGE_SETTINGS) ?: createCachedValue(project) { val compilerArguments = K2JVMCompilerArguments() parseCommandLineArguments(args.toList(), compilerArguments) // TODO: reporting val verSettings = compilerArguments.toLanguageVersionSettings(MessageCollector.NONE) - val jvmTarget = compilerArguments.jvmTarget?.let { JvmTarget.fromString(it) } ?: TargetPlatformVersion.NoVersion + val jvmTarget = compilerArguments.jvmTarget?.let { JvmTarget.fromString(it) } ?: detectDefaultTargetPlatformVersion(scriptModule?.platform) ScriptLanguageSettings(verSettings, jvmTarget) }.also { scriptDefinition.putUserData(SCRIPT_LANGUAGE_SETTINGS, it) } settings.value diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java index 2d4680c44d9..8f66eb58e1e 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java @@ -64,7 +64,7 @@ public class TargetPlatformDetector { final ScriptDefinition scriptDefinition = ReadAction.compute(() -> file.isScript() ? DefinitionsKt.findScriptDefinition(file) : null); if (scriptDefinition != null) { - return getPlatform(file.getProject(), scriptDefinition); + return getPlatform4Script(file.getProject(), file.getOriginalFile().getVirtualFile(), scriptDefinition); } VirtualFile virtualFile = file.getOriginalFile().getVirtualFile(); @@ -84,10 +84,21 @@ public class TargetPlatformDetector { } @NotNull - public static TargetPlatform getPlatform(@NotNull Project project, @NotNull ScriptDefinition scriptDefinition) { - String platformNameFromScriptDefinition = scriptDefinition.getPlatform(); + public static TargetPlatform getPlatform4Script( + @NotNull Project project, + @NotNull VirtualFile file, + @NotNull ScriptDefinition scriptDefinition + ) { TargetPlatformVersion targetPlatformVersion = - IDELanguageSettingsProviderKt.getTargetPlatformVersionForScripts(project, scriptDefinition); + IDELanguageSettingsProviderKt.getTargetPlatformVersionForScript(project, file, scriptDefinition); + return getPlatform4ScriptImpl(targetPlatformVersion, scriptDefinition); + } + + @NotNull + private static TargetPlatform getPlatform4ScriptImpl( + TargetPlatformVersion targetPlatformVersion, + @NotNull ScriptDefinition scriptDefinition + ) { if (!targetPlatformVersion.equals(TargetPlatformVersion.NoVersion.INSTANCE)) { for (TargetPlatform compilerPlatform : CommonPlatforms.INSTANCE.getAllSimplePlatforms()) { SimplePlatform simplePlatform = CollectionsKt.single(compilerPlatform); @@ -97,6 +108,7 @@ public class TargetPlatformDetector { } } + String platformNameFromScriptDefinition = scriptDefinition.getPlatform(); for (TargetPlatform compilerPlatform : CommonPlatforms.INSTANCE.getAllSimplePlatforms()) { // FIXME(dsavvinov): get rid of matching by name SimplePlatform simplePlatform = CollectionsKt.single(compilerPlatform); @@ -107,5 +119,4 @@ public class TargetPlatformDetector { return DefaultIdeTargetPlatformKindProvider.Companion.getDefaultPlatform(); } - }