Introduce Parameter: Run usages search under progress manager

#KT-11145 Fixed
This commit is contained in:
Alexey Sedunov
2016-04-12 16:35:50 +03:00
parent 754e7cac52
commit a65026f584
2 changed files with 26 additions and 14 deletions
+5 -1
View File
@@ -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:
@@ -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<KtElement, KtElement> {
): MultiMap<KtElement, KtElement>? {
val usages = MultiMap<KtElement, KtElement>()
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()
}