Introduce Variable: Retain entered name after changing "Specify type explicitly" option
#KT-13128 Fixed
This commit is contained in:
@@ -245,6 +245,7 @@ Using 'this' as function argument in constructor of non-final class
|
|||||||
- [`KT-12943`](https://youtrack.jetbrains.com/issue/KT-12943) Rename: Show function signatures in "Rename Overloads" dialog
|
- [`KT-12943`](https://youtrack.jetbrains.com/issue/KT-12943) Rename: Show function signatures in "Rename Overloads" dialog
|
||||||
- [`KT-13157`](https://youtrack.jetbrains.com/issue/KT-13157) Extract Function: Automatically quote function name if necessary
|
- [`KT-13157`](https://youtrack.jetbrains.com/issue/KT-13157) Extract Function: Automatically quote function name if necessary
|
||||||
- [`KT-13010`](https://youtrack.jetbrains.com/issue/KT-13010) Extract Function: Fix generation of destructuring declarations
|
- [`KT-13010`](https://youtrack.jetbrains.com/issue/KT-13010) Extract Function: Fix generation of destructuring declarations
|
||||||
|
- [`KT-13128`](https://youtrack.jetbrains.com/issue/KT-13128) Introduce Variable: Retain entered name after changing "Specify type explicitly" option
|
||||||
|
|
||||||
##### New features
|
##### New features
|
||||||
|
|
||||||
|
|||||||
+9
@@ -24,6 +24,8 @@ import com.intellij.refactoring.introduce.inplace.AbstractInplaceIntroducer
|
|||||||
import com.intellij.refactoring.rename.inplace.InplaceRefactoring
|
import com.intellij.refactoring.rename.inplace.InplaceRefactoring
|
||||||
import com.intellij.util.ui.FormBuilder
|
import com.intellij.util.ui.FormBuilder
|
||||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||||
|
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
|
||||||
|
import org.jetbrains.kotlin.idea.core.quoteIfNeeded
|
||||||
import org.jetbrains.kotlin.idea.core.replaced
|
import org.jetbrains.kotlin.idea.core.replaced
|
||||||
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
@@ -62,6 +64,13 @@ abstract class AbstractKotlinInplaceIntroducer<D: KtNamedDeclaration>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun updateVariableName() {
|
||||||
|
val currentName = inputName.quoteIfNeeded()
|
||||||
|
if (KotlinNameSuggester.isIdentifier(currentName)) {
|
||||||
|
localVariable.setName(currentName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun getActionName(): String? = null
|
override fun getActionName(): String? = null
|
||||||
|
|
||||||
override fun restoreExpression(
|
override fun restoreExpression(
|
||||||
|
|||||||
+12
-1
@@ -28,6 +28,8 @@ import com.intellij.psi.PsiFile
|
|||||||
import com.intellij.psi.PsiReference
|
import com.intellij.psi.PsiReference
|
||||||
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil
|
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil
|
||||||
import com.intellij.ui.NonFocusableCheckBox
|
import com.intellij.ui.NonFocusableCheckBox
|
||||||
|
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
|
||||||
|
import org.jetbrains.kotlin.idea.core.quoteIfNeeded
|
||||||
import org.jetbrains.kotlin.idea.intentions.SpecifyTypeExplicitlyIntention
|
import org.jetbrains.kotlin.idea.intentions.SpecifyTypeExplicitlyIntention
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.AbstractKotlinInplaceIntroducer
|
import org.jetbrains.kotlin.idea.refactoring.introduce.AbstractKotlinInplaceIntroducer
|
||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
@@ -39,6 +41,8 @@ import org.jetbrains.kotlin.psi.KtProperty
|
|||||||
import org.jetbrains.kotlin.psi.KtPsiFactory
|
import org.jetbrains.kotlin.psi.KtPsiFactory
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
import java.util.*
|
||||||
|
import javax.swing.JCheckBox
|
||||||
|
|
||||||
class KotlinVariableInplaceIntroducer(
|
class KotlinVariableInplaceIntroducer(
|
||||||
val addedVariable: KtProperty,
|
val addedVariable: KtProperty,
|
||||||
@@ -61,6 +65,7 @@ class KotlinVariableInplaceIntroducer(
|
|||||||
editor
|
editor
|
||||||
) {
|
) {
|
||||||
private val suggestedNames = suggestedNames.toTypedArray()
|
private val suggestedNames = suggestedNames.toTypedArray()
|
||||||
|
private lateinit var expressionTypeCheckBox: JCheckBox
|
||||||
|
|
||||||
init {
|
init {
|
||||||
initFormComponents {
|
initFormComponents {
|
||||||
@@ -81,11 +86,12 @@ class KotlinVariableInplaceIntroducer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (expressionType != null && !noTypeInference) {
|
if (expressionType != null && !noTypeInference) {
|
||||||
val expressionTypeCheckBox = NonFocusableCheckBox("Specify type explicitly")
|
expressionTypeCheckBox = NonFocusableCheckBox("Specify type explicitly")
|
||||||
expressionTypeCheckBox.isSelected = false
|
expressionTypeCheckBox.isSelected = false
|
||||||
expressionTypeCheckBox.setMnemonic('t')
|
expressionTypeCheckBox.setMnemonic('t')
|
||||||
expressionTypeCheckBox.addActionListener {
|
expressionTypeCheckBox.addActionListener {
|
||||||
runWriteCommandAndRestart {
|
runWriteCommandAndRestart {
|
||||||
|
updateVariableName()
|
||||||
if (expressionTypeCheckBox.isSelected) {
|
if (expressionTypeCheckBox.isSelected) {
|
||||||
val renderedType = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(expressionType)
|
val renderedType = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(expressionType)
|
||||||
addedVariable.setTypeReference(KtPsiFactory(myProject).createType(renderedType))
|
addedVariable.setTypeReference(KtPsiFactory(myProject).createType(renderedType))
|
||||||
@@ -117,6 +123,8 @@ class KotlinVariableInplaceIntroducer(
|
|||||||
stringUsages: Collection<Pair<PsiElement, TextRange>>,
|
stringUsages: Collection<Pair<PsiElement, TextRange>>,
|
||||||
scope: PsiElement,
|
scope: PsiElement,
|
||||||
containingFile: PsiFile): Boolean {
|
containingFile: PsiFile): Boolean {
|
||||||
|
myNameSuggestions = myNameSuggestions.mapTo(LinkedHashSet(), String::quoteIfNeeded)
|
||||||
|
|
||||||
myEditor.caretModel.moveToOffset(nameIdentifier!!.startOffset)
|
myEditor.caretModel.moveToOffset(nameIdentifier!!.startOffset)
|
||||||
|
|
||||||
val result = super.buildTemplateAndStart(refs, stringUsages, scope, containingFile)
|
val result = super.buildTemplateAndStart(refs, stringUsages, scope, containingFile)
|
||||||
@@ -129,7 +137,10 @@ class KotlinVariableInplaceIntroducer(
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getInitialName() = super.getInitialName().quoteIfNeeded()
|
||||||
|
|
||||||
override fun updateTitle(variable: KtProperty?, value: String?) {
|
override fun updateTitle(variable: KtProperty?, value: String?) {
|
||||||
|
expressionTypeCheckBox.isEnabled = value == null || KotlinNameSuggester.isIdentifier(value)
|
||||||
// No preview to update
|
// No preview to update
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user