From 17ca0d2c2c6ab1881026cc5dfb6dbe4e42548063 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 18 Jun 2015 15:30:06 +0300 Subject: [PATCH] Minor: Extract Preview class --- .../KotlinInplaceParameterIntroducer.kt | 144 ++++++++++-------- 1 file changed, 80 insertions(+), 64 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinInplaceParameterIntroducer.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinInplaceParameterIntroducer.kt index d7de4f7543b..1d48f2416e1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinInplaceParameterIntroducer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinInplaceParameterIntroducer.kt @@ -95,6 +95,78 @@ public class KotlinInplaceParameterIntroducer( } } + private inner class Preview(addedParameter: JetParameter?, currentName: String?) { + private val _rangesToRemove = ArrayList() + + var addedRange: TextRange? = null + private set + + var text: String + private set + + val rangesToRemove: List get() = _rangesToRemove + + init { + val templateState = TemplateManagerImpl.getTemplateState(myEditor) + val currentType = if (templateState != null && templateState.getTemplate() != null) { + templateState + .getVariableValue(KotlinInplaceVariableIntroducer.TYPE_REFERENCE_VARIABLE_NAME) + ?.getText() + } else null + + val builder = StringBuilder() + + with(descriptor) { + (callable as? JetFunction)?.getReceiverTypeReference()?.let { receiverTypeRef -> + builder.append(receiverTypeRef.getText()).append('.') + if (!descriptor.withDefaultValue && receiverTypeRef in parametersToRemove) { + _rangesToRemove.add(TextRange(0, builder.length())) + } + } + + builder.append(callable.getName()) + + val parameters = callable.getValueParameters() + builder.append("(") + for (i in parameters.indices) { + val parameter = parameters[i] + + val parameterText = if (parameter == addedParameter){ + val parameterName = currentName ?: parameter.getName() + val parameterType = currentType ?: parameter.getTypeReference()!!.getText() + descriptor = descriptor.copy(newParameterName = parameterName, newParameterTypeText = parameterType) + val modifier = if (valVar != JetValVar.None) "${valVar.name} " else "" + val defaultValue = if (withDefaultValue) " = ${newArgumentValue.getText()}" else "" + + "$modifier$parameterName: $parameterType$defaultValue" + } + else parameter.getText() + + builder.append(parameterText) + + val range = TextRange(builder.length() - parameterText.length(), builder.length()) + if (parameter == addedParameter) { + addedRange = range + } + else if (!descriptor.withDefaultValue && parameter in parametersToRemove) { + _rangesToRemove.add(range) + } + + if (i < parameters.lastIndex) { + builder.append(", ") + } + } + builder.append(")") + + if (addedRange == null) { + LOG.error("Added parameter not found: ${callable.getElementTextWithContext()}") + } + } + + $text = builder.toString() + } + } + private var descriptor = originalDescriptor private var replaceAllCheckBox: JCheckBox? = null @@ -135,7 +207,7 @@ public class KotlinInplaceParameterIntroducer( with(descriptor) { val parameterList = callable.getValueParameterList() ?: (callable as JetClass).createPrimaryConstructorParameterListIfAbsent() - val parameter = JetPsiFactory(myProject).createParameter("${newParameterName}: ${newParameterTypeText}") + val parameter = JetPsiFactory(myProject).createParameter("$newParameterName: $newParameterTypeText") parameterList.addParameter(parameter) } } @@ -156,71 +228,15 @@ public class KotlinInplaceParameterIntroducer( override fun getComponent() = myWholePanel override fun updateTitle(addedParameter: JetParameter?, currentName: String?) { - val templateState = TemplateManagerImpl.getTemplateState(myEditor) - if (templateState == null || templateState.getTemplate() == null) return + val preview = Preview(addedParameter, currentName) - val currentType = templateState - .getVariableValue(KotlinInplaceVariableIntroducer.TYPE_REFERENCE_VARIABLE_NAME) - ?.getText() + val document = getPreviewEditor().getDocument() + runWriteAction { document.setText(preview.text) } - with (descriptor) { - val rangesToRemove = ArrayList() - var addedRange: TextRange? = null - val builder = StringBuilder() - - (callable as? JetFunction)?.getReceiverTypeReference()?.let { receiverTypeRef -> - builder.append(receiverTypeRef.getText()).append('.') - if (!descriptor.withDefaultValue && receiverTypeRef in parametersToRemove) { - rangesToRemove.add(TextRange(0, builder.length())) - } - } - - builder.append(callable.getName()) - - val parameters = callable.getValueParameters() - builder.append("(") - for (i in parameters.indices) { - val parameter = parameters[i] - - val parameterText = if (parameter == addedParameter){ - val parameterName = currentName ?: parameter.getName() - val parameterType = currentType ?: parameter.getTypeReference()!!.getText() - descriptor = descriptor.copy(newParameterName = parameterName, newParameterTypeText = parameterType) - val modifier = if (valVar != JetValVar.None) "${valVar.name} " else "" - val defaultValue = if (withDefaultValue) " = ${newArgumentValue.getText()}" else "" - - "$modifier$parameterName: $parameterType$defaultValue" - } - else parameter.getText() - - builder.append(parameterText) - - val range = TextRange(builder.length() - parameterText.length(), builder.length()) - if (parameter == addedParameter) { - addedRange = range - } - else if (!descriptor.withDefaultValue && parameter in parametersToRemove) { - rangesToRemove.add(range) - } - - if (i < parameters.lastIndex) { - builder.append(", ") - } - } - builder.append(")") - - if (addedRange == null) { - LOG.error("Added parameter not found: ${callable.getElementTextWithContext()}") - } - - val document = getPreviewEditor().getDocument() - runWriteAction { document.setText(builder.toString()) } - - val markupModel = DocumentMarkupModel.forDocument(document, myProject, true) - markupModel.removeAllHighlighters() - rangesToRemove.forEach { PreviewDecorator.FOR_REMOVAL.applyToRange(it, markupModel) } - addedRange?.let { PreviewDecorator.FOR_ADD.applyToRange(it, markupModel) } - } + val markupModel = DocumentMarkupModel.forDocument(document, myProject, true) + markupModel.removeAllHighlighters() + preview.rangesToRemove.forEach { PreviewDecorator.FOR_REMOVAL.applyToRange(it, markupModel) } + preview.addedRange?.let { PreviewDecorator.FOR_ADD.applyToRange(it, markupModel) } revalidate() }