From ea56f331a159efdc1346d38b485cdbeb5550e193 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Mon, 31 Oct 2016 09:23:38 +0000 Subject: [PATCH] Lazily concatenate failed errors for completion [forwardport] (#53) * Fixes [sbt/sbt#2781] * When using `` completion the failed errors were always computed for mathcing projects even if there was no failure, leading to excessive computation of Levenshtein distances and a large lag (seconds) on builds with many matching projects. --- .../src/main/scala/sbt/internal/util/complete/Parser.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 bc1229ad1..0e12fd28a 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 @@ -559,8 +559,8 @@ trait ParserMain { def seq[T](p: Seq[Parser[T]]): Parser[Seq[T]] = seq0(p, Nil) def seq0[T](p: Seq[Parser[T]], errors: => Seq[String]): Parser[Seq[T]] = { - val (newErrors, valid) = separate(p) { case Invalid(f) => Left(f.errors); case ok => Right(ok) } - def combinedErrors = errors ++ newErrors.flatten + val (newErrors, valid) = separate(p) { case Invalid(f) => Left(f.errors _); case ok => Right(ok) } + def combinedErrors = errors ++ newErrors.flatMap(_()) if (valid.isEmpty) invalid(combinedErrors) else new ParserSeq(valid, combinedErrors) }