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? {
|
private fun computeJsr305State(project: Project): Jsr305State? {
|
||||||
var result: Jsr305State? = null
|
var result: Jsr305State? = null
|
||||||
for (module in ModuleManager.getInstance(project).modules) {
|
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
|
val compilerArguments = settings.mergedCompilerArguments as? K2JVMCompilerArguments ?: continue
|
||||||
|
|
||||||
result = Jsr305Parser(MessageCollector.NONE).parse(
|
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
|
if (shouldAdd) this + VersionView.RELEASED_VERSION.versionString else this
|
||||||
|
|
||||||
fun getRuntimeLibraryVersion(module: Module): String? {
|
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)
|
val versions = getRuntimeLibraryVersions(module, null, targetPlatform.orDefault().idePlatformKind)
|
||||||
return versions.toSet().singleOrNull()
|
return versions.toSet().singleOrNull()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,11 +58,11 @@ val KtElement.builtIns: KotlinBuiltIns
|
|||||||
var KtFile.forcedTargetPlatform: TargetPlatform? by UserDataProperty(Key.create("FORCED_TARGET_PLATFORM"))
|
var KtFile.forcedTargetPlatform: TargetPlatform? by UserDataProperty(Key.create("FORCED_TARGET_PLATFORM"))
|
||||||
|
|
||||||
fun Module.getAndCacheLanguageLevelByDependencies(): LanguageVersion {
|
fun Module.getAndCacheLanguageLevelByDependencies(): LanguageVersion {
|
||||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this)
|
val facetSettings = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(this)
|
||||||
val languageLevel = getLibraryLanguageLevel(this, null, facetSettings.targetPlatform?.idePlatformKind)
|
val languageLevel = getLibraryLanguageLevel(this, null, facetSettings?.targetPlatform?.idePlatformKind)
|
||||||
|
|
||||||
// Preserve inferred version in facet/project settings
|
// Preserve inferred version in facet/project settings
|
||||||
if (facetSettings.useProjectSettings) {
|
if (facetSettings == null || facetSettings.useProjectSettings) {
|
||||||
KotlinCommonCompilerArgumentsHolder.getInstance(project).update {
|
KotlinCommonCompilerArgumentsHolder.getInstance(project).update {
|
||||||
if (languageVersion == null) {
|
if (languageVersion == null) {
|
||||||
languageVersion = languageLevel.versionString
|
languageVersion = languageLevel.versionString
|
||||||
@@ -96,7 +96,8 @@ fun Module.getAndCacheLanguageLevelByDependencies(): LanguageVersion {
|
|||||||
fun Module.getStableName(): Name {
|
fun Module.getStableName(): Name {
|
||||||
// Here we check ideal situation: we have a facet, and it has 'moduleName' argument.
|
// Here we check ideal situation: we have a facet, and it has 'moduleName' argument.
|
||||||
// This should be the case for the most environments
|
// 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) {
|
val explicitNameFromArguments = when (arguments) {
|
||||||
is K2JVMCompilerArguments -> arguments.moduleName
|
is K2JVMCompilerArguments -> arguments.moduleName
|
||||||
is K2JSCompilerArguments -> arguments.outputFile?.let { FileUtil.getNameWithoutExtension(File(it)) }
|
is K2JSCompilerArguments -> arguments.outputFile?.let { FileUtil.getNameWithoutExtension(File(it)) }
|
||||||
@@ -179,25 +180,35 @@ private fun Module.createCachedValueForLanguageVersionSettings(): CachedValue<La
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun Module.shouldUseProjectLanguageVersionSettings(): Boolean {
|
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
|
return facetSettingsProvider.getSettings(this) == null || facetSettingsProvider.getInitializedSettings(this).useProjectSettings
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Module.computeLanguageVersionSettings(): LanguageVersionSettings {
|
private fun Module.computeLanguageVersionSettings(): LanguageVersionSettings {
|
||||||
if (shouldUseProjectLanguageVersionSettings()) return project.getLanguageVersionSettings()
|
if (shouldUseProjectLanguageVersionSettings()) return project.getLanguageVersionSettings()
|
||||||
|
|
||||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this)
|
val facetSettings = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(this)
|
||||||
val languageVersion = facetSettings.languageLevel ?: getAndCacheLanguageLevelByDependencies()
|
|
||||||
val apiVersion = facetSettings.apiLevel ?: languageVersion
|
|
||||||
|
|
||||||
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)
|
configureCoroutinesSupport(facetSettings.coroutineSupport, languageVersion)
|
||||||
configureMultiplatformSupport(facetSettings.targetPlatform?.idePlatformKind, this@computeLanguageVersionSettings)
|
configureMultiplatformSupport(facetSettings.targetPlatform?.idePlatformKind, this@computeLanguageVersionSettings)
|
||||||
configureNewInferenceSupportInIDE(project)
|
configureNewInferenceSupportInIDE(project)
|
||||||
}.orEmpty()
|
}.orEmpty()
|
||||||
|
|
||||||
val analysisFlags = facetSettings
|
val analysisFlags = facetSettings
|
||||||
.mergedCompilerArguments
|
?.mergedCompilerArguments
|
||||||
?.configureAnalysisFlags(MessageCollector.NONE)
|
?.configureAnalysisFlags(MessageCollector.NONE)
|
||||||
?.apply { initIDESpecificAnalysisSettings(project) }
|
?.apply { initIDESpecificAnalysisSettings(project) }
|
||||||
.orEmpty()
|
.orEmpty()
|
||||||
@@ -218,10 +229,10 @@ private fun MutableMap<AnalysisFlag<*>, Any>.initIDESpecificAnalysisSettings(pro
|
|||||||
}
|
}
|
||||||
|
|
||||||
val Module.platform: TargetPlatform?
|
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
|
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
|
// FIXME(dsavvinov): this logic is clearly wrong in MPP environment; review and fix
|
||||||
val Project.platform: TargetPlatform?
|
val Project.platform: TargetPlatform?
|
||||||
|
|||||||
@@ -290,6 +290,8 @@ interface KotlinFacetSettingsProvider {
|
|||||||
fun getInitializedSettings(module: Module): KotlinFacetSettings
|
fun getInitializedSettings(module: Module): KotlinFacetSettings
|
||||||
|
|
||||||
companion object {
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module)
|
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project)?.getInitializedSettings(module)
|
||||||
ModuleRootModificationUtil.updateModel(module) {
|
if (facetSettings != null) {
|
||||||
facetSettings.coroutineSupport = state
|
ModuleRootModificationUtil.updateModel(module) {
|
||||||
facetSettings.apiLevel = LanguageVersion.KOTLIN_1_1
|
facetSettings.coroutineSupport = state
|
||||||
facetSettings.languageLevel = LanguageVersion.KOTLIN_1_1
|
facetSettings.apiLevel = LanguageVersion.KOTLIN_1_1
|
||||||
|
facetSettings.languageLevel = LanguageVersion.KOTLIN_1_1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -363,12 +365,14 @@ abstract class KotlinWithLibraryConfigurator protected constructor() : KotlinPro
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module)
|
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project)?.getInitializedSettings(module)
|
||||||
ModuleRootModificationUtil.updateModel(module) {
|
if (facetSettings != null) {
|
||||||
facetSettings.apiLevel = feature.sinceVersion
|
ModuleRootModificationUtil.updateModel(module) {
|
||||||
facetSettings.languageLevel = feature.sinceVersion
|
facetSettings.apiLevel = feature.sinceVersion
|
||||||
facetSettings.compilerSettings?.apply {
|
facetSettings.languageLevel = feature.sinceVersion
|
||||||
additionalArguments = additionalArguments.replaceLanguageFeature(feature, state, separator = " ", quoted = false)
|
facetSettings.compilerSettings?.apply {
|
||||||
|
additionalArguments = additionalArguments.replaceLanguageFeature(feature, state, separator = " ", quoted = false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -382,14 +386,16 @@ abstract class KotlinWithLibraryConfigurator protected constructor() : KotlinPro
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module)
|
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project)?.getInitializedSettings(module)
|
||||||
ModuleRootModificationUtil.updateModel(module) {
|
if (facetSettings != null) {
|
||||||
with(facetSettings) {
|
ModuleRootModificationUtil.updateModel(module) {
|
||||||
if (languageVersion != null) {
|
with(facetSettings) {
|
||||||
languageLevel = LanguageVersion.fromVersionString(languageVersion)
|
if (languageVersion != null) {
|
||||||
}
|
languageLevel = LanguageVersion.fromVersionString(languageVersion)
|
||||||
if (apiVersion != null) {
|
}
|
||||||
apiLevel = LanguageVersion.fromVersionString(apiVersion)
|
if (apiVersion != null) {
|
||||||
|
apiLevel = LanguageVersion.fromVersionString(apiVersion)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ sealed class EnableUnsupportedFeatureFix(
|
|||||||
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
|
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
|
||||||
val module = ModuleUtilCore.findModuleForPsiElement(file) ?: return
|
val module = ModuleUtilCore.findModuleForPsiElement(file) ?: return
|
||||||
|
|
||||||
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(module)
|
val facetSettings = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(module)
|
||||||
val targetApiLevel = facetSettings.apiLevel?.let { apiLevel ->
|
val targetApiLevel = facetSettings?.apiLevel?.let { apiLevel ->
|
||||||
if (ApiVersion.createByLanguageVersion(apiLevel) < feature.sinceApiVersion)
|
if (ApiVersion.createByLanguageVersion(apiLevel) < feature.sinceApiVersion)
|
||||||
feature.sinceApiVersion.versionString
|
feature.sinceApiVersion.versionString
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -188,7 +188,10 @@ fun KotlinFacet.configureFacet(
|
|||||||
module.externalCompilerVersion = compilerVersion
|
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")
|
@Suppress("DEPRECATION_ERROR", "DeprecatedCallableAddReplaceWith")
|
||||||
@Deprecated(
|
@Deprecated(
|
||||||
|
|||||||
@@ -66,21 +66,27 @@ open class ConfigureKotlinInTempDirTest : AbstractConfigureKotlinInTempDirTest()
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun testProject106InconsistentVersionInConfig() {
|
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(false, settings.useProjectSettings)
|
||||||
Assert.assertEquals("1.0", settings.languageLevel!!.description)
|
Assert.assertEquals("1.0", settings.languageLevel!!.description)
|
||||||
Assert.assertEquals("1.0", settings.apiLevel!!.description)
|
Assert.assertEquals("1.0", settings.apiLevel!!.description)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testProject107InconsistentVersionInConfig() {
|
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(false, settings.useProjectSettings)
|
||||||
Assert.assertEquals("1.0", settings.languageLevel!!.description)
|
Assert.assertEquals("1.0", settings.languageLevel!!.description)
|
||||||
Assert.assertEquals("1.0", settings.apiLevel!!.description)
|
Assert.assertEquals("1.0", settings.apiLevel!!.description)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testFacetWithProjectSettings() {
|
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(true, settings.useProjectSettings)
|
||||||
Assert.assertEquals("1.1", settings.languageLevel!!.description)
|
Assert.assertEquals("1.1", settings.languageLevel!!.description)
|
||||||
Assert.assertEquals("1.1", settings.apiLevel!!.description)
|
Assert.assertEquals("1.1", settings.apiLevel!!.description)
|
||||||
|
|||||||
@@ -35,9 +35,9 @@ class Jsr305HighlightingTest : KotlinLightCodeInsightFixtureTestCase() {
|
|||||||
override fun configureModule(module: Module, model: ModifiableRootModel) {
|
override fun configureModule(module: Module, model: ModifiableRootModel) {
|
||||||
super.configureModule(module, model)
|
super.configureModule(module, model)
|
||||||
module.createFacet(JvmPlatforms.jvm18)
|
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 =
|
val jsrStateByTestName =
|
||||||
ReportLevel.findByDescription(getTestName(true)) ?: return@apply
|
ReportLevel.findByDescription(getTestName(true)) ?: return@apply
|
||||||
|
|
||||||
|
|||||||
@@ -109,7 +109,9 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() {
|
|||||||
|
|
||||||
fun Module.enableMultiPlatform(additionalCompilerArguments: String = "") {
|
fun Module.enableMultiPlatform(additionalCompilerArguments: String = "") {
|
||||||
createFacet()
|
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.useProjectSettings = false
|
||||||
facetSettings.compilerSettings = CompilerSettings().apply {
|
facetSettings.compilerSettings = CompilerSettings().apply {
|
||||||
additionalArguments += " -Xmulti-platform $additionalCompilerArguments"
|
additionalArguments += " -Xmulti-platform $additionalCompilerArguments"
|
||||||
@@ -118,7 +120,9 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() {
|
|||||||
|
|
||||||
fun Module.enableCoroutines() {
|
fun Module.enableCoroutines() {
|
||||||
createFacet()
|
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.useProjectSettings = false
|
||||||
facetSettings.coroutineSupport = LanguageFeature.State.ENABLED
|
facetSettings.coroutineSupport = LanguageFeature.State.ENABLED
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user