Use script compiler options to calculate target platform in IDE

#KT-25822 fixed
This commit is contained in:
Ilya Chernikov
2018-07-31 13:39:44 +02:00
parent 0cf6b26494
commit f2395bac2f
4 changed files with 32 additions and 17 deletions
@@ -188,7 +188,7 @@ class ResolverForProjectImpl<M : ModuleInfo>(
val languageVersionSettings = val languageVersionSettings =
moduleLanguageSettingsProvider.getLanguageVersionSettings(module, projectContext.project, isReleaseCoroutines) moduleLanguageSettingsProvider.getLanguageVersionSettings(module, projectContext.project, isReleaseCoroutines)
val targetPlatformVersion = moduleLanguageSettingsProvider.getTargetPlatform(module) val targetPlatformVersion = moduleLanguageSettingsProvider.getTargetPlatform(module, projectContext.project)
resolverForModuleFactory.createResolverForModule( resolverForModuleFactory.createResolverForModule(
descriptor as ModuleDescriptorImpl, descriptor as ModuleDescriptorImpl,
@@ -433,7 +433,7 @@ interface LanguageSettingsProvider {
project: Project project: Project
) = getLanguageVersionSettings(moduleInfo, project, null) ) = getLanguageVersionSettings(moduleInfo, project, null)
fun getTargetPlatform(moduleInfo: ModuleInfo): TargetPlatformVersion fun getTargetPlatform(moduleInfo: ModuleInfo, project: Project): TargetPlatformVersion
object Default : LanguageSettingsProvider { object Default : LanguageSettingsProvider {
override fun getLanguageVersionSettings( override fun getLanguageVersionSettings(
@@ -442,7 +442,7 @@ interface LanguageSettingsProvider {
isReleaseCoroutines: Boolean? isReleaseCoroutines: Boolean?
) = LanguageVersionSettingsImpl.DEFAULT ) = LanguageVersionSettingsImpl.DEFAULT
override fun getTargetPlatform(moduleInfo: ModuleInfo): TargetPlatformVersion = TargetPlatformVersion.NoVersion override fun getTargetPlatform(moduleInfo: ModuleInfo, project: Project): TargetPlatformVersion = TargetPlatformVersion.NoVersion
} }
} }
@@ -93,7 +93,10 @@ object CommonAnalyzerFacade : ResolverForModuleFactory() {
isReleaseCoroutines: Boolean? isReleaseCoroutines: Boolean?
) = multiplatformLanguageSettings ) = multiplatformLanguageSettings
override fun getTargetPlatform(moduleInfo: ModuleInfo) = TargetPlatformVersion.NoVersion override fun getTargetPlatform(
moduleInfo: ModuleInfo,
project: Project
) = TargetPlatformVersion.NoVersion
}, },
resolverForModuleFactoryByPlatform = { CommonAnalyzerFacade }, resolverForModuleFactoryByPlatform = { CommonAnalyzerFacade },
platformParameters = { _ -> CommonAnalysisParameters(metadataPartProviderFactory) } platformParameters = { _ -> CommonAnalysisParameters(metadataPartProviderFactory) }
@@ -276,7 +276,7 @@ internal object IDELightClassContexts {
val moduleInfo = files.first().getModuleInfo() val moduleInfo = files.first().getModuleInfo()
val container = createContainer("LightClassStub", JvmPlatform) { val container = createContainer("LightClassStub", JvmPlatform) {
val jvmTarget = IDELanguageSettingsProvider.getTargetPlatform(moduleInfo) as? JvmTarget val jvmTarget = IDELanguageSettingsProvider.getTargetPlatform(moduleInfo, project) as? JvmTarget
configureModule( configureModule(
ModuleContext(moduleDescriptor, project), JvmPlatform, ModuleContext(moduleDescriptor, project), JvmPlatform,
jvmTarget ?: JvmTarget.DEFAULT, trace jvmTarget ?: JvmTarget.DEFAULT, trace
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.cli.common.arguments.Jsr305Parser
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments
import org.jetbrains.kotlin.cli.common.messages.MessageCollector 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.KotlinFacetSettingsProvider
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.TargetPlatformVersion import org.jetbrains.kotlin.config.TargetPlatformVersion
@@ -50,8 +51,8 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider {
is LibraryInfo -> project.getLanguageVersionSettings( is LibraryInfo -> project.getLanguageVersionSettings(
jsr305State = computeJsr305State(project), isReleaseCoroutines = isReleaseCoroutines jsr305State = computeJsr305State(project), isReleaseCoroutines = isReleaseCoroutines
) )
is ScriptModuleInfo -> getVersionLanguageSettingsForScripts(project, moduleInfo.scriptDefinition) is ScriptModuleInfo -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).languageVersionSettings
is ScriptDependenciesInfo.ForFile -> getVersionLanguageSettingsForScripts(project, moduleInfo.scriptDefinition) is ScriptDependenciesInfo.ForFile -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).languageVersionSettings
is PlatformModuleInfo -> moduleInfo.platformModule.module.languageVersionSettings is PlatformModuleInfo -> moduleInfo.platformModule.module.languageVersionSettings
else -> project.getLanguageVersionSettings() else -> project.getLanguageVersionSettings()
} }
@@ -71,29 +72,40 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider {
return result return result
} }
override fun getTargetPlatform(moduleInfo: ModuleInfo): TargetPlatformVersion { override fun getTargetPlatform(moduleInfo: ModuleInfo, project: Project): TargetPlatformVersion =
return (moduleInfo as? ModuleSourceInfo)?.module?.targetPlatform?.version ?: TargetPlatformVersion.NoVersion when (moduleInfo) {
} is ModuleSourceInfo -> moduleInfo.module.targetPlatform?.version ?: TargetPlatformVersion.NoVersion
is ScriptModuleInfo -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).targetPlatformVersion
is ScriptDependenciesInfo.ForFile -> getLanguageSettingsForScripts(project, moduleInfo.scriptDefinition).targetPlatformVersion
else -> TargetPlatformVersion.NoVersion
}
} }
private val LANGUAGE_VERSION_SETTINGS = Key.create<CachedValue<LanguageVersionSettings>>("LANGUAGE_VERSION_SETTINGS") private data class ScriptLanguageSettings(
val languageVersionSettings: LanguageVersionSettings,
val targetPlatformVersion: TargetPlatformVersion
)
private fun getVersionLanguageSettingsForScripts(project: Project, scriptDefinition: KotlinScriptDefinition): LanguageVersionSettings { private val SCRIPT_LANGUAGE_SETTINGS = Key.create<CachedValue<ScriptLanguageSettings>>("SCRIPT_LANGUAGE_SETTINGS")
private fun getLanguageSettingsForScripts(project: Project, scriptDefinition: KotlinScriptDefinition): ScriptLanguageSettings {
val args = scriptDefinition.additionalCompilerArguments val args = scriptDefinition.additionalCompilerArguments
return if (args == null || args.none()) { return if (args == null || args.none()) {
project.getLanguageVersionSettings() ScriptLanguageSettings(project.getLanguageVersionSettings(), TargetPlatformVersion.NoVersion)
} else { } else {
val settings = scriptDefinition.getUserData(LANGUAGE_VERSION_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
compilerArguments.configureLanguageVersionSettings(MessageCollector.NONE) val verSettings = compilerArguments.configureLanguageVersionSettings(MessageCollector.NONE)
}.also { scriptDefinition.putUserData(LANGUAGE_VERSION_SETTINGS, it) } val jvmTarget = compilerArguments.jvmTarget?.let { JvmTarget.fromString(it) } ?: TargetPlatformVersion.NoVersion
ScriptLanguageSettings(verSettings, jvmTarget)
}.also { scriptDefinition.putUserData(SCRIPT_LANGUAGE_SETTINGS, it) }
settings.value settings.value
} }
} }
private fun createCachedValue(project: Project, body: () -> LanguageVersionSettings): CachedValue<LanguageVersionSettings> { private fun createCachedValue(project: Project, body: () -> ScriptLanguageSettings): CachedValue<ScriptLanguageSettings> {
return CachedValuesManager return CachedValuesManager
.getManager(project) .getManager(project)
.createCachedValue( .createCachedValue(