diff --git a/ChangeLog.md b/ChangeLog.md index ec8d8821be5..5f5ee5eb3c0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -11,6 +11,10 @@ ### IDE +Issues fixed: + +- [KT-11145](https://youtrack.jetbrains.com/issue/KT-11145) Use progress indicator when searching usages in Introduce Parameter + #### Debugger - 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-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 -- 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: diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt index 8eb4fa2e0cb..fae65e4173a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt @@ -46,9 +46,11 @@ import org.jetbrains.kotlin.idea.refactoring.KotlinRefactoringBundle import org.jetbrains.kotlin.idea.refactoring.changeSignature.* import org.jetbrains.kotlin.idea.refactoring.introduce.* 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.util.IdeDescriptorRenderers 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.approximateWithResolvableType import org.jetbrains.kotlin.idea.util.getResolutionScope @@ -263,7 +265,7 @@ open class KotlinIntroduceParameterHandler( addAll(KotlinNameSuggester.suggestNamesByType(replacementType, nameValidator, "p")) } - val parametersUsages = findInternalUsagesOfParametersAndReceiver(targetParent, functionDescriptor) + val parametersUsages = findInternalUsagesOfParametersAndReceiver(targetParent, functionDescriptor) ?: return val forbiddenRanges = if (targetParent is KtClass) { @@ -405,16 +407,21 @@ private fun DeclarationDescriptor?.toFunctionDescriptor(targetParent: KtNamedDec private fun findInternalUsagesOfParametersAndReceiver( targetParent: KtNamedDeclaration, targetDescriptor: FunctionDescriptor -): MultiMap { +): MultiMap? { val usages = MultiMap() - targetParent.getValueParameters() - .filter { !it.hasValOrVar() } - .forEach { - val paramUsages = ReferencesSearch.search(it).map { it.element as KtElement } - if (paramUsages.isNotEmpty()) { - usages.put(it, paramUsages) - } - } + val searchComplete = targetParent.project.runSynchronouslyWithProgress("Searching usages of '${targetParent.name}' parameter", true) { + runReadAction { + targetParent.getValueParameters() + .filter { !it.hasValOrVar() } + .forEach { + 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 if (receiverTypeRef != null) { targetParent.acceptChildren( @@ -458,11 +465,12 @@ open class KotlinIntroduceLambdaParameterHandler( project: Project, editor: Editor, lambdaExtractionDescriptor: ExtractableCodeDescriptor - ): KotlinIntroduceParameterDialog { + ): KotlinIntroduceParameterDialog? { val callable = lambdaExtractionDescriptor.extractionData.targetSibling as KtNamedDeclaration val descriptor = callable.resolveToDescriptor() val callableDescriptor = descriptor.toFunctionDescriptor(callable) val originalRange = lambdaExtractionDescriptor.extractionData.originalRange + val parametersUsages = findInternalUsagesOfParametersAndReceiver(callable, callableDescriptor) ?: return null val introduceParameterDescriptor = IntroduceParameterDescriptor( originalRange = originalRange, callable = callable, @@ -471,7 +479,7 @@ open class KotlinIntroduceLambdaParameterHandler( newParameterTypeText = "", // to be chosen in the dialog argumentValue = KtPsiFactory(project).createExpression("{}"), // substituted later withDefaultValue = false, - parametersUsages = findInternalUsagesOfParametersAndReceiver(callable, callableDescriptor), + parametersUsages = parametersUsages, occurrencesToReplace = listOf(originalRange), parametersToRemove = listOf() ) @@ -491,7 +499,7 @@ open class KotlinIntroduceLambdaParameterHandler( return } - val dialog = createDialog(project, editor, lambdaExtractionDescriptor) + val dialog = createDialog(project, editor, lambdaExtractionDescriptor) ?: return if (ApplicationManager.getApplication()!!.isUnitTestMode) { dialog.performRefactoring() }