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 ae0f4557741..f5518fe7d8a 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 @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.idea.scratch.ScratchExpression import org.jetbrains.kotlin.idea.scratch.ScratchFile object InlayScratchOutputHandler : ScratchOutputHandler { + private const val maxLineLength = 120 private const val maxInsertOffset = 60 private const val minSpaceCount = 4 @@ -32,12 +33,9 @@ object InlayScratchOutputHandler : ScratchOutputHandler { } override fun handle(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) { - val inlayText = StringUtil.shortenTextWithEllipsis(output.text.substringBefore("\n"), 50, 0) - if (inlayText != output.text && output.type != ScratchOutputType.ERROR) { - ToolWindowScratchOutputHandler.handle(file, expression, output) - } + if (output.text.isBlank()) return - createInlay(file, expression.lineStart, inlayText, output.type) + createInlay(file, expression, output) if (output.type == ScratchOutputType.ERROR) { ToolWindowScratchOutputHandler.handle(file, expression, output) @@ -57,32 +55,45 @@ object InlayScratchOutputHandler : ScratchOutputHandler { ToolWindowScratchOutputHandler.clear(file) } - private fun createInlay(file: ScratchFile, line: Int, inlayText: String, outputType: ScratchOutputType) { + private fun createInlay(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) { UIUtil.invokeLaterIfNeeded { val editor = file.editor.editor + val line = expression.lineStart val lineStartOffset = editor.document.getLineStartOffset(line) val lineEndOffset = editor.document.getLineEndOffset(line) val lineLength = lineEndOffset - lineStartOffset var spaceCount = maxLineLength(file) - lineLength + minSpaceCount - while(spaceCount + lineLength > maxInsertOffset && spaceCount > minSpaceCount) spaceCount-- + while (spaceCount + lineLength > maxInsertOffset && spaceCount > minSpaceCount) spaceCount-- + + fun addInlay(text: String) { + val textBeforeNewLine = if (StringUtil.containsLineBreak(text)) text.substringBefore("\n") + "..." else text + val shortText = StringUtil.shortenTextWithEllipsis(textBeforeNewLine, maxLineLength - spaceCount - lineLength, 0) + if (shortText != text) { + printToToolWindow(file, expression, output) + } + editor.inlayModel.addInlineElement(lineEndOffset, InlayScratchFileRenderer(" ".repeat(spaceCount) + shortText, output.type)) + } val existing = editor.inlayModel .getInlineElementsInRange(lineEndOffset, lineEndOffset) .singleOrNull { it.renderer is InlayScratchFileRenderer } if (existing != null) { existing.dispose() - editor.inlayModel.addInlineElement( - lineEndOffset, - InlayScratchFileRenderer((existing.renderer as InlayScratchFileRenderer).text + "; " + inlayText, outputType) - ) + addInlay(((existing.renderer as InlayScratchFileRenderer).text + "; " + output.text).drop(spaceCount)) } else { - editor.inlayModel.addInlineElement(lineEndOffset, InlayScratchFileRenderer(" ".repeat(spaceCount) + inlayText, outputType)) + addInlay(output.text) } } } + private fun printToToolWindow(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) { + if (output.type != ScratchOutputType.ERROR) { + ToolWindowScratchOutputHandler.handle(file, expression, output) + } + } + private fun maxLineLength(file: ScratchFile): Int { val doc = file.editor.editor.document return (0 until doc.lineCount) @@ -99,5 +110,4 @@ object InlayScratchOutputHandler : ScratchOutputHandler { .forEach { Disposer.dispose(it) } } } - } \ No newline at end of file diff --git a/idea/testData/scratch/unresolved.repl.after b/idea/testData/scratch/unresolved.repl.after index 79dd6689f74..5e7af6ce157 100644 --- a/idea/testData/scratch/unresolved.repl.after +++ b/idea/testData/scratch/unresolved.repl.after @@ -1,4 +1,4 @@ -foo() // ERROR: 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 4315ce22110..f026513a32c 100644 --- a/idea/testData/scratch/unresolvedMultiline.comp.after +++ b/idea/testData/scratch/unresolvedMultiline.comp.after @@ -1,4 +1,4 @@ -foo.forEach { // ERROR: Unresolved reference: foo; Cannot choose among the following candidates wi... +foo.forEach { // ERROR: Unresolved reference: foo; Cannot choose among the following candidates without completing ty... 1 + 1 } diff --git a/idea/testData/scratch/unresolvedMultiline.repl.after b/idea/testData/scratch/unresolvedMultiline.repl.after index 2e5c3d886f6..9e379afdf3e 100644 --- a/idea/testData/scratch/unresolvedMultiline.repl.after +++ b/idea/testData/scratch/unresolvedMultiline.repl.after @@ -1,8 +1,8 @@ -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) } /** unresolvedMultiline.kts:1 error: unresolved reference: foo diff --git a/idea/testData/scratch/veryLongOutput.comp.after b/idea/testData/scratch/veryLongOutput.comp.after index 1147c834d6d..facfbbc0c36 100644 --- a/idea/testData/scratch/veryLongOutput.comp.after +++ b/idea/testData/scratch/veryLongOutput.comp.after @@ -1,3 +1,8 @@ -val a = "a".repeat(100) // RESULT: val a: String -a // RESULT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... -/** veryLongOutput.kts:2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ \ No newline at end of file +val a = "a".repeat(100) // RESULT: val a: String +a // RESULT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... +val b = "0123456789\n".repeat(10) // RESULT: val b: String +b // RESULT: 0123456789; 0123456789; 0123456789; 0123456789; 0123456789; 0123456789; 01234567... +/** veryLongOutput.kts:2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ +/** veryLongOutput.kts:4 0123456789 */ +/** veryLongOutput.kts:4 0123456789 */ +/** veryLongOutput.kts:4 0123456789 */ \ No newline at end of file diff --git a/idea/testData/scratch/veryLongOutput.kts b/idea/testData/scratch/veryLongOutput.kts index 08488e2dfc5..b9434cf20dc 100644 --- a/idea/testData/scratch/veryLongOutput.kts +++ b/idea/testData/scratch/veryLongOutput.kts @@ -1,2 +1,4 @@ val a = "a".repeat(100) -a \ No newline at end of file +a +val b = "0123456789\n".repeat(10) +b \ No newline at end of file diff --git a/idea/testData/scratch/veryLongOutput.repl.after b/idea/testData/scratch/veryLongOutput.repl.after index 7e9fc6b4427..83a3d331b9a 100644 --- a/idea/testData/scratch/veryLongOutput.repl.after +++ b/idea/testData/scratch/veryLongOutput.repl.after @@ -1,3 +1,15 @@ val a = "a".repeat(100) -a // RESULT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... -/** veryLongOutput.kts:2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ \ No newline at end of file +a // RESULT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... +val b = "0123456789\n".repeat(10) +b // RESULT: 0123456789... +/** veryLongOutput.kts:2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ +/** veryLongOutput.kts:4 0123456789 +0123456789 +0123456789 +0123456789 +0123456789 +0123456789 +0123456789 +0123456789 +0123456789 +0123456789 */ \ No newline at end of file