From 94bb19c7659f01af328920c621b391ee4f303ab6 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Wed, 16 May 2018 13:44:54 +0300 Subject: [PATCH] Provide line info for scratch output in scratch toolwindow ^KT-24016 --- .../output/InlayScratchOutputHandler.kt | 2 +- .../output/ToolWindowScratchOutputHandler.kt | 25 ++++++++++++++++--- idea/testData/scratch/unresolved.comp.after | 2 +- idea/testData/scratch/unresolved.repl.after | 4 +-- .../scratch/unresolvedMultiline.comp.after | 6 ++--- .../scratch/unresolvedMultiline.repl.after | 4 +-- .../scratch/veryLongOutput.comp.after | 2 +- .../scratch/veryLongOutput.repl.after | 2 +- 8 files changed, 33 insertions(+), 14 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/InlayScratchOutputHandler.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/InlayScratchOutputHandler.kt index d5b8bda1734..ae0f4557741 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/InlayScratchOutputHandler.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/InlayScratchOutputHandler.kt @@ -40,7 +40,7 @@ object InlayScratchOutputHandler : ScratchOutputHandler { createInlay(file, expression.lineStart, inlayText, output.type) if (output.type == ScratchOutputType.ERROR) { - error(file, output.text) + ToolWindowScratchOutputHandler.handle(file, expression, output) } } 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 9faf5f13fc5..ec16c672621 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 @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.scratch.output +import com.intellij.execution.filters.OpenFileHyperlinkInfo import com.intellij.execution.impl.ConsoleViewImpl import com.intellij.execution.ui.ConsoleViewContentType import com.intellij.ide.scratch.ScratchFileType @@ -28,6 +29,7 @@ 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 com.intellij.psi.PsiFile import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.idea.scratch.ScratchExpression import org.jetbrains.kotlin.idea.scratch.ScratchFile @@ -37,10 +39,22 @@ object ToolWindowScratchOutputHandler : ScratchOutputHandlerAdapter() { override fun handle(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) { if (ApplicationManager.getApplication().isUnitTestMode) { - return testPrint(file, output.text) + return testPrint(file, output.text, expression) } printToConsole(file.project) { + val psiFile = file.getPsiFile() + if (psiFile != null) { + printHyperlink( + getLineInfo(psiFile, expression), + OpenFileHyperlinkInfo( + project, + psiFile.virtualFile, + expression.lineStart + ) + ) + print(" ", ConsoleViewContentType.NORMAL_OUTPUT) + } print(output.text, output.type.convert()) } } @@ -88,6 +102,9 @@ object ToolWindowScratchOutputHandler : ScratchOutputHandlerAdapter() { } } + private fun getLineInfo(psiFile: PsiFile, expression: ScratchExpression) = + "${psiFile.name}:${expression.lineStart + 1}" + private fun ScratchOutputType.convert() = when (this) { ScratchOutputType.OUTPUT -> ConsoleViewContentType.SYSTEM_OUTPUT ScratchOutputType.RESULT -> ConsoleViewContentType.NORMAL_OUTPUT @@ -108,12 +125,14 @@ object ToolWindowScratchOutputHandler : ScratchOutputHandlerAdapter() { } @TestOnly - private fun testPrint(file: ScratchFile, output: String) { + private fun testPrint(file: ScratchFile, output: String, expression: ScratchExpression? = null) { ApplicationManager.getApplication().invokeLater { WriteCommandAction.runWriteCommandAction(file.project) { val psiFile = file.getPsiFile()!! psiFile.addAfter( - KtPsiFactory(file.project).createComment("/** $output */"), + KtPsiFactory(file.project).createComment( + "/** ${expression?.let { getLineInfo(psiFile, expression) + " " } ?: ""}$output */" + ), psiFile.lastChild ) } diff --git a/idea/testData/scratch/unresolved.comp.after b/idea/testData/scratch/unresolved.comp.after index 5f84c4f26e3..d26bde7bf33 100644 --- a/idea/testData/scratch/unresolved.comp.after +++ b/idea/testData/scratch/unresolved.comp.after @@ -1,3 +1,3 @@ foo() // ERROR: Unresolved reference: foo -/** Unresolved reference: foo */ +/** unresolved.kts:1 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 da199ebdfbf..79dd6689f74 100644 --- a/idea/testData/scratch/unresolved.repl.after +++ b/idea/testData/scratch/unresolved.repl.after @@ -1,5 +1,5 @@ -foo() // ERROR: error: unresolved reference: foo -/** error: unresolved reference: foo +foo() // ERROR: error: unresolved reference: foo +/** unresolved.kts:1 error: unresolved reference: foo foo() diff --git a/idea/testData/scratch/unresolvedMultiline.comp.after b/idea/testData/scratch/unresolvedMultiline.comp.after index 1d0ffc91476..4315ce22110 100644 --- a/idea/testData/scratch/unresolvedMultiline.comp.after +++ b/idea/testData/scratch/unresolvedMultiline.comp.after @@ -5,9 +5,9 @@ foo.forEach { // ERROR: Unresolved reference: foo; Cannot choose among fun goo(a: String) { // ERROR: Unresolved reference: goo super.goo(a) } -/** Unresolved reference: foo */ -/** Cannot choose among the following candidates without completing type inference: +/** unresolvedMultiline.kts:1 Unresolved reference: foo */ +/** unresolvedMultiline.kts:1 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 */ +/** unresolvedMultiline.kts:5 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 6ff2bea24cb..2e5c3d886f6 100644 --- a/idea/testData/scratch/unresolvedMultiline.repl.after +++ b/idea/testData/scratch/unresolvedMultiline.repl.after @@ -5,7 +5,7 @@ foo.forEach { // ERROR: error: unr fun goo(a: String) { // ERROR: error: unresolved reference: goo super.goo(a) } -/** error: unresolved reference: foo +/** unresolvedMultiline.kts:1 error: unresolved reference: foo foo.forEach { @@ -18,7 +18,7 @@ error: cannot choose among the following candidates without completing type infe foo.forEach { ^ */ -/** error: unresolved reference: goo +/** unresolvedMultiline.kts:5 error: unresolved reference: goo super.goo(a) diff --git a/idea/testData/scratch/veryLongOutput.comp.after b/idea/testData/scratch/veryLongOutput.comp.after index 5efc741c3ea..1147c834d6d 100644 --- a/idea/testData/scratch/veryLongOutput.comp.after +++ b/idea/testData/scratch/veryLongOutput.comp.after @@ -1,3 +1,3 @@ val a = "a".repeat(100) // RESULT: val a: String a // RESULT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... -/** aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ \ No newline at end of file +/** veryLongOutput.kts:2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ \ No newline at end of file diff --git a/idea/testData/scratch/veryLongOutput.repl.after b/idea/testData/scratch/veryLongOutput.repl.after index b40962d6e6a..7e9fc6b4427 100644 --- a/idea/testData/scratch/veryLongOutput.repl.after +++ b/idea/testData/scratch/veryLongOutput.repl.after @@ -1,3 +1,3 @@ val a = "a".repeat(100) a // RESULT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... -/** aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ \ No newline at end of file +/** veryLongOutput.kts:2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ \ No newline at end of file