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");