Set jvm target for scratch files
#KT-38455 fixed
This commit is contained in:
committed by
Ilya Chernikov
parent
b5be2abb1a
commit
962a767e54
+1
-1
@@ -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
|
||||||
|
|||||||
+40
-11
@@ -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
|
||||||
|
|||||||
+16
-5
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user