Source code for hets.DevelopmentGraph

"""
Description :  Represents `Static.DevGraph.DGraph`
Copyright   :  (c) Otto-von-Guericke University of Magdeburg
License     :  GPLv2 or higher, see LICENSE.txt
"""
import logging
import typing
from typing import List, Optional, Dict

from .DevGraphNode import DevGraphNode, dev_graph_node_from_hs
from .DevGraphEdge import DevGraphEdge, DefinitionDevGraphEdge, TheoremDevGraphEdge
from .GlobalAnnotations import GlobalAnnotations
from .HsWrapper import HsHierarchyElement

from .haskell import getLNodesFromDevelopmentGraph, DGraph, Nothing, Just, fromJust, getDGNodeById, \
    getLEdgesFromDevelopmentGraph, globalAnnotations, getDevGraphLinkType, thd, DefinitionLink, fst


[docs] class DevelopmentGraph(HsHierarchyElement): _logger = logging.getLogger(__name__) def __init__(self, hs_development_graph: DGraph, parent: HsHierarchyElement) -> None: super().__init__(parent) self._hs_development_graph = hs_development_graph self._nodes: Optional[Dict[int, DevGraphNode]] = None self._edges: Optional[List[DevGraphEdge]] = None def hs_obj(self): return self._hs_development_graph def hs_update(self, new_hs_obj: DGraph): self._hs_development_graph = new_hs_obj self._logger.debug("Updating hs object of development graph") if self._nodes: for node_id, node in self._nodes.items(): hs_node_maybe = getDGNodeById(self._hs_development_graph)(node_id) if isinstance(hs_node_maybe, Nothing): self._logger.warning(f"Node {node_id} could not be found. Probably, it has been deleted") else: hsNode = fromJust(hs_node_maybe) node.hs_update((node_id, hsNode))
[docs] def nodes(self) -> List[DevGraphNode]: if self._nodes is None: hs_nodes = getLNodesFromDevelopmentGraph(self._hs_development_graph) self._nodes = dict((fst(x), dev_graph_node_from_hs(x, self)) for x in hs_nodes) return list(self._nodes.values())
[docs] def node_by_id(self, node_id: int) -> Optional[DevGraphNode]: if self._nodes is None: self._nodes = {} self._logger.debug("Get node %s in %s", node_id, self._nodes) if node_id not in self._nodes: hs_node_maybe = getDGNodeById(self._hs_development_graph)(node_id) if isinstance(hs_node_maybe, Just): hs_node = fromJust(hs_node_maybe) node = dev_graph_node_from_hs(hs_node, self) self._nodes[node_id] = node return self._nodes.get(node_id, None)
[docs] def edges(self) -> List[DevGraphEdge]: hs_edges = getLEdgesFromDevelopmentGraph(self._hs_development_graph) return [DefinitionDevGraphEdge(x, self) if isinstance(getDevGraphLinkType(thd(x)), DefinitionLink) else TheoremDevGraphEdge(x, self) for x in hs_edges]
[docs] def global_annotations(self) -> GlobalAnnotations: return GlobalAnnotations(globalAnnotations(self._hs_development_graph))