From fea3001dac9242f45803bee0bb2ecf34815ff90f Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Fri, 31 May 2019 15:14:52 +0300 Subject: [PATCH] Fix target platform for scripts ^KT-31837 Fixed --- .../idea/caches/project/ScriptModuleInfos.kt | 7 ++-- .../compiler/IDELanguageSettingsProvider.kt | 8 +++-- .../idea/project/TargetPlatformDetector.java | 36 ++++++++++++++----- 3 files changed, 38 insertions(+), 13 deletions(-) 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 8765cf0a268..8a384507a85 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 @@ -11,13 +11,14 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptAdditionalIdeaDependenciesProvider +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition -import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.jvm.JvmPlatforms +import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices +import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition data class ScriptModuleInfo( val project: Project, @@ -51,7 +52,7 @@ data class ScriptModuleInfo( } override val platform: TargetPlatform - get() = JvmPlatforms.unspecifiedJvmPlatform // TODO(dsavvinov): choose proper target version + get() = TargetPlatformDetector.getPlatform(project, 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 98debbe7be0..32eea3bc3f9 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 @@ -32,14 +32,14 @@ import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.platform.TargetPlatformVersion import org.jetbrains.kotlin.idea.caches.project.* 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.scripting.definitions.ScriptDefinition +import org.jetbrains.kotlin.platform.TargetPlatformVersion import org.jetbrains.kotlin.platform.jvm.JdkPlatform import org.jetbrains.kotlin.platform.subplatformOfType +import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition import org.jetbrains.kotlin.utils.Jsr305State object IDELanguageSettingsProvider : LanguageSettingsProvider { @@ -92,6 +92,10 @@ 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 +} + private fun getLanguageSettingsForScripts(project: Project, scriptDefinition: ScriptDefinition): ScriptLanguageSettings { val args = scriptDefinition.compilerOptions return if (args == null || args.none()) { 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 d9a7f8dff1d..5c2c1836124 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 @@ -18,12 +18,14 @@ package org.jetbrains.kotlin.idea.project; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import kotlin.collections.CollectionsKt; import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProviderKt; import org.jetbrains.kotlin.platform.*; import org.jetbrains.kotlin.platform.jvm.JvmPlatforms; import org.jetbrains.kotlin.psi.KtCodeFragment; @@ -61,14 +63,7 @@ public class TargetPlatformDetector { if (file.isScript()) { ScriptDefinition scriptDefinition = DefinitionsKt.findScriptDefinition(file); if (scriptDefinition != null) { - String platformNameFromScriptDefinition = scriptDefinition.getPlatform(); - for (TargetPlatform compilerPlatform : CommonPlatforms.INSTANCE.getAllSimplePlatforms()) { - // FIXME(dsavvinov): get rid of matching by name - SimplePlatform simplePlatform = CollectionsKt.single(compilerPlatform); - if (simplePlatform.getPlatformName().equals(platformNameFromScriptDefinition)) { - return compilerPlatform; - } - } + return getPlatform(file.getProject(), scriptDefinition); } } @@ -88,4 +83,29 @@ public class TargetPlatformDetector { return ProjectStructureUtil.getCachedPlatformForModule(module); } + @NotNull + public static TargetPlatform getPlatform(@NotNull Project project, @NotNull ScriptDefinition scriptDefinition) { + String platformNameFromScriptDefinition = scriptDefinition.getPlatform(); + TargetPlatformVersion targetPlatformVersion = + IDELanguageSettingsProviderKt.getTargetPlatformVersionForScripts(project, scriptDefinition); + if (!targetPlatformVersion.equals(TargetPlatformVersion.NoVersion.INSTANCE)) { + for (TargetPlatform compilerPlatform : CommonPlatforms.INSTANCE.getAllSimplePlatforms()) { + SimplePlatform simplePlatform = CollectionsKt.single(compilerPlatform); + if (simplePlatform.getTargetPlatformVersion() == targetPlatformVersion) { + return compilerPlatform; + } + } + } + + for (TargetPlatform compilerPlatform : CommonPlatforms.INSTANCE.getAllSimplePlatforms()) { + // FIXME(dsavvinov): get rid of matching by name + SimplePlatform simplePlatform = CollectionsKt.single(compilerPlatform); + if (simplePlatform.getPlatformName().equals(platformNameFromScriptDefinition)) { + return compilerPlatform; + } + } + + return DefaultIdeTargetPlatformKindProvider.Companion.getDefaultPlatform(); + } + }