diff --git a/main/src/main/scala/sbt/internal/graph/GraphTransformations.scala b/main/src/main/scala/sbt/internal/graph/GraphTransformations.scala index c7385383d..816fe2624 100644 --- a/main/src/main/scala/sbt/internal/graph/GraphTransformations.scala +++ b/main/src/main/scala/sbt/internal/graph/GraphTransformations.scala @@ -32,7 +32,7 @@ object GraphTransformations { val nodes = edges .foldLeft(Set.empty[GraphModuleId])((set, edge) => set + edge._1 + edge._2) - .map(graph.module) + .flatMap(graph.module) ModuleGraph(nodes.toSeq, edges) } diff --git a/main/src/main/scala/sbt/internal/graph/model.scala b/main/src/main/scala/sbt/internal/graph/model.scala index 219e8b4f6..5bedafcc4 100644 --- a/main/src/main/scala/sbt/internal/graph/model.scala +++ b/main/src/main/scala/sbt/internal/graph/model.scala @@ -67,7 +67,7 @@ private[sbt] case class ModuleGraph(nodes: Seq[Module], edges: Seq[Edge]) { lazy val modules: Map[GraphModuleId, Module] = nodes.map(n => (n.id, n)).toMap - def module(id: GraphModuleId): Module = modules(id) + def module(id: GraphModuleId): Option[Module] = modules.get(id) lazy val dependencyMap: Map[GraphModuleId, Seq[Module]] = createMap(identity) @@ -81,7 +81,7 @@ private[sbt] case class ModuleGraph(nodes: Seq[Module], edges: Seq[Edge]) { val m = new HashMap[GraphModuleId, Set[Module]] with MultiMap[GraphModuleId, Module] edges.foreach { entry => val (f, t) = bindingFor(entry) - m.addBinding(f, module(t)) + module(t).foreach(m.addBinding(f, _)) } m.toMap.mapValues(_.toSeq.sortBy(_.id.idString)).toMap.withDefaultValue(Nil) } diff --git a/main/src/main/scala/sbt/internal/graph/rendering/DOT.scala b/main/src/main/scala/sbt/internal/graph/rendering/DOT.scala index b7e347d63..d53fb1023 100644 --- a/main/src/main/scala/sbt/internal/graph/rendering/DOT.scala +++ b/main/src/main/scala/sbt/internal/graph/rendering/DOT.scala @@ -31,8 +31,8 @@ object DOT { } }.sorted.mkString("\n") - def originWasEvicted(edge: Edge): Boolean = graph.module(edge._1).isEvicted - def targetWasEvicted(edge: Edge): Boolean = graph.module(edge._2).isEvicted + def originWasEvicted(edge: Edge): Boolean = graph.module(edge._1).exists(_.isEvicted) + def targetWasEvicted(edge: Edge): Boolean = graph.module(edge._2).exists(_.isEvicted) // add extra edges from evicted to evicted-by module val evictedByEdges: Seq[Edge] = @@ -43,13 +43,11 @@ object DOT { // remove edges to new evicted-by module which is now replaced by a chain // dependend -> [evicted] -> dependee val evictionTargetEdges = - graph.edges - .filter(targetWasEvicted) - .map { - case (from, evicted) => - (from, evicted.copy(version = graph.module(evicted).evictedByVersion.get)) - } - .toSet + graph.edges.collect { + case edge @ (from, evicted) if targetWasEvicted(edge) => + // Can safely call `get` as `targetWasEvicted` already proves evicted exists in the graph + (from, evicted.copy(version = graph.module(evicted).flatMap(_.evictedByVersion).get)) + }.toSet val filteredEdges = graph.edges @@ -58,7 +56,7 @@ object DOT { val edges = { for (e <- filteredEdges) yield { val extra = - if (graph.module(e._1).isEvicted) + if (graph.module(e._1).exists(_.isEvicted)) s""" [label="Evicted By" style="$EvictedStyle"]""" else "" """ "%s" -> "%s"%s""".format(e._1.idString, e._2.idString, extra) diff --git a/main/src/main/scala/sbt/internal/graph/rendering/Statistics.scala b/main/src/main/scala/sbt/internal/graph/rendering/Statistics.scala index a52d4d387..15c922992 100644 --- a/main/src/main/scala/sbt/internal/graph/rendering/Statistics.scala +++ b/main/src/main/scala/sbt/internal/graph/rendering/Statistics.scala @@ -28,7 +28,7 @@ object Statistics { val directDependencies = graph.dependencyMap(moduleId).filterNot(_.isEvicted).map(_.id) val dependencyStats = directDependencies.map(statsFor).flatMap(_.transitiveStatsWithSelf).toMap - val selfSize = graph.module(moduleId).jarFile.filter(_.exists).map(_.length) + val selfSize = graph.module(moduleId).flatMap(_.jarFile).filter(_.exists).map(_.length) val numDirectDependencies = directDependencies.size val numTransitiveDependencies = dependencyStats.size val transitiveSize = selfSize.getOrElse(0L) + dependencyStats