Set jvm target for scratch files

#KT-38455 fixed
This commit is contained in:
Natalia Selezneva
2020-04-21 18:27:32 +02:00
committed by Ilya Chernikov
parent b5be2abb1a
commit 962a767e54
3 changed files with 57 additions and 17 deletions
@@ -56,7 +56,7 @@ data class ScriptModuleInfo(
} }
override val platform: TargetPlatform override val platform: TargetPlatform
get() = TargetPlatformDetector.getPlatform(project, scriptDefinition) get() = TargetPlatformDetector.getPlatform4Script(project, scriptFile, scriptDefinition)
override val analyzerServices: PlatformDependentAnalyzerServices override val analyzerServices: PlatformDependentAnalyzerServices
get() = JvmPlatformAnalyzerServices get() = JvmPlatformAnalyzerServices
@@ -16,10 +16,13 @@
package org.jetbrains.kotlin.idea.compiler package org.jetbrains.kotlin.idea.compiler
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.openapi.roots.ProjectRootModificationTracker import com.intellij.openapi.roots.ProjectRootModificationTracker
import com.intellij.openapi.util.Key import com.intellij.openapi.util.Key
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValue
import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager 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.KotlinFacetSettingsProvider
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.idea.caches.project.* 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.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.platform.TargetPlatform
import org.jetbrains.kotlin.platform.TargetPlatformVersion 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.subplatformsOfType import org.jetbrains.kotlin.platform.subplatformsOfType
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.utils.Jsr305State import org.jetbrains.kotlin.utils.Jsr305State
@@ -53,8 +60,20 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider {
is LibraryInfo -> project.getLanguageVersionSettings( is LibraryInfo -> project.getLanguageVersionSettings(
jsr305State = computeJsr305State(project), isReleaseCoroutines = isReleaseCoroutines jsr305State = computeJsr305State(project), isReleaseCoroutines = isReleaseCoroutines
) )
is ScriptModuleInfo -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).languageVersionSettings is ScriptModuleInfo -> {
is ScriptDependenciesInfo.ForFile -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).languageVersionSettings getLanguageSettingsForScripts(
project,
moduleInfo.scriptFile,
moduleInfo.scriptDefinition
).languageVersionSettings
}
is ScriptDependenciesInfo.ForFile ->
getLanguageSettingsForScripts(
project,
moduleInfo.scriptFile,
moduleInfo.scriptDefinition
).languageVersionSettings
is PlatformModuleInfo -> moduleInfo.platformModule.module.languageVersionSettings is PlatformModuleInfo -> moduleInfo.platformModule.module.languageVersionSettings
else -> project.getLanguageVersionSettings() 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 // TODO(dsavvinov): get rid of this method; instead store proper instance of TargetPlatformVersion in platform-instance
override fun getTargetPlatform(moduleInfo: ModuleInfo, project: Project): TargetPlatformVersion = override fun getTargetPlatform(moduleInfo: ModuleInfo, project: Project): TargetPlatformVersion =
when (moduleInfo) { when (moduleInfo) {
is ModuleSourceInfo -> moduleInfo.module.platform?.subplatformsOfType<JdkPlatform>()?.firstOrNull()?.targetVersion is ModuleSourceInfo ->
?: TargetPlatformVersion.NoVersion moduleInfo.module.platform?.subplatformsOfType<JdkPlatform>()?.firstOrNull()?.targetVersion
is ScriptModuleInfo -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).targetPlatformVersion ?: TargetPlatformVersion.NoVersion
is ScriptDependenciesInfo.ForFile -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).targetPlatformVersion is ScriptModuleInfo,
is ScriptDependenciesInfo.ForFile -> detectDefaultTargetPlatformVersion(moduleInfo.platform)
else -> TargetPlatformVersion.NoVersion else -> TargetPlatformVersion.NoVersion
} }
} }
@@ -92,21 +112,30 @@ 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 { fun getTargetPlatformVersionForScript(project: Project, file: VirtualFile, scriptDefinition: ScriptDefinition): TargetPlatformVersion {
return getLanguageSettingsForScripts(project, 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<JdkPlatform>()?.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 val args = scriptDefinition.compilerOptions
return if (args == null || args.none()) { return if (args == null || args.none()) {
ScriptLanguageSettings(project.getLanguageVersionSettings(), TargetPlatformVersion.NoVersion) ScriptLanguageSettings(project.getLanguageVersionSettings(), detectDefaultTargetPlatformVersion(scriptModule?.platform))
} else { } else {
val settings = scriptDefinition.getUserData(SCRIPT_LANGUAGE_SETTINGS) ?: createCachedValue(project) { val settings = scriptDefinition.getUserData(SCRIPT_LANGUAGE_SETTINGS) ?: createCachedValue(project) {
val compilerArguments = K2JVMCompilerArguments() val compilerArguments = K2JVMCompilerArguments()
parseCommandLineArguments(args.toList(), compilerArguments) parseCommandLineArguments(args.toList(), compilerArguments)
// TODO: reporting // TODO: reporting
val verSettings = compilerArguments.toLanguageVersionSettings(MessageCollector.NONE) 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) ScriptLanguageSettings(verSettings, jvmTarget)
}.also { scriptDefinition.putUserData(SCRIPT_LANGUAGE_SETTINGS, it) } }.also { scriptDefinition.putUserData(SCRIPT_LANGUAGE_SETTINGS, it) }
settings.value settings.value
@@ -64,7 +64,7 @@ public class TargetPlatformDetector {
final ScriptDefinition scriptDefinition = final ScriptDefinition scriptDefinition =
ReadAction.compute(() -> file.isScript() ? DefinitionsKt.findScriptDefinition(file) : null); ReadAction.compute(() -> file.isScript() ? DefinitionsKt.findScriptDefinition(file) : null);
if (scriptDefinition != null) { if (scriptDefinition != null) {
return getPlatform(file.getProject(), scriptDefinition); return getPlatform4Script(file.getProject(), file.getOriginalFile().getVirtualFile(), scriptDefinition);
} }
VirtualFile virtualFile = file.getOriginalFile().getVirtualFile(); VirtualFile virtualFile = file.getOriginalFile().getVirtualFile();
@@ -84,10 +84,21 @@ public class TargetPlatformDetector {
} }
@NotNull @NotNull
public static TargetPlatform getPlatform(@NotNull Project project, @NotNull ScriptDefinition scriptDefinition) { public static TargetPlatform getPlatform4Script(
String platformNameFromScriptDefinition = scriptDefinition.getPlatform(); @NotNull Project project,
@NotNull VirtualFile file,
@NotNull ScriptDefinition scriptDefinition
) {
TargetPlatformVersion targetPlatformVersion = 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)) { if (!targetPlatformVersion.equals(TargetPlatformVersion.NoVersion.INSTANCE)) {
for (TargetPlatform compilerPlatform : CommonPlatforms.INSTANCE.getAllSimplePlatforms()) { for (TargetPlatform compilerPlatform : CommonPlatforms.INSTANCE.getAllSimplePlatforms()) {
SimplePlatform simplePlatform = CollectionsKt.single(compilerPlatform); SimplePlatform simplePlatform = CollectionsKt.single(compilerPlatform);
@@ -97,6 +108,7 @@ public class TargetPlatformDetector {
} }
} }
String platformNameFromScriptDefinition = scriptDefinition.getPlatform();
for (TargetPlatform compilerPlatform : CommonPlatforms.INSTANCE.getAllSimplePlatforms()) { for (TargetPlatform compilerPlatform : CommonPlatforms.INSTANCE.getAllSimplePlatforms()) {
// FIXME(dsavvinov): get rid of matching by name // FIXME(dsavvinov): get rid of matching by name
SimplePlatform simplePlatform = CollectionsKt.single(compilerPlatform); SimplePlatform simplePlatform = CollectionsKt.single(compilerPlatform);
@@ -107,5 +119,4 @@ public class TargetPlatformDetector {
return DefaultIdeTargetPlatformKindProvider.Companion.getDefaultPlatform(); return DefaultIdeTargetPlatformKindProvider.Companion.getDefaultPlatform();
} }
} }