[kotlin] k2: enable extract function to scope refactoring

similar to KTIJ-29206

GitOrigin-RevId: d278bb1340087705bfe9e99c93f265a4c6e693ce
This commit is contained in:
Anna Kozlova
2024-03-27 19:30:07 +00:00
committed by intellij-monorepo-bot
parent f540ac01fc
commit d6bb6c080d
5 changed files with 38 additions and 6 deletions
@@ -43,5 +43,10 @@
<add-to-group group-id="IntroduceActionsGroup" anchor="after" relative-to-action="ExtractMethod"/>
<add-to-group group-id="Floating.CodeToolbar.Extract" anchor="first"/>
</action>
<action id="ExtractFunctionToScope" class="org.jetbrains.kotlin.idea.k2.refactoring.extractFunction.ExtractK2FunctionToScopeAction"
use-shortcut-of="ExtractMethod">
<keyboard-shortcut keymap="$default" first-keystroke="control alt shift M"/>
<add-to-group group-id="IntroduceActionsGroup" anchor="after" relative-to-action="ExtractFunction"/>
</action>
</actions>
</idea-plugin>
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.psi.KtElement
class ExtractK2FunctionAction : BasePlatformRefactoringAction() {
override fun getRefactoringHandler(provider: RefactoringSupportProvider): RefactoringActionHandler? =
KotlinFirExtractFunctionHandler()
KotlinFirExtractFunctionHandler(false)
override fun isAvailableInEditorOnly(): Boolean {
return true
@@ -0,0 +1,22 @@
// 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.refactoring.extractFunction
import com.intellij.lang.refactoring.RefactoringSupportProvider
import com.intellij.psi.PsiElement
import com.intellij.refactoring.RefactoringActionHandler
import com.intellij.refactoring.actions.BasePlatformRefactoringAction
import org.jetbrains.kotlin.idea.k2.refactoring.introduce.extractFunction.KotlinFirExtractFunctionHandler
import org.jetbrains.kotlin.psi.KtElement
class ExtractK2FunctionToScopeAction : BasePlatformRefactoringAction() {
override fun getRefactoringHandler(provider: RefactoringSupportProvider): RefactoringActionHandler? =
KotlinFirExtractFunctionHandler(true)
override fun isAvailableInEditorOnly(): Boolean {
return true
}
override fun isEnabledOnElements(elements: Array<out PsiElement>): Boolean =
elements.all { it is KtElement }
}
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.idea.k2.refactoring.extractFunction.ExtractionData
import org.jetbrains.kotlin.idea.k2.refactoring.extractFunction.ExtractionGeneratorConfiguration
import org.jetbrains.kotlin.idea.k2.refactoring.extractFunction.ExtractionResult
import org.jetbrains.kotlin.idea.k2.refactoring.extractFunction.ui.KotlinFirExtractFunctionDialog
import org.jetbrains.kotlin.idea.k2.refactoring.introduce.extractFunction.KotlinFirExtractFunctionHandler.InteractiveExtractionHelper
import org.jetbrains.kotlin.idea.k2.refactoring.introduce.extractionEngine.ExtractionDataAnalyzer
import org.jetbrains.kotlin.idea.k2.refactoring.introduce.extractionEngine.ExtractionEngineHelper
import org.jetbrains.kotlin.idea.refactoring.introduce.extractFunction.AbstractExtractKotlinFunctionHandler
@@ -36,8 +37,11 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.isIdentifier
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class KotlinFirExtractFunctionHandler(private val helper: ExtractionEngineHelper = InplaceExtractionHelper) :
AbstractExtractKotlinFunctionHandler() {
class KotlinFirExtractFunctionHandler(
private val acceptAllScopes: Boolean,
private val helper: ExtractionEngineHelper = InplaceExtractionHelper(acceptAllScopes)
) :
AbstractExtractKotlinFunctionHandler(acceptAllScopes) {
object InteractiveExtractionHelper : ExtractionEngineHelper(EXTRACT_FUNCTION) {
@OptIn(KtAllowAnalysisOnEdt::class)
@@ -59,10 +63,10 @@ class KotlinFirExtractFunctionHandler(private val helper: ExtractionEngineHelper
}
}
object InplaceExtractionHelper : ExtractionEngineHelper(EXTRACT_FUNCTION),
AbstractInplaceExtractionHelper<KtType, ExtractionResult, ExtractableCodeDescriptorWithConflicts> {
class InplaceExtractionHelper(private val acceptAllScopes: Boolean) : ExtractionEngineHelper(EXTRACT_FUNCTION),
AbstractInplaceExtractionHelper<KtType, ExtractionResult, ExtractableCodeDescriptorWithConflicts> {
override fun createRestartHandler(): AbstractExtractKotlinFunctionHandler =
KotlinFirExtractFunctionHandler(InteractiveExtractionHelper)
KotlinFirExtractFunctionHandler(acceptAllScopes, InteractiveExtractionHelper)
override fun extractDuplicates(
duplicateReplacers: Map<KotlinPsiRange, () -> Unit>, project: Project, editor: Editor
@@ -33,6 +33,7 @@ abstract class AbstractK2IntroduceFunctionTest : AbstractExtractionTest() {
extractionOptions: ExtractionOptions
): AbstractExtractKotlinFunctionHandler {
return KotlinFirExtractFunctionHandler(
false,
helper = object : ExtractionEngineHelper(EXTRACT_FUNCTION) {
override fun adjustExtractionData(data: ExtractionData): ExtractionData {
return ActionUtil.underModalProgress(project, "adjust for tests") {