diff --git a/build.sbt b/build.sbt index 17c3bead8..52f284f75 100644 --- a/build.sbt +++ b/build.sbt @@ -192,7 +192,9 @@ val completeProj = (project in file("internal") / "util-complete") name := "Completion", libraryDependencies += jline, mimaSettings, - mimaBinaryIssueFilters ++= Seq( + // Parser is used publicly, so we can't break bincompat. + mimaBinaryIssueFilters := Seq( + exclude[DirectMissingMethodProblem]("sbt.internal.util.complete.History.this"), ), ) .configure(addSbtIO, addSbtUtilControl) diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/EditDistance.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/EditDistance.scala index cad2e5002..f0355329e 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/EditDistance.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/EditDistance.scala @@ -24,10 +24,12 @@ object EditDistance { insertCost: Int = 1, deleteCost: Int = 1, subCost: Int = 1, + transposeCost: Int = 1, matchCost: Int = 0, caseCost: Int = 1, transpositions: Boolean = false ): Int = { + val _ = transposeCost val n = s.length val m = t.length if (n == 0) return m diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/History.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/History.scala index 8c63bf592..52bb7acd5 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/History.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/History.scala @@ -48,6 +48,8 @@ final class History private (val lines: IndexedSeq[String], val path: Option[Fil } object History { + def apply(lines: Seq[String], path: Option[File], error: String => Unit): History = + new History(lines.toIndexedSeq, path) def apply(lines: Seq[String], path: Option[File]): History = new History(lines.toIndexedSeq, path) diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parser.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parser.scala index 31c1ca67a..f72645573 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parser.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parser.scala @@ -387,7 +387,13 @@ trait ParserMain { } /** Presents a Char range as a Parser. A single Char is parsed only if it is in the given range.*/ - implicit def range(r: collection.immutable.NumericRange[Char], label: String): Parser[Char] = + implicit def range(r: collection.immutable.NumericRange[Char]): Parser[Char] = { + val label = r.map(_.toString).toString + range(r, label) + } + + /** Presents a Char range as a Parser. A single Char is parsed only if it is in the given range.*/ + def range(r: collection.immutable.NumericRange[Char], label: String): Parser[Char] = charClass(r contains _, label).examples(r.map(_.toString): _*) /** Defines a Parser that parses a single character only if it is contained in `legal`.*/ @@ -400,7 +406,7 @@ trait ParserMain { * Defines a Parser that parses a single character only if the predicate `f` returns true for that character. * If this parser fails, `label` is used as the failure message. */ - def charClass(f: Char => Boolean, label: String): Parser[Char] = + def charClass(f: Char => Boolean, label: String = ""): Parser[Char] = new CharacterClass(f, label) /** Presents a single Char `ch` as a Parser that only parses that exact character. */