Minor: Extract Preview class

This commit is contained in:
Alexey Sedunov
2015-06-18 15:30:06 +03:00
parent 7ac02d751a
commit 17ca0d2c2c
@@ -95,6 +95,78 @@ public class KotlinInplaceParameterIntroducer(
}
}
private inner class Preview(addedParameter: JetParameter?, currentName: String?) {
private val _rangesToRemove = ArrayList<TextRange>()
var addedRange: TextRange? = null
private set
var text: String
private set
val rangesToRemove: List<TextRange> 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<TextRange>()
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()
}