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 descriptor = originalDescriptor
|
||||||
private var replaceAllCheckBox: JCheckBox? = null
|
private var replaceAllCheckBox: JCheckBox? = null
|
||||||
|
|
||||||
@@ -135,7 +207,7 @@ public class KotlinInplaceParameterIntroducer(
|
|||||||
with(descriptor) {
|
with(descriptor) {
|
||||||
val parameterList = callable.getValueParameterList()
|
val parameterList = callable.getValueParameterList()
|
||||||
?: (callable as JetClass).createPrimaryConstructorParameterListIfAbsent()
|
?: (callable as JetClass).createPrimaryConstructorParameterListIfAbsent()
|
||||||
val parameter = JetPsiFactory(myProject).createParameter("${newParameterName}: ${newParameterTypeText}")
|
val parameter = JetPsiFactory(myProject).createParameter("$newParameterName: $newParameterTypeText")
|
||||||
parameterList.addParameter(parameter)
|
parameterList.addParameter(parameter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -156,71 +228,15 @@ public class KotlinInplaceParameterIntroducer(
|
|||||||
override fun getComponent() = myWholePanel
|
override fun getComponent() = myWholePanel
|
||||||
|
|
||||||
override fun updateTitle(addedParameter: JetParameter?, currentName: String?) {
|
override fun updateTitle(addedParameter: JetParameter?, currentName: String?) {
|
||||||
val templateState = TemplateManagerImpl.getTemplateState(myEditor)
|
val preview = Preview(addedParameter, currentName)
|
||||||
if (templateState == null || templateState.getTemplate() == null) return
|
|
||||||
|
|
||||||
val currentType = templateState
|
val document = getPreviewEditor().getDocument()
|
||||||
.getVariableValue(KotlinInplaceVariableIntroducer.TYPE_REFERENCE_VARIABLE_NAME)
|
runWriteAction { document.setText(preview.text) }
|
||||||
?.getText()
|
|
||||||
|
|
||||||
with (descriptor) {
|
val markupModel = DocumentMarkupModel.forDocument(document, myProject, true)
|
||||||
val rangesToRemove = ArrayList<TextRange>()
|
markupModel.removeAllHighlighters()
|
||||||
var addedRange: TextRange? = null
|
preview.rangesToRemove.forEach { PreviewDecorator.FOR_REMOVAL.applyToRange(it, markupModel) }
|
||||||
val builder = StringBuilder()
|
preview.addedRange?.let { PreviewDecorator.FOR_ADD.applyToRange(it, markupModel) }
|
||||||
|
|
||||||
(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) }
|
|
||||||
}
|
|
||||||
revalidate()
|
revalidate()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user