Introduce Parameter: Run usages search under progress manager
#KT-11145 Fixed
This commit is contained in:
+5
-1
@@ -11,6 +11,10 @@
|
|||||||
|
|
||||||
### IDE
|
### IDE
|
||||||
|
|
||||||
|
Issues fixed:
|
||||||
|
|
||||||
|
- [KT-11145](https://youtrack.jetbrains.com/issue/KT-11145) Use progress indicator when searching usages in Introduce Parameter
|
||||||
|
|
||||||
#### Debugger
|
#### Debugger
|
||||||
|
|
||||||
- Do not step into inline lambda argument during step over inside inline function body
|
- Do not step into inline lambda argument during step over inside inline function body
|
||||||
@@ -142,7 +146,7 @@ New features:
|
|||||||
- [KT-11404](https://youtrack.jetbrains.com/issue/KT-11404) Quick fix to let type implement missing interface
|
- [KT-11404](https://youtrack.jetbrains.com/issue/KT-11404) Quick fix to let type implement missing interface
|
||||||
- [KT-6785](https://youtrack.jetbrains.com/issue/KT-6785), [KT-10013](https://youtrack.jetbrains.com/issue/KT-10013), [KT-9996](https://youtrack.jetbrains.com/issue/KT-9996), [KT-11675](https://youtrack.jetbrains.com/issue/KT-11675) Support Smart Enter for trailing lambda argument, try/catch/finally, property setter, init block
|
- [KT-6785](https://youtrack.jetbrains.com/issue/KT-6785), [KT-10013](https://youtrack.jetbrains.com/issue/KT-10013), [KT-9996](https://youtrack.jetbrains.com/issue/KT-9996), [KT-11675](https://youtrack.jetbrains.com/issue/KT-11675) Support Smart Enter for trailing lambda argument, try/catch/finally, property setter, init block
|
||||||
- Add `kotlinClassName()` and `kotlinFunctionName()` macros for use in live templates
|
- Add `kotlinClassName()` and `kotlinFunctionName()` macros for use in live templates
|
||||||
- Auto-configure EAP-repository during Kotlin Maven and Gradle project set up
|
- Auto-configure EAP-repository during Kotlin Maven and Gradle project set up
|
||||||
|
|
||||||
Issues fixed:
|
Issues fixed:
|
||||||
|
|
||||||
|
|||||||
+21
-13
@@ -46,9 +46,11 @@ import org.jetbrains.kotlin.idea.refactoring.KotlinRefactoringBundle
|
|||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.*
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.*
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.*
|
import org.jetbrains.kotlin.idea.refactoring.introduce.*
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.*
|
import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.*
|
||||||
|
import org.jetbrains.kotlin.idea.refactoring.runSynchronouslyWithProgress
|
||||||
import org.jetbrains.kotlin.idea.references.mainReference
|
import org.jetbrains.kotlin.idea.references.mainReference
|
||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
import org.jetbrains.kotlin.idea.util.application.executeCommand
|
import org.jetbrains.kotlin.idea.util.application.executeCommand
|
||||||
|
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
||||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
import org.jetbrains.kotlin.idea.util.approximateWithResolvableType
|
import org.jetbrains.kotlin.idea.util.approximateWithResolvableType
|
||||||
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
||||||
@@ -263,7 +265,7 @@ open class KotlinIntroduceParameterHandler(
|
|||||||
addAll(KotlinNameSuggester.suggestNamesByType(replacementType, nameValidator, "p"))
|
addAll(KotlinNameSuggester.suggestNamesByType(replacementType, nameValidator, "p"))
|
||||||
}
|
}
|
||||||
|
|
||||||
val parametersUsages = findInternalUsagesOfParametersAndReceiver(targetParent, functionDescriptor)
|
val parametersUsages = findInternalUsagesOfParametersAndReceiver(targetParent, functionDescriptor) ?: return
|
||||||
|
|
||||||
val forbiddenRanges =
|
val forbiddenRanges =
|
||||||
if (targetParent is KtClass) {
|
if (targetParent is KtClass) {
|
||||||
@@ -405,16 +407,21 @@ private fun DeclarationDescriptor?.toFunctionDescriptor(targetParent: KtNamedDec
|
|||||||
private fun findInternalUsagesOfParametersAndReceiver(
|
private fun findInternalUsagesOfParametersAndReceiver(
|
||||||
targetParent: KtNamedDeclaration,
|
targetParent: KtNamedDeclaration,
|
||||||
targetDescriptor: FunctionDescriptor
|
targetDescriptor: FunctionDescriptor
|
||||||
): MultiMap<KtElement, KtElement> {
|
): MultiMap<KtElement, KtElement>? {
|
||||||
val usages = MultiMap<KtElement, KtElement>()
|
val usages = MultiMap<KtElement, KtElement>()
|
||||||
targetParent.getValueParameters()
|
val searchComplete = targetParent.project.runSynchronouslyWithProgress("Searching usages of '${targetParent.name}' parameter", true) {
|
||||||
.filter { !it.hasValOrVar() }
|
runReadAction {
|
||||||
.forEach {
|
targetParent.getValueParameters()
|
||||||
val paramUsages = ReferencesSearch.search(it).map { it.element as KtElement }
|
.filter { !it.hasValOrVar() }
|
||||||
if (paramUsages.isNotEmpty()) {
|
.forEach {
|
||||||
usages.put(it, paramUsages)
|
val paramUsages = ReferencesSearch.search(it).map { it.element as KtElement }
|
||||||
}
|
if (paramUsages.isNotEmpty()) {
|
||||||
}
|
usages.put(it, paramUsages)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} != null
|
||||||
|
if (!searchComplete) return null
|
||||||
val receiverTypeRef = (targetParent as? KtFunction)?.receiverTypeReference
|
val receiverTypeRef = (targetParent as? KtFunction)?.receiverTypeReference
|
||||||
if (receiverTypeRef != null) {
|
if (receiverTypeRef != null) {
|
||||||
targetParent.acceptChildren(
|
targetParent.acceptChildren(
|
||||||
@@ -458,11 +465,12 @@ open class KotlinIntroduceLambdaParameterHandler(
|
|||||||
project: Project,
|
project: Project,
|
||||||
editor: Editor,
|
editor: Editor,
|
||||||
lambdaExtractionDescriptor: ExtractableCodeDescriptor
|
lambdaExtractionDescriptor: ExtractableCodeDescriptor
|
||||||
): KotlinIntroduceParameterDialog {
|
): KotlinIntroduceParameterDialog? {
|
||||||
val callable = lambdaExtractionDescriptor.extractionData.targetSibling as KtNamedDeclaration
|
val callable = lambdaExtractionDescriptor.extractionData.targetSibling as KtNamedDeclaration
|
||||||
val descriptor = callable.resolveToDescriptor()
|
val descriptor = callable.resolveToDescriptor()
|
||||||
val callableDescriptor = descriptor.toFunctionDescriptor(callable)
|
val callableDescriptor = descriptor.toFunctionDescriptor(callable)
|
||||||
val originalRange = lambdaExtractionDescriptor.extractionData.originalRange
|
val originalRange = lambdaExtractionDescriptor.extractionData.originalRange
|
||||||
|
val parametersUsages = findInternalUsagesOfParametersAndReceiver(callable, callableDescriptor) ?: return null
|
||||||
val introduceParameterDescriptor = IntroduceParameterDescriptor(
|
val introduceParameterDescriptor = IntroduceParameterDescriptor(
|
||||||
originalRange = originalRange,
|
originalRange = originalRange,
|
||||||
callable = callable,
|
callable = callable,
|
||||||
@@ -471,7 +479,7 @@ open class KotlinIntroduceLambdaParameterHandler(
|
|||||||
newParameterTypeText = "", // to be chosen in the dialog
|
newParameterTypeText = "", // to be chosen in the dialog
|
||||||
argumentValue = KtPsiFactory(project).createExpression("{}"), // substituted later
|
argumentValue = KtPsiFactory(project).createExpression("{}"), // substituted later
|
||||||
withDefaultValue = false,
|
withDefaultValue = false,
|
||||||
parametersUsages = findInternalUsagesOfParametersAndReceiver(callable, callableDescriptor),
|
parametersUsages = parametersUsages,
|
||||||
occurrencesToReplace = listOf(originalRange),
|
occurrencesToReplace = listOf(originalRange),
|
||||||
parametersToRemove = listOf()
|
parametersToRemove = listOf()
|
||||||
)
|
)
|
||||||
@@ -491,7 +499,7 @@ open class KotlinIntroduceLambdaParameterHandler(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val dialog = createDialog(project, editor, lambdaExtractionDescriptor)
|
val dialog = createDialog(project, editor, lambdaExtractionDescriptor) ?: return
|
||||||
if (ApplicationManager.getApplication()!!.isUnitTestMode) {
|
if (ApplicationManager.getApplication()!!.isUnitTestMode) {
|
||||||
dialog.performRefactoring()
|
dialog.performRefactoring()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user