From c5d65fe3c7a29344844d9437ff01ad70dfb4c5e0 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sat, 23 Jan 2021 22:27:25 -0500 Subject: [PATCH] Cache configuration parser --- main/src/main/scala/sbt/internal/Act.scala | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/main/src/main/scala/sbt/internal/Act.scala b/main/src/main/scala/sbt/internal/Act.scala index be8a73932..9e595cea3 100644 --- a/main/src/main/scala/sbt/internal/Act.scala +++ b/main/src/main/scala/sbt/internal/Act.scala @@ -18,6 +18,7 @@ import java.net.URI import sbt.internal.CommandStrings.{ MultiTaskCommand, ShowCommand, PrintCommand } import sbt.internal.util.{ AttributeEntry, AttributeKey, AttributeMap, IMap, Settings, Util } import sbt.util.Show +import scala.collection.mutable final class ParsedKey(val key: ScopedKey[_], val mask: ScopeMask) @@ -73,14 +74,19 @@ object Act { defaultConfigs: Option[ResolvedReference] => Seq[String], keyMap: Map[String, AttributeKey[_]] ): Parser[Seq[Parser[ParsedKey]]] = { + val confParserCache: mutable.Map[Option[sbt.ResolvedReference], Parser[ParsedAxis[String]]] = + mutable.Map.empty def fullKey = for { rawProject <- optProjectRef(index, current) proj = resolveProject(rawProject, current) - confAmb <- configIdent( - index.configs(proj), - index.configIdents(proj), - index.fromConfigIdent(proj) + confAmb <- confParserCache.getOrElseUpdate( + proj, + configIdent( + index.configs(proj), + index.configIdents(proj), + index.fromConfigIdent(proj) + ) ) partialMask = ScopeMask(rawProject.isExplicit, confAmb.isExplicit, false, false) } yield taskKeyExtra(index, defaultConfigs, keyMap, proj, confAmb, partialMask)