mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
K2: support creating class from usage from import directive (part of KTIJ-28671 K2: CreateClassFromUsageFix)
GitOrigin-RevId: 47c044231f74811fc51a645c3c67814ae28cddf1
This commit is contained in:
committed by
intellij-monorepo-bot
parent
e3341fb2d3
commit
48022d959e
@@ -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) {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
public class J {
|
||||
|
||||
public @interface A {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
public class J {
|
||||
|
||||
public enum A {}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
public class J {
|
||||
|
||||
public interface A {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
class J {
|
||||
|
||||
public interface A {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user