Scripting: remove processing IrExpression when explain #KTIJ-35719
diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/extensions/ScriptingProcessSourcesBeforeCompilingExtension.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/extensions/ScriptingProcessSourcesBeforeCompilingExtension.kt index 81e552b..4a14b8c 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/extensions/ScriptingProcessSourcesBeforeCompilingExtension.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/extensions/ScriptingProcessSourcesBeforeCompilingExtension.kt
@@ -123,14 +123,6 @@ } return super.visitScriptNew(declaration) } - - override fun visitExpression(expression: IrExpression): IrExpression { - val symbol = currentScope!!.scope.scopeOwnerSymbol - val builder = DeclarationIrBuilder(context, symbol, expression.startOffset, expression.endOffset) - return builder.irExplain(expression, sourceFile) { variables -> - variables.last() - } - } } class ScriptingIrExplainGenerationExtension(val project: MockProject) : IrGenerationExtension {
diff --git a/plugins/scripting/scripting-compiler/testData/compiler/explain/explainWithNonLastExpr.kts b/plugins/scripting/scripting-compiler/testData/compiler/explain/explainWithNonLastExpr.kts new file mode 100644 index 0000000..3caa9c8 --- /dev/null +++ b/plugins/scripting/scripting-compiler/testData/compiler/explain/explainWithNonLastExpr.kts
@@ -0,0 +1,5 @@ +val a = 7 + +6 * 7 + +42 / 7
diff --git a/plugins/scripting/scripting-compiler/testData/compiler/explain/ifStatement.kts b/plugins/scripting/scripting-compiler/testData/compiler/explain/ifStatement.kts new file mode 100644 index 0000000..a137def --- /dev/null +++ b/plugins/scripting/scripting-compiler/testData/compiler/explain/ifStatement.kts
@@ -0,0 +1,7 @@ +fun foo(): Boolean { + if (false) return true + + return false +} + +foo() \ No newline at end of file
diff --git a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingWithExplanationCompilerTest.kt b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingWithExplanationCompilerTest.kt index 249b942..a73c8c9 100644 --- a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingWithExplanationCompilerTest.kt +++ b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingWithExplanationCompilerTest.kt
@@ -6,6 +6,7 @@ package org.jetbrains.kotlin.scripting.compiler.plugin import org.jetbrains.kotlin.cli.common.CLICompiler +import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.cliArgument import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback @@ -55,10 +56,10 @@ } ) -private class KotlinExplainCompilationConfiguration() : ScriptCompilationConfiguration( +private class KotlinExplainCompilationConfiguration : ScriptCompilationConfiguration( { displayName("Kotlin Scratch") - explainField("\$\$explain") + explainField($$$"$$explain") }) private class KotlinExplainHostConfiguration : ScriptingHostConfiguration( @@ -66,11 +67,15 @@ getScriptingClass(JvmGetScriptingClass()) }) +private val additionalClasspath = System.getProperty("kotlin.test.script.classpath") +private val powerAssertJar = File("dist/kotlinc/lib/power-assert-compiler-plugin.jar").absolutePath class ScriptingWithExplanationCompilerTest { companion object { const val TEST_DATA_DIR = "plugins/scripting/scripting-compiler/testData" - const val TEST_SCRIPT_TO_EXPLAIN = "$TEST_DATA_DIR/compiler/explain/simpleExplain.kts" + const val TEST_SCRIPT_TO_EXPLAIN_1 = "$TEST_DATA_DIR/compiler/explain/simpleExplain.kts" + const val TEST_SCRIPT_TO_EXPLAIN_2 = "$TEST_DATA_DIR/compiler/explain/explainWithNonLastExpr.kts" + const val TEST_SCRIPT_TO_EXPLAIN_3 = "$TEST_DATA_DIR/compiler/explain/ifStatement.kts" } init { @@ -79,27 +84,9 @@ @Test fun scriptShouldFlushExplainInformationAfterEvaluation() { - val additionalClasspath = System.getProperty("kotlin.test.script.classpath") - val powerAssertJar = File("dist/kotlinc/lib/power-assert-compiler-plugin.jar").absolutePath withTempDir { _ -> val (out, err, ret) = captureOutErrRet { - CLICompiler.doMainNoExit( - K2JVMCompiler(), - arrayOf( - "-P", - "plugin:kotlin.scripting:disable-script-definitions-autoloading=true", - "-P", - "plugin:kotlin.scripting:disable-standard-script=true", - "-P", - "plugin:kotlin.scripting:enable-script-explanation=true", - "-Xplugin=$powerAssertJar", - "-P", - "plugin:kotlin.scripting:script-templates=${KotlinExplainScript::class.java.name}", - K2JVMCompilerArguments::classpath.cliArgument, additionalClasspath, - "-script", - TEST_SCRIPT_TO_EXPLAIN, - ) - ) + runScriptWithExplain(TEST_SCRIPT_TO_EXPLAIN_1) } val lines = pathToExplainingFile.readLines() assertEquals( @@ -114,9 +101,59 @@ "(82, 83) = 1", "(78, 83) = 4", "(74, 83) = kotlin.Unit", - "\$\$result(85, 87) = 42", + $$$"$$result(85, 87) = 42", ), lines ) } } -} \ No newline at end of file + + @Test + fun testScriptExplainShouldCoverNonLastExpressions() { + withTempDir { _ -> + val (out, err, ret) = captureOutErrRet { + runScriptWithExplain(TEST_SCRIPT_TO_EXPLAIN_2) + } + val lines = pathToExplainingFile.readLines() + assertEquals( + listOf( + "a(8, 9) = 7", + "(11, 16) = 42", + $$$"$$result(18, 24) = 6" + ), lines + ) + } + } + + @Test + fun testScriptExplainShouldCoverIfExpression() { + withTempDir { _ -> + val (out, err, ret) = captureOutErrRet { + runScriptWithExplain(TEST_SCRIPT_TO_EXPLAIN_3) + } + val lines = pathToExplainingFile.readLines() + assertEquals( + listOf( + $$$"$$result(69, 74) = false" + ), lines + ) + } + } +} + +private fun runScriptWithExplain(scriptPath: String): ExitCode = CLICompiler.doMainNoExit( + K2JVMCompiler(), + arrayOf( + "-P", + "plugin:kotlin.scripting:disable-script-definitions-autoloading=true", + "-P", + "plugin:kotlin.scripting:disable-standard-script=true", + "-P", + "plugin:kotlin.scripting:enable-script-explanation=true", + "-Xplugin=$powerAssertJar", + "-P", + "plugin:kotlin.scripting:script-templates=${KotlinExplainScript::class.java.name}", + K2JVMCompilerArguments::classpath.cliArgument, additionalClasspath, + "-script", + scriptPath, + ) +) \ No newline at end of file