src/Pure/PIDE/document.scala
changeset 77299 026e1bb04a05
parent 77197 a541da01ba67
child 77300 57467fdd507d
equal deleted inserted replaced
77298:39c7d79ace34 77299:026e1bb04a05
   369 
   369 
   370   /* development graph */
   370   /* development graph */
   371 
   371 
   372   object Nodes {
   372   object Nodes {
   373     val empty: Nodes = new Nodes(Graph.empty(Node.Name.Ordering))
   373     val empty: Nodes = new Nodes(Graph.empty(Node.Name.Ordering))
       
   374 
       
   375     private def init(graph: Graph[Node.Name, Node], name: Node.Name): Graph[Node.Name, Node] =
       
   376       graph.default_node(name, Node.empty)
   374   }
   377   }
   375 
   378 
   376   final class Nodes private(graph: Graph[Node.Name, Node]) {
   379   final class Nodes private(graph: Graph[Node.Name, Node]) {
   377     def apply(name: Node.Name): Node =
   380     def apply(name: Node.Name): Node = Nodes.init(graph, name).get_node(name)
   378       graph.default_node(name, Node.empty).get_node(name)
       
   379 
   381 
   380     def is_suppressed(name: Node.Name): Boolean = {
   382     def is_suppressed(name: Node.Name): Boolean = {
   381       val graph1 = graph.default_node(name, Node.empty)
   383       val graph1 = Nodes.init(graph, name)
   382       graph1.is_maximal(name) && graph1.get_node(name).is_empty
   384       graph1.is_maximal(name) && graph1.get_node(name).is_empty
   383     }
   385     }
   384 
   386 
   385     def purge_suppressed: Option[Nodes] =
   387     def purge_suppressed: Option[Nodes] =
   386       graph.keys_iterator.filter(is_suppressed).toList match {
   388       graph.keys_iterator.filter(is_suppressed).toList match {
   389       }
   391       }
   390 
   392 
   391     def + (entry: (Node.Name, Node)): Nodes = {
   393     def + (entry: (Node.Name, Node)): Nodes = {
   392       val (name, node) = entry
   394       val (name, node) = entry
   393       val imports = node.header.imports
   395       val imports = node.header.imports
   394       val graph1 =
   396       val graph1 = (name :: imports).foldLeft(graph)(Nodes.init)
   395         imports.foldLeft(graph.default_node(name, Node.empty)) {
       
   396           case (g, p) => g.default_node(p, Node.empty)
       
   397         }
       
   398       val graph2 =
   397       val graph2 =
   399         graph1.imm_preds(name).foldLeft(graph1) { case (g, dep) => g.del_edge(dep, name) }
   398         graph1.imm_preds(name).foldLeft(graph1) { case (g, dep) => g.del_edge(dep, name) }
   400       val graph3 = imports.foldLeft(graph2) { case (g, dep) => g.add_edge(dep, name) }
   399       val graph3 = imports.foldLeft(graph2) { case (g, dep) => g.add_edge(dep, name) }
   401       new Nodes(graph3.map_node(name, _ => node))
   400       new Nodes(graph3.map_node(name, _ => node))
   402     }
   401     }