K2: support creating class from usage from import directive (part of KTIJ-28671 K2: CreateClassFromUsageFix)

GitOrigin-RevId: 47c044231f74811fc51a645c3c67814ae28cddf1
This commit is contained in:
Alexey Kudravtsev
2024-06-26 16:09:28 +02:00
committed by intellij-monorepo-bot
parent e3341fb2d3
commit 48022d959e
8 changed files with 43 additions and 27 deletions

View File

@@ -147,7 +147,7 @@ fun createJavaClass(klass: KtClass, targetClass: PsiClass?, classKind: ClassKind
val template = klass.toLightClass() ?: KotlinAsJavaSupport.getInstance(klass.project).getFakeLightClass(klass)
copyModifierListItems(template.modifierList!!, javaClass.modifierList!!)
if (targetClass?.parent is PsiFile) {
if (targetClass?.parent is PsiFile && classKind == ClassKind.CLASS) {
javaClass.modifierList!!.setModifierProperty(PsiModifier.STATIC, true)
}
if (template.isInterface) {

View File

@@ -12,7 +12,9 @@ abstract class K2CreateClassFromUsageTest : K2AbstractCreateFromUsageTest("creat
//class AnnotationEntry : K2CreateClassFromUsageTest()
//class CallExpression : K2CreateClassFromUsageTest()
//class DelegationSpecifier : K2CreateClassFromUsageTest()
//class ImportDirective : K2CreateClassFromUsageTest()
class ImportDirective : K2CreateClassFromUsageTest() {
//class Kt21515: K2CreateClassFromUsageTest()
}
class ReferenceExpression : K2CreateClassFromUsageTest()
//class TypeReference : K2CreateClassFromUsageTest()
}

View File

@@ -30,12 +30,8 @@ import org.jetbrains.kotlin.utils.ifEmpty
object K2CreateClassFromUsageBuilder {
fun generateCreateClassActions(element: KtElement): List<IntentionAction> {
//if (true) return listOf()
val refExpr = element.findParentOfType<KtNameReferenceExpression>(strict = false) ?: return listOf()
//if (refExpr.getQualifiedElement() != refExpr) return listOf()
if (refExpr.getParentOfTypeAndBranch<KtCallableReferenceExpression> { callableReference } != null) return listOf()
//val targetParents = mutableListOf<PsiElement>()
val qualifiedElement = refExpr.getQualifiedElement()
var expectedType: ExpectedKotlinType?
var superClassName:String?
@@ -50,27 +46,6 @@ object K2CreateClassFromUsageBuilder {
paramList = renderParamList(superClass, isAny)
returnTypeString = if (superClass == null || superClassName == null || isAny) "" else if (superClass!!.isInterface()) ": $superClassName" else ": $superClassName()"
//if (qualifiedElement == refExpr) {
// // not qualified
// targetParents.addAll(element.parents.filterIsInstance<KtClassOrObject>().toList())
// targetParents += element.containingFile
//}
//else {
// val receiver =
// when (qualifiedElement) {
// is KtQualifiedExpression -> qualifiedElement.receiverExpression.resolveExpression()
// is KtUserType -> null
// else -> null
// }
//
// receiver?.psi?.let { targetParents += it }
//}
//if (targetParents.isEmpty()) {
// targetParents += element.containingFile
//}
//if (getContainer(refExpr) == null) return null
val (classKinds, targetParents) = getPossibleClassKindsAndParents(refExpr)
return classKinds.map { kind ->
val applicableParents = targetParents

View File

@@ -1,6 +1,8 @@
// 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.k2.codeinsight.quickFixes.createFromUsage
import K2CreateClassFromUsageBuilder
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic
import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KotlinQuickFixFactory
@@ -8,6 +10,8 @@ import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KotlinQuickFi
import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KotlinQuickFixesList
import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KtQuickFixesListBuilder
import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtImportDirective
import org.jetbrains.kotlin.psi.KtQualifiedExpression
class K2CreateFromUsageQuickFixesRegistrar : KotlinQuickFixRegistrar() {
@@ -56,6 +60,21 @@ class K2CreateFromUsageQuickFixesRegistrar : KotlinQuickFixRegistrar() {
KotlinQuickFixFactory.IntentionBased { diagnostic: KaFirDiagnostic.ComponentFunctionMissing ->
listOfNotNull(K2CreateParameterFromUsageBuilder.generateCreateParameterActionForComponentFunctionMissing(diagnostic.psi, diagnostic.destructingType))
}
private val createClassFromUsageForUnresolvedImport: KotlinQuickFixFactory.IntentionBased<KaFirDiagnostic.UnresolvedImport> =
KotlinQuickFixFactory.IntentionBased { diagnostic: KaFirDiagnostic.UnresolvedImport ->
createClassFromUsageForUnresolvedImport(diagnostic)
}
private fun createClassFromUsageForUnresolvedImport(diagnostic: KaFirDiagnostic.UnresolvedImport): List<IntentionAction> {
val unresolvedName = diagnostic.reference
val simpleReferences = (diagnostic.psi as KtImportDirective).importedReference?.children ?: emptyArray()
for (simpleReference in simpleReferences) {
if (unresolvedName == simpleReference.text) {
return K2CreateClassFromUsageBuilder.generateCreateClassActions(simpleReference as KtElement)
}
}
return listOf()
}
override val list: KotlinQuickFixesList = KtQuickFixesListBuilder.registerPsiQuickFix {
registerFactory(createFunctionForArgumentTypeMismatch)
@@ -64,5 +83,6 @@ class K2CreateFromUsageQuickFixesRegistrar : KotlinQuickFixRegistrar() {
registerFactory(createVariableForExpressionExpectedPackageFound)
registerFactory(createParameterForNamedParameterNotFound)
registerFactory(createParameterForComponentFunctionMissing)
registerFactory(createClassFromUsageForUnresolvedImport)
}
}