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
get() = TargetPlatformDetector.getPlatform(project, scriptDefinition)
get() = TargetPlatformDetector.getPlatform4Script(project, scriptFile, scriptDefinition)
override val analyzerServices: PlatformDependentAnalyzerServices
get() = JvmPlatformAnalyzerServices
@@ -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<JdkPlatform>()?.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<JdkPlatform>()?.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<CachedValue<ScriptLanguageSettings>>("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<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
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
@@ -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();
}
}