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 ### 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:
@@ -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()
} }