diff --git a/idea/resources/postfixTemplates/KtIntroduceVariablePostfixTemplate/after.kt.template b/idea/resources/postfixTemplates/KtIntroduceVariablePostfixTemplate/after.kt.template new file mode 100644 index 00000000000..92982c00af0 --- /dev/null +++ b/idea/resources/postfixTemplates/KtIntroduceVariablePostfixTemplate/after.kt.template @@ -0,0 +1,4 @@ +fun bar() = 1 +fun foo() { + val bar = bar() +} diff --git a/idea/resources/postfixTemplates/KtIntroduceVariablePostfixTemplate/before.kt.template b/idea/resources/postfixTemplates/KtIntroduceVariablePostfixTemplate/before.kt.template new file mode 100644 index 00000000000..6277d77efa1 --- /dev/null +++ b/idea/resources/postfixTemplates/KtIntroduceVariablePostfixTemplate/before.kt.template @@ -0,0 +1,4 @@ +fun bar() = 1 +fun foo() { + bar()$key +} diff --git a/idea/resources/postfixTemplates/KtIntroduceVariablePostfixTemplate/description.html b/idea/resources/postfixTemplates/KtIntroduceVariablePostfixTemplate/description.html new file mode 100644 index 00000000000..1c7fad98bb3 --- /dev/null +++ b/idea/resources/postfixTemplates/KtIntroduceVariablePostfixTemplate/description.html @@ -0,0 +1,5 @@ + + +Creates variable from given expression. + + diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/postfix/KtPostfixTemplateProvider.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/postfix/KtPostfixTemplateProvider.kt index f5e161901a2..8b791af0f84 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/postfix/KtPostfixTemplateProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/postfix/KtPostfixTemplateProvider.kt @@ -24,6 +24,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.intentions.negate +import org.jetbrains.kotlin.idea.refactoring.introduce.introduceVariable.KotlinIntroduceVariableHandler import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.calls.callUtil.getType @@ -41,7 +42,9 @@ class KtPostfixTemplateProvider : PostfixTemplateProvider { KtNotNullPostfixTemplate("nn"), KtIsNullPostfixTemplate, KtWhenExpressionPostfixTemplate, - KtTryPostfixTemplate + KtTryPostfixTemplate, + KtIntroduceVariablePostfixTemplate("val"), + KtIntroduceVariablePostfixTemplate("var") ) override fun isTerminalSymbol(currentChar: Char) = currentChar == '.' || currentChar == '!' @@ -60,6 +63,19 @@ private object KtNotPostfixTemplate : NotPostfixTemplate( createExpressionSelector { it.isBoolean() } ) +private class KtIntroduceVariablePostfixTemplate( + val kind: String +) : PostfixTemplateWithExpressionSelector(kind, "$kind name = expression", createExpressionSelector()) { + override fun expandForChooseExpression(expression: PsiElement, editor: Editor) { + KotlinIntroduceVariableHandler.doRefactoring( + expression.project, editor, expression as KtExpression, + isVar = kind == "var", + occurrencesToReplace = null, + onNonInteractiveFinish = null + ) + } +} + internal object KtPostfixTemplatePsiInfo : PostfixTemplatePsiInfo() { override fun createExpression(context: PsiElement, prefix: String, suffix: String) = KtPsiFactory(context.project).createExpression(prefix + context.text + suffix) diff --git a/idea/testData/codeInsight/postfix/val.kt b/idea/testData/codeInsight/postfix/val.kt new file mode 100644 index 00000000000..3e1e14fb728 --- /dev/null +++ b/idea/testData/codeInsight/postfix/val.kt @@ -0,0 +1,4 @@ +fun bar() = 1 +fun foo() { + val x = bar().val +} diff --git a/idea/testData/codeInsight/postfix/val.kt.after b/idea/testData/codeInsight/postfix/val.kt.after new file mode 100644 index 00000000000..4501e4a1091 --- /dev/null +++ b/idea/testData/codeInsight/postfix/val.kt.after @@ -0,0 +1,5 @@ +fun bar() = 1 +fun foo() { + val bar = bar() + val x = bar +} diff --git a/idea/testData/codeInsight/postfix/var.kt b/idea/testData/codeInsight/postfix/var.kt new file mode 100644 index 00000000000..00cde99742f --- /dev/null +++ b/idea/testData/codeInsight/postfix/var.kt @@ -0,0 +1,4 @@ +fun bar() = 1 +fun foo() { + val x = bar().var +} diff --git a/idea/testData/codeInsight/postfix/var.kt.after b/idea/testData/codeInsight/postfix/var.kt.after new file mode 100644 index 00000000000..12cb37119d2 --- /dev/null +++ b/idea/testData/codeInsight/postfix/var.kt.after @@ -0,0 +1,5 @@ +fun bar() = 1 +fun foo() { + var bar = bar() + val x = bar +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/postfix/PostfixTemplateProviderTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/postfix/PostfixTemplateProviderTestGenerated.java index 89229d51853..ec9d5fc3358 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/postfix/PostfixTemplateProviderTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/postfix/PostfixTemplateProviderTestGenerated.java @@ -77,6 +77,18 @@ public class PostfixTemplateProviderTestGenerated extends AbstractPostfixTemplat doTest(fileName); } + @TestMetadata("val.kt") + public void testVal() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/postfix/val.kt"); + doTest(fileName); + } + + @TestMetadata("var.kt") + public void testVar() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/postfix/var.kt"); + doTest(fileName); + } + @TestMetadata("when.kt") public void testWhen() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/postfix/when.kt");