diff --git a/mdoc-interfaces/src/main/scala/mdoc/interfaces/EvaluatedWorksheetStatement.java b/mdoc-interfaces/src/main/scala/mdoc/interfaces/EvaluatedWorksheetStatement.java index 54c13a90c..9ffae5a85 100644 --- a/mdoc-interfaces/src/main/scala/mdoc/interfaces/EvaluatedWorksheetStatement.java +++ b/mdoc-interfaces/src/main/scala/mdoc/interfaces/EvaluatedWorksheetStatement.java @@ -5,5 +5,6 @@ public abstract class EvaluatedWorksheetStatement { public abstract RangePosition position(); public abstract String summary(); public abstract String details(); + public abstract boolean isSummaryComplete(); } diff --git a/mdoc/src/main/scala/mdoc/internal/worksheets/EvaluatedWorksheetStatement.scala b/mdoc/src/main/scala/mdoc/internal/worksheets/EvaluatedWorksheetStatement.scala index 5456f52a3..7e45e25ec 100644 --- a/mdoc/src/main/scala/mdoc/internal/worksheets/EvaluatedWorksheetStatement.scala +++ b/mdoc/src/main/scala/mdoc/internal/worksheets/EvaluatedWorksheetStatement.scala @@ -4,5 +4,6 @@ import mdoc.interfaces.RangePosition case class EvaluatedWorksheetStatement( val position: RangePosition, val summary: String, - val details: String + val details: String, + val isSummaryComplete: Boolean ) extends mdoc.interfaces.EvaluatedWorksheetStatement diff --git a/mdoc/src/main/scala/mdoc/internal/worksheets/WorksheetProvider.scala b/mdoc/src/main/scala/mdoc/internal/worksheets/WorksheetProvider.scala index ddea2443c..7bafff930 100644 --- a/mdoc/src/main/scala/mdoc/internal/worksheets/WorksheetProvider.scala +++ b/mdoc/src/main/scala/mdoc/internal/worksheets/WorksheetProvider.scala @@ -4,7 +4,6 @@ import scala.meta._ import mdoc.internal.cli.Context import scala.collection.JavaConverters._ import mdoc.internal.markdown.SectionInput -import scala.meta.parsers.Parsed.Success import mdoc.internal.markdown.Modifier import mdoc.internal.markdown.Instrumenter import mdoc.internal.markdown.MarkdownCompiler @@ -14,7 +13,6 @@ import mdoc.internal.cli.Settings import pprint.TPrintColors import pprint.PPrinter.BlackWhite import mdoc.internal.io.StoreReporter -import mdoc.interfaces.Diagnostic import mdoc.{interfaces => i} import mdoc.internal.markdown.MdocDialect @@ -22,7 +20,6 @@ class WorksheetProvider(settings: Settings) { private val reporter = new StoreReporter() - private val commentHeader = " // " // The smallest column width that worksheet values will use for rendering // worksheet decorations. private val minimumMargin = 20 @@ -54,8 +51,8 @@ class WorksheetProvider(settings: Settings) { EvaluatedWorksheet( reporter.diagnostics.map(d => d: i.Diagnostic).toSeq.asJava, - decorations.toIterator - .filterNot(_.summary == commentHeader) + decorations + .filterNot(_.summary.isEmpty) .map(d => d: i.EvaluatedWorksheetStatement) .toList .asJava @@ -75,21 +72,26 @@ class WorksheetProvider(settings: Settings) { settings.screenWidth - statement.position.endColumn ) val isEmptyValue = isUnitType(statement) || statement.binders.isEmpty - val contentText = renderContentText(statement, margin, isEmptyValue) - val hoverMessage = renderHoverMessage(statement, margin, isEmptyValue) - EvaluatedWorksheetStatement(range, contentText, hoverMessage) + val renderSummaryResult = + renderSummary(statement, margin, isEmptyValue) + val details = renderDetails(statement, isEmptyValue) + EvaluatedWorksheetStatement( + range, + renderSummaryResult.summary, + details, + renderSummaryResult.isSummaryComplete + ) } - private def renderHoverMessage( + private def renderDetails( statement: Statement, - margin: Int, isEmptyValue: Boolean ): String = { val out = new StringBuilder() if (!isEmptyValue) { statement.binders.iterator.foreach { binder => out - .append("\n") + .append(if (out.nonEmpty) "\n" else "") .append(binder.name) .append(": ") .append(binder.tpe.render(TPrintColors.BlackWhite)) @@ -100,46 +102,53 @@ class WorksheetProvider(settings: Settings) { } } statement.out.linesIterator.foreach { line => - out.append("\n// ").append(line) + out + .append(if (out.nonEmpty) "\n" else "") + .append("// ") + .append(line) } out.toString() } - private def renderContentText( + private def renderSummary( statement: Statement, margin: Int, isEmptyValue: Boolean - ): String = { + ): RenderSummaryResult = { val out = new StringBuilder() - out.append(commentHeader) - if (isEmptyValue) { - if (!statement.out.isEmpty()) { - out.append(statement.out.linesIterator.next()) - } - } else { - val isSingle = statement.binders.lengthCompare(1) == 0 - statement.binders.iterator.zipWithIndex.foreach { - case (binder, i) => - if (!isSingle) { - out - .append(if (i == 0) "" else ", ") - .append(binder.name) - .append("=") - } - val truncatedLine = BlackWhite - .tokenize(binder.value, width = margin, height = settings.screenHeight) - .map(_.getChars) - .filterNot(_.iterator.forall(_.isWhitespace)) - .flatMap(_.iterator) - .filter { - case '\n' => false - case _ => true + val isOverMargin = + if (isEmptyValue) { + if (!statement.out.isEmpty()) { + val lines = statement.out.linesIterator + out.append(lines.next()) + lines.hasNext || out.length > margin + } else + false + } else { + val isSingle = statement.binders.lengthCompare(1) == 0 + statement.binders.iterator.foldLeft(false) { + case (true, _) => true + case (false, binder) => + if (!isSingle) { + out + .append(if (out.isEmpty) "" else ", ") + .append(binder.name) + .append("=") } - .take(margin) - out.appendAll(truncatedLine) + val chunk = BlackWhite + .tokenize(binder.value, width = margin - out.length) + .map(_.getChars) + .filterNot(_.iterator.forall(_.isWhitespace)) + .flatMap(_.iterator) + .filter { + case '\n' => false + case _ => true + } + out.appendAll(chunk) + out.length > margin + } } - } - out.toString() + RenderSummaryResult(out.result().take(margin), isSummaryComplete = !isOverMargin) } private def isUnitType(statement: Statement): Boolean = { @@ -150,3 +159,5 @@ class WorksheetProvider(settings: Settings) { } } + +case class RenderSummaryResult(summary: String, isSummaryComplete: Boolean) diff --git a/tests/unit/src/test/scala/tests/worksheets/WorksheetSuite.scala b/tests/unit/src/test/scala/tests/worksheets/WorksheetSuite.scala index f55eef66f..94187365e 100644 --- a/tests/unit/src/test/scala/tests/worksheets/WorksheetSuite.scala +++ b/tests/unit/src/test/scala/tests/worksheets/WorksheetSuite.scala @@ -3,16 +3,13 @@ package tests.worksheets import java.lang.StringBuilder import org.scalatest.FunSuite import org.scalatest.BeforeAndAfterAll -import mdoc.interfaces.Mdoc +import mdoc.interfaces.{DiagnosticSeverity, Mdoc} import scala.meta.testkit.DiffAssertions import scala.collection.JavaConverters._ import scala.meta.inputs.Input import scala.meta.inputs.Position -import mdoc.document.RangePosition import mdoc.internal.pos.PositionSyntax._ -import mdoc.interfaces.DiagnosticSeverity import java.{util => ju} -import mdoc.PostModifier class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions { var mdoc = ju.ServiceLoader @@ -84,7 +81,9 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions .append("<") .append(p.text) .append(">") + .append(" // ") .append(stat.summary()) + .append(if (!stat.isSummaryComplete) "..." else "") .append("\n") .append(stat.details()) i = p.end @@ -101,7 +100,6 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions |""".stripMargin, """| | // Vector(1, 2, 3, 4) - | |x: Vector[Int] = Vector(1, 2, 3, 4) |""".stripMargin ) @@ -113,7 +111,6 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions |""".stripMargin, """| | // x=1, y=2 - | |x: Int = 1 |y: Int = 2 |""".stripMargin @@ -125,8 +122,7 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions |Stream.from(10) |""".stripMargin, """| - | // Stream(10,11,12,... - | + | // Stream(10,11,12,13,1... |res0: Stream[Int] = Stream( | 10, | 11, @@ -141,8 +137,7 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions |println(1.to(3).mkString(";\n")) |""".stripMargin, """| - | // 1; - | + | // 1;... |// 1; |// 2; |// 3 @@ -162,7 +157,6 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions | println("hello") | 42 |}> // 42 - | |x: Int = 42 |// hello |""".stripMargin @@ -177,13 +171,10 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions |""".stripMargin, """| | // 10 - | |n: Int = 10 | // 10 - | |// 10 | // 100 - | |m: Int = 100 |""".stripMargin ) @@ -195,7 +186,6 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions |""".stripMargin, """|import scala.concurrent.Future | // Future(Success(10)) - | |n: Future[Int] = Future(Success(10)) |""".stripMargin ) @@ -207,7 +197,6 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions |""".stripMargin, """|case class User(name: String) | // User("Susan") - | |n: User = User("Susan") |""".stripMargin )