[kotlin] KTIJ-33946 resolve session extracted

GitOrigin-RevId: af64271b892a01a3eb25f5b673fac3cf4a7c799f
This commit is contained in:
Andrew Kozlov
2025-06-24 13:47:20 +00:00
committed by intellij-monorepo-bot
parent c32933505a
commit 19878779db
3 changed files with 29 additions and 26 deletions
@@ -7,7 +7,6 @@ import com.intellij.modcommand.ModCommandAction
import com.intellij.modcommand.ModPsiUpdater
import com.intellij.modcommand.Presentation
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic
import org.jetbrains.kotlin.analysis.api.types.KaClassType
import org.jetbrains.kotlin.idea.base.resources.KotlinBundle
@@ -72,15 +71,12 @@ object ChangeToMutableCollectionFixFactories {
elementContext: ElementContext,
updater: ModPsiUpdater,
) {
val initializer = element.initializer ?: return
analyze(initializer) {
MutableCollectionsConversionUtils.run {
convertPropertyTypeToMutable(
property = element,
immutableCollectionClassId = elementContext.immutableCollectionClassId,
)
}
}
element.initializer ?: return
MutableCollectionsConversionUtils.convertPropertyTypeToMutable(
property = element,
immutableCollectionClassId = elementContext.immutableCollectionClassId,
)
updater.moveCaretTo(element.endOffset)
}
}
@@ -97,11 +97,7 @@ class SuspiciousCollectionReassignmentInspection : AbstractKotlinInspection() {
val property = left.mainReference?.resolve() as? KtProperty ?: return
val psiFactory = KtPsiFactory(project)
analyze(property) {
MutableCollectionsConversionUtils.run {
convertPropertyTypeToMutable(property, immutableCollectionClassId, psiFactory)
}
}
MutableCollectionsConversionUtils.convertPropertyTypeToMutable(property, immutableCollectionClassId, psiFactory)
property.valOrVarKeyword.replace(psiFactory.createValKeyword())
updater.moveCaretTo(property.endOffset)
}
@@ -1,7 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.codeinsight.utils
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.resolution.singleFunctionCallOrNull
import org.jetbrains.kotlin.analysis.api.resolution.symbol
import org.jetbrains.kotlin.idea.base.psi.replaced
@@ -27,21 +27,32 @@ object MutableCollectionsConversionUtils {
return property.isLocal && property.initializer != null
}
fun KaSession.convertPropertyTypeToMutable(
private fun mutableCallableName(
initializer: KtExpression,
): String? {
val fqName = analyze(initializer) {
initializer.resolveToCall()
?.singleFunctionCallOrNull()
?.symbol
?.callableId
}?.asSingleFqName()
return mutableConversionMap[fqName?.asString()]
}
fun convertPropertyTypeToMutable(
property: KtDeclarationWithInitializer,
immutableCollectionClassId: ClassId,
psiFactory: KtPsiFactory = KtPsiFactory(property.project),
) {
val initializer = property.initializer ?: return
val fqName = initializer.resolveToCall()
?.singleFunctionCallOrNull()
?.symbol
?.callableId
?.asSingleFqName()
?.asString()
val mutableOf = mutableConversionMap[fqName]
if (mutableOf != null) {
(initializer as? KtCallExpression)?.calleeExpression?.replaced(psiFactory.createExpression(mutableOf)) ?: return
val mutableCallableName = mutableCallableName(initializer)
if (mutableCallableName != null) {
(initializer as? KtCallExpression)
?.calleeExpression
?.replaced(psiFactory.createExpression(mutableCallableName))
?: return
} else {
val toMutable = when (immutableCollectionClassId) {
StandardClassIds.List -> "toMutableList"