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:
+1
-1
@@ -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?
|
||||
|
||||
@@ -290,6 +290,8 @@ interface KotlinFacetSettingsProvider {
|
||||
fun getInitializedSettings(module: Module): KotlinFacetSettings
|
||||
|
||||
companion object {
|
||||
fun getInstance(project: Project) = ServiceManager.getService(project, KotlinFacetSettingsProvider::class.java)!!
|
||||
fun getInstance(project: Project): KotlinFacetSettingsProvider? {
|
||||
return ServiceManager.getService(project, KotlinFacetSettingsProvider::class.java)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+25
-19
@@ -340,11 +340,13 @@ abstract class KotlinWithLibraryConfigurator protected constructor() : KotlinPro
|
||||
return
|
||||
}
|
||||
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module)
|
||||
ModuleRootModificationUtil.updateModel(module) {
|
||||
facetSettings.coroutineSupport = state
|
||||
facetSettings.apiLevel = LanguageVersion.KOTLIN_1_1
|
||||
facetSettings.languageLevel = LanguageVersion.KOTLIN_1_1
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project)?.getInitializedSettings(module)
|
||||
if (facetSettings != null) {
|
||||
ModuleRootModificationUtil.updateModel(module) {
|
||||
facetSettings.coroutineSupport = state
|
||||
facetSettings.apiLevel = LanguageVersion.KOTLIN_1_1
|
||||
facetSettings.languageLevel = LanguageVersion.KOTLIN_1_1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -363,12 +365,14 @@ abstract class KotlinWithLibraryConfigurator protected constructor() : KotlinPro
|
||||
return
|
||||
}
|
||||
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module)
|
||||
ModuleRootModificationUtil.updateModel(module) {
|
||||
facetSettings.apiLevel = feature.sinceVersion
|
||||
facetSettings.languageLevel = feature.sinceVersion
|
||||
facetSettings.compilerSettings?.apply {
|
||||
additionalArguments = additionalArguments.replaceLanguageFeature(feature, state, separator = " ", quoted = false)
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project)?.getInitializedSettings(module)
|
||||
if (facetSettings != null) {
|
||||
ModuleRootModificationUtil.updateModel(module) {
|
||||
facetSettings.apiLevel = feature.sinceVersion
|
||||
facetSettings.languageLevel = feature.sinceVersion
|
||||
facetSettings.compilerSettings?.apply {
|
||||
additionalArguments = additionalArguments.replaceLanguageFeature(feature, state, separator = " ", quoted = false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -382,14 +386,16 @@ abstract class KotlinWithLibraryConfigurator protected constructor() : KotlinPro
|
||||
return
|
||||
}
|
||||
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module)
|
||||
ModuleRootModificationUtil.updateModel(module) {
|
||||
with(facetSettings) {
|
||||
if (languageVersion != null) {
|
||||
languageLevel = LanguageVersion.fromVersionString(languageVersion)
|
||||
}
|
||||
if (apiVersion != null) {
|
||||
apiLevel = LanguageVersion.fromVersionString(apiVersion)
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project)?.getInitializedSettings(module)
|
||||
if (facetSettings != null) {
|
||||
ModuleRootModificationUtil.updateModel(module) {
|
||||
with(facetSettings) {
|
||||
if (languageVersion != null) {
|
||||
languageLevel = LanguageVersion.fromVersionString(languageVersion)
|
||||
}
|
||||
if (apiVersion != null) {
|
||||
apiLevel = LanguageVersion.fromVersionString(apiVersion)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,8 +48,8 @@ sealed class EnableUnsupportedFeatureFix(
|
||||
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
|
||||
val module = ModuleUtilCore.findModuleForPsiElement(file) ?: return
|
||||
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(module)
|
||||
val targetApiLevel = facetSettings.apiLevel?.let { apiLevel ->
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(module)
|
||||
val targetApiLevel = facetSettings?.apiLevel?.let { apiLevel ->
|
||||
if (ApiVersion.createByLanguageVersion(apiLevel) < feature.sinceApiVersion)
|
||||
feature.sinceApiVersion.versionString
|
||||
else
|
||||
|
||||
@@ -188,7 +188,10 @@ fun KotlinFacet.configureFacet(
|
||||
module.externalCompilerVersion = compilerVersion
|
||||
}
|
||||
|
||||
fun Module.externalSystemTestTasks() = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this).externalSystemTestTasks
|
||||
fun Module.externalSystemTestTasks(): List<ExternalSystemTestTask> {
|
||||
val settingsProvider = KotlinFacetSettingsProvider.getInstance(project) ?: return emptyList()
|
||||
return settingsProvider.getInitializedSettings(this).externalSystemTestTasks
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION_ERROR", "DeprecatedCallableAddReplaceWith")
|
||||
@Deprecated(
|
||||
|
||||
@@ -66,21 +66,27 @@ open class ConfigureKotlinInTempDirTest : AbstractConfigureKotlinInTempDirTest()
|
||||
}
|
||||
|
||||
fun testProject106InconsistentVersionInConfig() {
|
||||
val settings = KotlinFacetSettingsProvider.getInstance(myProject).getInitializedSettings(module)
|
||||
val settings = KotlinFacetSettingsProvider.getInstance(myProject)?.getInitializedSettings(module)
|
||||
?: error("Facet settings are not found")
|
||||
|
||||
Assert.assertEquals(false, settings.useProjectSettings)
|
||||
Assert.assertEquals("1.0", settings.languageLevel!!.description)
|
||||
Assert.assertEquals("1.0", settings.apiLevel!!.description)
|
||||
}
|
||||
|
||||
fun testProject107InconsistentVersionInConfig() {
|
||||
val settings = KotlinFacetSettingsProvider.getInstance(myProject).getInitializedSettings(module)
|
||||
val settings = KotlinFacetSettingsProvider.getInstance(myProject)?.getInitializedSettings(module)
|
||||
?: error("Facet settings are not found")
|
||||
|
||||
Assert.assertEquals(false, settings.useProjectSettings)
|
||||
Assert.assertEquals("1.0", settings.languageLevel!!.description)
|
||||
Assert.assertEquals("1.0", settings.apiLevel!!.description)
|
||||
}
|
||||
|
||||
fun testFacetWithProjectSettings() {
|
||||
val settings = KotlinFacetSettingsProvider.getInstance(myProject).getInitializedSettings(module)
|
||||
val settings = KotlinFacetSettingsProvider.getInstance(myProject)?.getInitializedSettings(module)
|
||||
?: error("Facet settings are not found")
|
||||
|
||||
Assert.assertEquals(true, settings.useProjectSettings)
|
||||
Assert.assertEquals("1.1", settings.languageLevel!!.description)
|
||||
Assert.assertEquals("1.1", settings.apiLevel!!.description)
|
||||
|
||||
@@ -35,9 +35,9 @@ class Jsr305HighlightingTest : KotlinLightCodeInsightFixtureTestCase() {
|
||||
override fun configureModule(module: Module, model: ModifiableRootModel) {
|
||||
super.configureModule(module, model)
|
||||
module.createFacet(JvmPlatforms.jvm18)
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module)
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project)?.getInitializedSettings(module)
|
||||
|
||||
facetSettings.apply {
|
||||
facetSettings?.apply {
|
||||
val jsrStateByTestName =
|
||||
ReportLevel.findByDescription(getTestName(true)) ?: return@apply
|
||||
|
||||
|
||||
@@ -109,7 +109,9 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() {
|
||||
|
||||
fun Module.enableMultiPlatform(additionalCompilerArguments: String = "") {
|
||||
createFacet()
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this)
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(this)
|
||||
?: error("Facet settings are not found")
|
||||
|
||||
facetSettings.useProjectSettings = false
|
||||
facetSettings.compilerSettings = CompilerSettings().apply {
|
||||
additionalArguments += " -Xmulti-platform $additionalCompilerArguments"
|
||||
@@ -118,7 +120,9 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() {
|
||||
|
||||
fun Module.enableCoroutines() {
|
||||
createFacet()
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this)
|
||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(this)
|
||||
?: error("Facet settings are not found")
|
||||
|
||||
facetSettings.useProjectSettings = false
|
||||
facetSettings.coroutineSupport = LanguageFeature.State.ENABLED
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user