diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/ToolWindowScratchOutputHandler.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/ToolWindowScratchOutputHandler.kt index b1036fff40d..9faf5f13fc5 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/ToolWindowScratchOutputHandler.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/ToolWindowScratchOutputHandler.kt @@ -20,6 +20,7 @@ import com.intellij.execution.impl.ConsoleViewImpl import com.intellij.execution.ui.ConsoleViewContentType import com.intellij.ide.scratch.ScratchFileType import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.editor.ex.EditorEx import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer @@ -27,26 +28,34 @@ import com.intellij.openapi.wm.ToolWindow import com.intellij.openapi.wm.ToolWindowAnchor import com.intellij.openapi.wm.ToolWindowFactory import com.intellij.openapi.wm.ToolWindowManager +import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.idea.scratch.ScratchExpression import org.jetbrains.kotlin.idea.scratch.ScratchFile +import org.jetbrains.kotlin.psi.KtPsiFactory object ToolWindowScratchOutputHandler : ScratchOutputHandlerAdapter() { override fun handle(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) { + if (ApplicationManager.getApplication().isUnitTestMode) { + return testPrint(file, output.text) + } + printToConsole(file.project) { print(output.text, output.type.convert()) } } override fun error(file: ScratchFile, message: String) { + if (ApplicationManager.getApplication().isUnitTestMode) { + return testPrint(file, message) + } + printToConsole(file.project) { print(message, ConsoleViewContentType.ERROR_OUTPUT) } } private fun printToConsole(project: Project, print: ConsoleViewImpl.() -> Unit) { - if (ApplicationManager.getApplication().isUnitTestMode) return - ApplicationManager.getApplication().invokeLater { val toolWindow = getToolWindow(project) ?: createToolWindow(project) val contents = toolWindow.contentManager.contents @@ -97,6 +106,19 @@ object ToolWindowScratchOutputHandler : ScratchOutputHandlerAdapter() { ScratchToolWindowFactory().createToolWindowContent(project, window) return window } + + @TestOnly + private fun testPrint(file: ScratchFile, output: String) { + ApplicationManager.getApplication().invokeLater { + WriteCommandAction.runWriteCommandAction(file.project) { + val psiFile = file.getPsiFile()!! + psiFile.addAfter( + KtPsiFactory(file.project).createComment("/** $output */"), + psiFile.lastChild + ) + } + } + } } private class ScratchToolWindowFactory : ToolWindowFactory { diff --git a/idea/testData/scratch/unresolved.comp.after b/idea/testData/scratch/unresolved.comp.after index 4a1578f75c2..5f84c4f26e3 100644 --- a/idea/testData/scratch/unresolved.comp.after +++ b/idea/testData/scratch/unresolved.comp.after @@ -1 +1,3 @@ -foo() // ERROR: Unresolved reference: foo \ No newline at end of file +foo() // ERROR: Unresolved reference: foo +/** Unresolved reference: foo */ +/** Compilation Error */ \ No newline at end of file diff --git a/idea/testData/scratch/unresolved.repl.after b/idea/testData/scratch/unresolved.repl.after index 89ce57b2b54..da199ebdfbf 100644 --- a/idea/testData/scratch/unresolved.repl.after +++ b/idea/testData/scratch/unresolved.repl.after @@ -1 +1,6 @@ -foo() // ERROR: error: unresolved reference: foo +foo() // ERROR: error: unresolved reference: foo +/** error: unresolved reference: foo + +foo() + +^ */ \ No newline at end of file diff --git a/idea/testData/scratch/unresolvedMultiline.comp.after b/idea/testData/scratch/unresolvedMultiline.comp.after index e8407a351b1..1d0ffc91476 100644 --- a/idea/testData/scratch/unresolvedMultiline.comp.after +++ b/idea/testData/scratch/unresolvedMultiline.comp.after @@ -4,4 +4,10 @@ foo.forEach { // ERROR: Unresolved reference: foo; Cannot choose among fun goo(a: String) { // ERROR: Unresolved reference: goo super.goo(a) -} \ No newline at end of file +} +/** Unresolved reference: foo */ +/** Cannot choose among the following candidates without completing type inference: +@HidesMembers public inline fun Iterable.forEach(action: (???) -> Unit): Unit defined in kotlin.collections +@HidesMembers public inline fun Map.forEach(action: (Map.Entry) -> Unit): Unit defined in kotlin.collections */ +/** Unresolved reference: goo */ +/** Compilation Error */ \ No newline at end of file diff --git a/idea/testData/scratch/unresolvedMultiline.repl.after b/idea/testData/scratch/unresolvedMultiline.repl.after index a734926f6d7..6ff2bea24cb 100644 --- a/idea/testData/scratch/unresolvedMultiline.repl.after +++ b/idea/testData/scratch/unresolvedMultiline.repl.after @@ -1,7 +1,25 @@ -foo.forEach { // ERROR: error: unresolved reference: foo +foo.forEach { // ERROR: error: unresolved reference: foo 1 + 1 } -fun goo(a: String) { // ERROR: error: unresolved reference: goo +fun goo(a: String) { // ERROR: error: unresolved reference: goo super.goo(a) -} \ No newline at end of file +} +/** error: unresolved reference: foo + +foo.forEach { + +^ + +error: cannot choose among the following candidates without completing type inference: +@HidesMembers public inline fun Iterable.forEach(action: (???) -> Unit): Unit defined in kotlin.collections +@HidesMembers public inline fun Map.forEach(action: (Map.Entry) -> Unit): Unit defined in kotlin.collections + +foo.forEach { + +^ */ +/** error: unresolved reference: goo + +super.goo(a) + +^ */ \ No newline at end of file diff --git a/idea/testData/scratch/veryLongOutput.comp.after b/idea/testData/scratch/veryLongOutput.comp.after index d491b5fc7b2..5efc741c3ea 100644 --- a/idea/testData/scratch/veryLongOutput.comp.after +++ b/idea/testData/scratch/veryLongOutput.comp.after @@ -1,2 +1,3 @@ val a = "a".repeat(100) // RESULT: val a: String -a // RESULT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... \ No newline at end of file +a // RESULT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... +/** aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ \ No newline at end of file diff --git a/idea/testData/scratch/veryLongOutput.repl.after b/idea/testData/scratch/veryLongOutput.repl.after index 44e0caadc15..b40962d6e6a 100644 --- a/idea/testData/scratch/veryLongOutput.repl.after +++ b/idea/testData/scratch/veryLongOutput.repl.after @@ -1,2 +1,3 @@ val a = "a".repeat(100) -a // RESULT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... \ No newline at end of file +a // RESULT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... +/** aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ \ No newline at end of file