Make KotlinFacetSettingsProvider.getInstance() nullable

A module may not have a KotlinFacet.
It isn't correct to throw an exception in that case.
This commit is contained in:
Yan Zhulanow
2019-09-27 19:29:57 +09:00
parent f408c249f1
commit 44b7a5cc36
10 changed files with 77 additions and 44 deletions
@@ -62,7 +62,7 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider {
private fun computeJsr305State(project: Project): Jsr305State? {
var result: Jsr305State? = null
for (module in ModuleManager.getInstance(project).modules) {
val settings = KotlinFacetSettingsProvider.getInstance(project).getSettings(module) ?: continue
val settings = KotlinFacetSettingsProvider.getInstance(project)?.getSettings(module) ?: continue
val compilerArguments = settings.mergedCompilerArguments as? K2JVMCompilerArguments ?: continue
result = Jsr305Parser(MessageCollector.NONE).parse(
@@ -92,7 +92,8 @@ private fun Iterable<String>.addReleaseVersionIfNecessary(shouldAdd: Boolean): I
if (shouldAdd) this + VersionView.RELEASED_VERSION.versionString else this
fun getRuntimeLibraryVersion(module: Module): String? {
val targetPlatform = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module).targetPlatform
val settingsProvider = KotlinFacetSettingsProvider.getInstance(module.project) ?: return null
val targetPlatform = settingsProvider.getInitializedSettings(module).targetPlatform
val versions = getRuntimeLibraryVersions(module, null, targetPlatform.orDefault().idePlatformKind)
return versions.toSet().singleOrNull()
}
@@ -58,11 +58,11 @@ val KtElement.builtIns: KotlinBuiltIns
var KtFile.forcedTargetPlatform: TargetPlatform? by UserDataProperty(Key.create("FORCED_TARGET_PLATFORM"))
fun Module.getAndCacheLanguageLevelByDependencies(): LanguageVersion {
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this)
val languageLevel = getLibraryLanguageLevel(this, null, facetSettings.targetPlatform?.idePlatformKind)
val facetSettings = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(this)
val languageLevel = getLibraryLanguageLevel(this, null, facetSettings?.targetPlatform?.idePlatformKind)
// Preserve inferred version in facet/project settings
if (facetSettings.useProjectSettings) {
if (facetSettings == null || facetSettings.useProjectSettings) {
KotlinCommonCompilerArgumentsHolder.getInstance(project).update {
if (languageVersion == null) {
languageVersion = languageLevel.versionString
@@ -96,7 +96,8 @@ fun Module.getAndCacheLanguageLevelByDependencies(): LanguageVersion {
fun Module.getStableName(): Name {
// Here we check ideal situation: we have a facet, and it has 'moduleName' argument.
// This should be the case for the most environments
val arguments = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this).mergedCompilerArguments
val settingsProvider = KotlinFacetSettingsProvider.getInstance(project)
val arguments = settingsProvider?.getInitializedSettings(this)?.mergedCompilerArguments
val explicitNameFromArguments = when (arguments) {
is K2JVMCompilerArguments -> arguments.moduleName
is K2JSCompilerArguments -> arguments.outputFile?.let { FileUtil.getNameWithoutExtension(File(it)) }
@@ -179,25 +180,35 @@ private fun Module.createCachedValueForLanguageVersionSettings(): CachedValue<La
}
private fun Module.shouldUseProjectLanguageVersionSettings(): Boolean {
val facetSettingsProvider = KotlinFacetSettingsProvider.getInstance(project)
val facetSettingsProvider = KotlinFacetSettingsProvider.getInstance(project) ?: return true
return facetSettingsProvider.getSettings(this) == null || facetSettingsProvider.getInitializedSettings(this).useProjectSettings
}
private fun Module.computeLanguageVersionSettings(): LanguageVersionSettings {
if (shouldUseProjectLanguageVersionSettings()) return project.getLanguageVersionSettings()
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this)
val languageVersion = facetSettings.languageLevel ?: getAndCacheLanguageLevelByDependencies()
val apiVersion = facetSettings.apiLevel ?: languageVersion
val facetSettings = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(this)
val languageFeatures = facetSettings.mergedCompilerArguments?.configureLanguageFeatures(MessageCollector.NONE)?.apply {
val languageVersion: LanguageVersion
val apiVersion: LanguageVersion
if (facetSettings != null) {
languageVersion = facetSettings.languageLevel ?: getAndCacheLanguageLevelByDependencies()
apiVersion = facetSettings.apiLevel ?: languageVersion
} else {
languageVersion = getAndCacheLanguageLevelByDependencies()
apiVersion = languageVersion
}
val languageFeatures = facetSettings?.mergedCompilerArguments?.configureLanguageFeatures(MessageCollector.NONE)?.apply {
configureCoroutinesSupport(facetSettings.coroutineSupport, languageVersion)
configureMultiplatformSupport(facetSettings.targetPlatform?.idePlatformKind, this@computeLanguageVersionSettings)
configureNewInferenceSupportInIDE(project)
}.orEmpty()
val analysisFlags = facetSettings
.mergedCompilerArguments
?.mergedCompilerArguments
?.configureAnalysisFlags(MessageCollector.NONE)
?.apply { initIDESpecificAnalysisSettings(project) }
.orEmpty()
@@ -218,10 +229,10 @@ private fun MutableMap<AnalysisFlag<*>, Any>.initIDESpecificAnalysisSettings(pro
}
val Module.platform: TargetPlatform?
get() = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this).targetPlatform ?: project.platform
get() = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(this)?.targetPlatform ?: project.platform
val Module.isHMPPEnabled: Boolean
get() = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this).isHmppEnabled
get() = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(this)?.isHmppEnabled ?: false
// FIXME(dsavvinov): this logic is clearly wrong in MPP environment; review and fix
val Project.platform: TargetPlatform?