Support destructuring declarations in scratch files
#KT-25038 fixed
This commit is contained in:
+19
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.diagnostics.rendering.RenderingContext
|
|||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||||
import org.jetbrains.kotlin.idea.scratch.ScratchExpression
|
import org.jetbrains.kotlin.idea.scratch.ScratchExpression
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore
|
||||||
|
|
||||||
class KtScratchSourceFileProcessor {
|
class KtScratchSourceFileProcessor {
|
||||||
companion object {
|
companion object {
|
||||||
@@ -71,6 +72,7 @@ class KtScratchSourceFileProcessor {
|
|||||||
fun process(expression: ScratchExpression) {
|
fun process(expression: ScratchExpression) {
|
||||||
val psiElement = expression.element
|
val psiElement = expression.element
|
||||||
when (psiElement) {
|
when (psiElement) {
|
||||||
|
is KtDestructuringDeclaration -> processDestructuringDeclaration(expression, psiElement)
|
||||||
is KtVariableDeclaration -> processDeclaration(expression, psiElement)
|
is KtVariableDeclaration -> processDeclaration(expression, psiElement)
|
||||||
is KtFunction -> processDeclaration(expression, psiElement)
|
is KtFunction -> processDeclaration(expression, psiElement)
|
||||||
is KtClassOrObject -> processDeclaration(expression, psiElement)
|
is KtClassOrObject -> processDeclaration(expression, psiElement)
|
||||||
@@ -89,6 +91,23 @@ class KtScratchSourceFileProcessor {
|
|||||||
objectBuilder.appendLineInfo(e)
|
objectBuilder.appendLineInfo(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun processDestructuringDeclaration(e: ScratchExpression, c: KtDestructuringDeclaration) {
|
||||||
|
val entries = c.entries.mapNotNull { if (it.isSingleUnderscore) null else it.resolveToDescriptorIfAny() }
|
||||||
|
entries.forEach {
|
||||||
|
val context = RenderingContext.of(it)
|
||||||
|
val rendered = Renderers.COMPACT.render(it, context)
|
||||||
|
classBuilder.append(rendered).newLine()
|
||||||
|
objectBuilder.println(rendered)
|
||||||
|
}
|
||||||
|
objectBuilder.appendLineInfo(e)
|
||||||
|
classBuilder.append("init {").newLine()
|
||||||
|
classBuilder.append(c.text).newLine()
|
||||||
|
entries.forEach {
|
||||||
|
classBuilder.append("this.${it.name} = ${it.name}").newLine()
|
||||||
|
}
|
||||||
|
classBuilder.append("}").newLine()
|
||||||
|
}
|
||||||
|
|
||||||
private fun processExpression(e: ScratchExpression, expr: KtExpression) {
|
private fun processExpression(e: ScratchExpression, expr: KtExpression) {
|
||||||
val resName = "$GET_RES_FUN_NAME_PREFIX$resCount"
|
val resName = "$GET_RES_FUN_NAME_PREFIX$resCount"
|
||||||
|
|
||||||
|
|||||||
Generated
+10
@@ -31,6 +31,11 @@ public class ScratchRunActionTestGenerated extends AbstractScratchRunActionTest
|
|||||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/scripting-support/testData/scratch"), Pattern.compile("^(.+)\\.kts$"), null, false);
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/scripting-support/testData/scratch"), Pattern.compile("^(.+)\\.kts$"), null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("destructuringDecls.kts")
|
||||||
|
public void testDestructuringDecls() throws Exception {
|
||||||
|
runTest("idea/scripting-support/testData/scratch/destructuringDecls.kts");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("for.kts")
|
@TestMetadata("for.kts")
|
||||||
public void testFor() throws Exception {
|
public void testFor() throws Exception {
|
||||||
runTest("idea/scripting-support/testData/scratch/for.kts");
|
runTest("idea/scripting-support/testData/scratch/for.kts");
|
||||||
@@ -119,6 +124,11 @@ public class ScratchRunActionTestGenerated extends AbstractScratchRunActionTest
|
|||||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/scripting-support/testData/scratch"), Pattern.compile("^(.+)\\.kts$"), null, false);
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/scripting-support/testData/scratch"), Pattern.compile("^(.+)\\.kts$"), null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("destructuringDecls.kts")
|
||||||
|
public void testDestructuringDecls() throws Exception {
|
||||||
|
runTest("idea/scripting-support/testData/scratch/destructuringDecls.kts");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("for.kts")
|
@TestMetadata("for.kts")
|
||||||
public void testFor() throws Exception {
|
public void testFor() throws Exception {
|
||||||
runTest("idea/scripting-support/testData/scratch/for.kts");
|
runTest("idea/scripting-support/testData/scratch/for.kts");
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// REPL_MODE: false
|
||||||
|
|
||||||
|
val (foo, bar) = 1 to "2" // RESULT: val foo: Int; val bar: String
|
||||||
|
foo // RESULT: 1
|
||||||
|
bar // RESULT: 2
|
||||||
|
val (_, baz) = 3 to "4" // RESULT: val baz: String
|
||||||
|
baz // RESULT: 4
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// REPL_MODE: ~REPL_MODE~
|
||||||
|
|
||||||
|
val (foo, bar) = 1 to "2"
|
||||||
|
foo
|
||||||
|
bar
|
||||||
|
val (_, baz) = 3 to "4"
|
||||||
|
baz
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// REPL_MODE: true
|
||||||
|
|
||||||
|
val (foo, bar) = 1 to "2"
|
||||||
|
foo // RESULT: res1: kotlin.Int = 1
|
||||||
|
bar // RESULT: res2: kotlin.String = 2
|
||||||
|
val (_, baz) = 3 to "4"
|
||||||
|
baz // RESULT: res4: kotlin.String = 4
|
||||||
Reference in New Issue
Block a user