fix extensionFunOnTypeFromAnotherPackage test (part of KTIJ-28926 K2: Create Function From Usage Fix)

GitOrigin-RevId: 652381bf858fcdb335959b70dd9d534d0b097462
This commit is contained in:
Alexey Kudravtsev
2024-04-09 15:32:15 +00:00
committed by intellij-monorepo-bot
parent 9a45358f1c
commit 8393f98d28
6 changed files with 25 additions and 11 deletions
@@ -142,7 +142,7 @@ internal class CreateKotlinCallableAction(
append(KtTokens.FUN_KEYWORD)
append(" ")
val (receiver, receiverTypeText) = if (request is CreateMethodFromKotlinUsageRequest) CreateKotlinCallableActionTextBuilder.renderReceiver(request) else "" to ""
val (receiver, receiverTypeText) = if (request is CreateMethodFromKotlinUsageRequest) CreateKotlinCallableActionTextBuilder.renderReceiver(request, container) else "" to ""
append(renderTypeParameterDeclarations(request, container, receiverTypeText))
if ((request as? CreateMethodFromKotlinUsageRequest)?.isExtension == true) {
if (receiver.isNotEmpty()) {
@@ -13,7 +13,9 @@ import org.jetbrains.kotlin.analysis.api.types.KtFunctionalType
import org.jetbrains.kotlin.analysis.api.types.KtNonErrorClassType
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter
import org.jetbrains.kotlin.idea.base.psi.classIdIfNonLocal
import org.jetbrains.kotlin.idea.base.resources.KotlinBundle
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.types.Variance
/**
@@ -32,7 +34,7 @@ object CreateKotlinCallableActionTextBuilder {
append(callableKindAsString)
if (request.methodName.isNotEmpty()) {
val (receiver,_) = renderReceiver(request)
val (receiver,_) = renderReceiver(request, request.call)
append(" '$receiver${request.methodName}'")
}
}
@@ -46,7 +48,7 @@ object CreateKotlinCallableActionTextBuilder {
}
// text, receiverTypeText
fun renderReceiver(request: CreateMethodFromKotlinUsageRequest): Pair<String,String> {
fun renderReceiver(request: CreateMethodFromKotlinUsageRequest, container: KtElement): Pair<String,String> {
analyze(request.call) {
val receiverSymbol: KtSymbol?
val receiverTypeText: String
@@ -55,13 +57,15 @@ object CreateKotlinCallableActionTextBuilder {
receiverSymbol = null
receiverTypeText = request.receiverType.render(RENDERER_OPTION_FOR_CREATE_FROM_USAGE_TEXT, Variance.INVARIANT)
} else {
// Since receiverExpression.getKtType() returns `kotlin/Unit` for a companion object, we first try the symbol resolution and
// its type rendering.
receiverSymbol = request.receiverExpression.resolveExpression()
val receiverType = request.receiverType ?: request.receiverExpression.getKtType()
receiverTypeText = receiverSymbol?.renderAsReceiver(request.isAbstractClassOrInterface, receiverType)
val recPackageFqName = request.receiverExpression.getKtType()?.convertToClass()?.classIdIfNonLocal?.packageFqName
val addedPackage = if (recPackageFqName == container.containingKtFile.packageFqName || recPackageFqName == null || recPackageFqName.asString().startsWith("kotlin")) "" else recPackageFqName.asString()+"."
// Since receiverExpression.getKtType() returns `kotlin/Unit` for a companion object, we first try the symbol resolution and its type rendering.
val renderedReceiver = receiverSymbol?.renderAsReceiver(request.isAbstractClassOrInterface, receiverType)
?: receiverType?.render(RENDERER_OPTION_FOR_CREATE_FROM_USAGE_TEXT, Variance.INVARIANT)
?: request.receiverExpression.text
receiverTypeText = addedPackage + renderedReceiver
}
return if (request.isExtension && receiverSymbol is KtCallableSymbol) {
val receiverType = receiverSymbol.returnType
@@ -58,9 +58,8 @@ internal class CreateKotlinCallablePsiEditor(
fun execute(anchor: PsiElement, request: CreateMethodRequest) {
val factory = KtPsiFactory(project)
var function = factory.createFunction(callableInfo.definitionAsString)
val passedContainerElement = pointerToContainer.element
if (passedContainerElement == null) return
val shouldComputeContainerFromAnchor = if (passedContainerElement is PsiFile) passedContainerElement == anchor.containingFile
val passedContainerElement = pointerToContainer.element ?: return
val shouldComputeContainerFromAnchor = if (passedContainerElement is PsiFile) passedContainerElement == anchor.containingFile && (request as? CreateMethodFromKotlinUsageRequest)?.isExtension != true
else passedContainerElement.getContainer() == anchor.getContainer()
val insertContainer: PsiElement = if (shouldComputeContainerFromAnchor) {
(anchor.getExtractionContainers().firstOrNull() ?: return)
@@ -1,4 +1,4 @@
// "Create extension function 'A.foo'" "true"
// "/(Create extension function 'A.foo')|(Create extension function 'package2.A.foo')/" "true"
// ERROR: Unresolved reference: foo
import package1.A
@@ -1,4 +1,4 @@
// "Create extension function 'A.foo'" "true"
// "/(Create extension function 'A.foo')|(Create extension function 'package2.A.foo')/" "true"
// ERROR: Unresolved reference: foo
import package1.A
@@ -0,0 +1,11 @@
// "Create extension function '((Int) -> String).bar'" "true"
// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.createFromUsage.createCallable.CreateExtensionCallableFromUsageFix
// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.k2.codeinsight.quickFixes.createFromUsage.CreateKotlinCallableAction
fun foo(block: (Int) -> String) {
block.bar()
}
private fun ((Int) -> String).bar() {
TODO("Not yet implemented")
}