From 7bb150be403be79a6e5faac64a8bd54f30a64f97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93lafur=20P=C3=A1ll=20Geirsson?= Date: Sun, 9 Sep 2018 15:52:13 +0200 Subject: [PATCH] Fix position bug in mdoc:fail --- .../mdoc/internal/markdown/Renderer.scala | 22 +++++---------- .../mdoc/internal/pos/PositionSyntax.scala | 15 +++++++++-- .../scala/mdoc/document/RangePosition.scala | 7 +++++ .../test/scala/tests/markdown/FailSuite.scala | 27 +++++++++++++++++++ 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/mdoc/src/main/scala/mdoc/internal/markdown/Renderer.scala b/mdoc/src/main/scala/mdoc/internal/markdown/Renderer.scala index 3df7136c4..c1dfb4f76 100644 --- a/mdoc/src/main/scala/mdoc/internal/markdown/Renderer.scala +++ b/mdoc/src/main/scala/mdoc/internal/markdown/Renderer.scala @@ -113,25 +113,17 @@ object Renderer { section.mod match { case Modifier.Fail => binder.value match { - case CompileResult.TypecheckedOK(_, tpe, pos) => - val mpos = Position - .Range( - section.input, - pos.startLine, - pos.startColumn, - pos.endLine, - pos.endColumn - ) - .toUnslicedPosition + case CompileResult.TypecheckedOK(_, tpe, tpos) => reporter.error( - mpos, + tpos.toMeta(section), s"Expected compile error but statement type-checked successfully" ) appendMultiline(sb, tpe) - case CompileResult.ParseError(msg, pos) => - appendFreshMultiline(sb, pos.formatMessage(doc.edit, msg)) - case CompileResult.TypeError(msg, pos) => - appendFreshMultiline(sb, pos.formatMessage(doc.edit, msg)) + case CompileResult.ParseError(msg, tpos) => + appendFreshMultiline(sb, tpos.formatMessage(section, msg)) + case CompileResult.TypeError(msg, tpos) => + val mpos = tpos.toMeta(section) + appendFreshMultiline(sb, tpos.formatMessage(section, msg)) case _ => val obtained = pprint.PPrinter.BlackWhite.apply(binder).toString() throw new IllegalArgumentException( diff --git a/mdoc/src/main/scala/mdoc/internal/pos/PositionSyntax.scala b/mdoc/src/main/scala/mdoc/internal/pos/PositionSyntax.scala index f61a12d2a..46e8e94dc 100644 --- a/mdoc/src/main/scala/mdoc/internal/pos/PositionSyntax.scala +++ b/mdoc/src/main/scala/mdoc/internal/pos/PositionSyntax.scala @@ -8,6 +8,7 @@ import scala.meta.io.RelativePath import scalafix.internal.util.PositionSyntax._ import mdoc.document.RangePosition import mdoc.internal.cli.Settings +import mdoc.internal.markdown.EvaluatedSection object PositionSyntax { implicit class XtensionInputMdoc(input: Input) { @@ -29,8 +30,8 @@ object PositionSyntax { } } implicit class XtensionRangePositionMdoc(pos: RangePosition) { - def formatMessage(edit: TokenEditDistance, message: String): String = { - val mpos = pos.toMeta(edit) + def formatMessage(section: EvaluatedSection, message: String): String = { + val mpos = pos.toMeta(section) new StringBuilder() .append(message) .append("\n") @@ -40,6 +41,16 @@ object PositionSyntax { .append("\n") .toString() } + def toMeta(section: EvaluatedSection): Position = { + val mpos = Position.Range( + section.input, + pos.startLine, + pos.startColumn, + pos.endLine, + pos.endColumn + ) + mpos.toUnslicedPosition + } def toMeta(edit: TokenEditDistance): Position = { Position .Range( diff --git a/runtime/src/main/scala/mdoc/document/RangePosition.scala b/runtime/src/main/scala/mdoc/document/RangePosition.scala index a98f2a1ec..80c5424e4 100644 --- a/runtime/src/main/scala/mdoc/document/RangePosition.scala +++ b/runtime/src/main/scala/mdoc/document/RangePosition.scala @@ -10,6 +10,13 @@ final class RangePosition( val endLine: Int, val endColumn: Int ) { + def add(other: RangePosition): RangePosition = + new RangePosition( + other.startLine + startLine, + other.startColumn + startColumn, + other.endLine + endLine, + other.endColumn + endColumn + ) def isEmpty: Boolean = startLine == -1 && startColumn == -1 && diff --git a/tests/unit/src/test/scala/tests/markdown/FailSuite.scala b/tests/unit/src/test/scala/tests/markdown/FailSuite.scala index 439136867..161531a84 100644 --- a/tests/unit/src/test/scala/tests/markdown/FailSuite.scala +++ b/tests/unit/src/test/scala/tests/markdown/FailSuite.scala @@ -93,4 +93,31 @@ class FailSuite extends BaseMarkdownSuite { |""".stripMargin ) + check( + "order", + """ + |```scala mdoc + |println(42) + |``` + |```scala mdoc:fail + |val x: Int = "String" + |``` + """.stripMargin, + """ + |```scala + |println(42) + |// 42 + |``` + | + |```scala + |val x: Int = "String" + |// type mismatch; + |// found : String("String") + |// required: Int + |// val x: Int = "String" + |// ^ + |``` + """.stripMargin + ) + }