Minor: Extract Preview class
This commit is contained in:
+80
-64
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user