Fix target platform for scripts

^KT-31837 Fixed
This commit is contained in:
Natalia Selezneva
2019-05-31 15:14:52 +03:00
parent 8d6bbb9e2e
commit fea3001dac
3 changed files with 38 additions and 13 deletions
@@ -11,13 +11,14 @@ import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager
import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptAdditionalIdeaDependenciesProvider 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.idea.stubindex.KotlinSourceFilterScope
import org.jetbrains.kotlin.name.Name 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.TargetPlatform
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms 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.resolve.jvm.platform.JvmPlatformAnalyzerServices
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
data class ScriptModuleInfo( data class ScriptModuleInfo(
val project: Project, val project: Project,
@@ -51,7 +52,7 @@ data class ScriptModuleInfo(
} }
override val platform: TargetPlatform override val platform: TargetPlatform
get() = JvmPlatforms.unspecifiedJvmPlatform // TODO(dsavvinov): choose proper target version get() = TargetPlatformDetector.getPlatform(project, scriptDefinition)
override val analyzerServices: PlatformDependentAnalyzerServices override val analyzerServices: PlatformDependentAnalyzerServices
get() = JvmPlatformAnalyzerServices get() = JvmPlatformAnalyzerServices
@@ -32,14 +32,14 @@ import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.JvmTarget
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.platform.TargetPlatformVersion
import org.jetbrains.kotlin.idea.caches.project.* import org.jetbrains.kotlin.idea.caches.project.*
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.platform 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.jvm.JdkPlatform
import org.jetbrains.kotlin.platform.subplatformOfType import org.jetbrains.kotlin.platform.subplatformOfType
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.utils.Jsr305State import org.jetbrains.kotlin.utils.Jsr305State
object IDELanguageSettingsProvider : LanguageSettingsProvider { object IDELanguageSettingsProvider : LanguageSettingsProvider {
@@ -92,6 +92,10 @@ private data class ScriptLanguageSettings(
private val SCRIPT_LANGUAGE_SETTINGS = Key.create<CachedValue<ScriptLanguageSettings>>("SCRIPT_LANGUAGE_SETTINGS") private val SCRIPT_LANGUAGE_SETTINGS = Key.create<CachedValue<ScriptLanguageSettings>>("SCRIPT_LANGUAGE_SETTINGS")
fun getTargetPlatformVersionForScripts(project: Project, scriptDefinition: ScriptDefinition): TargetPlatformVersion {
return getLanguageSettingsForScripts(project, scriptDefinition).targetPlatformVersion
}
private fun getLanguageSettingsForScripts(project: Project, scriptDefinition: ScriptDefinition): ScriptLanguageSettings { private fun getLanguageSettingsForScripts(project: Project, scriptDefinition: ScriptDefinition): ScriptLanguageSettings {
val args = scriptDefinition.compilerOptions val args = scriptDefinition.compilerOptions
return if (args == null || args.none()) { return if (args == null || args.none()) {
@@ -18,12 +18,14 @@ package org.jetbrains.kotlin.idea.project;
import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module; import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
import kotlin.collections.CollectionsKt; import kotlin.collections.CollectionsKt;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProviderKt;
import org.jetbrains.kotlin.platform.*; import org.jetbrains.kotlin.platform.*;
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms; import org.jetbrains.kotlin.platform.jvm.JvmPlatforms;
import org.jetbrains.kotlin.psi.KtCodeFragment; import org.jetbrains.kotlin.psi.KtCodeFragment;
@@ -61,14 +63,7 @@ public class TargetPlatformDetector {
if (file.isScript()) { if (file.isScript()) {
ScriptDefinition scriptDefinition = DefinitionsKt.findScriptDefinition(file); ScriptDefinition scriptDefinition = DefinitionsKt.findScriptDefinition(file);
if (scriptDefinition != null) { if (scriptDefinition != null) {
String platformNameFromScriptDefinition = scriptDefinition.getPlatform(); return getPlatform(file.getProject(), scriptDefinition);
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;
}
}
} }
} }
@@ -88,4 +83,29 @@ public class TargetPlatformDetector {
return ProjectStructureUtil.getCachedPlatformForModule(module); 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();
}
} }