public void refreshDataModel()

in src/org/intellij/grammar/diagram/BnfDiagramProvider.java [264:353]


    public void refreshDataModel() {
      myNodes.clear();
      myEdges.clear();

      RuleGraphHelper ruleGraphHelper = RuleGraphHelper.getCached(myFile);
      ((BnfDiagramProvider)getProvider()).myGraphHelper = ruleGraphHelper;

      Map<BnfRule, DiagramNode<BnfRule>> nodeMap = new HashMap<>();
      List<BnfRule> rules = myFile.getRules();
      BnfRule root = ContainerUtil.getFirstItem(rules);
      for (BnfRule rule : rules) {
        if (rule != root && !RuleGraphHelper.hasPsiClass(rule)) continue;
        DiagramNode<BnfRule> diagramNode = new PsiDiagramNode<>(rule, getProvider()) {
          @Override
          public String getTooltip() {
            return getIdentifyingElement().getName();
          }
        };
        nodeMap.put(rule, diagramNode);
        myNodes.add(diagramNode);
      }
      for (BnfRule rule : rules) {
        if (rule != root && !RuleGraphHelper.hasPsiClass(rule)) continue;
        Map<PsiElement, RuleGraphHelper.Cardinality> map = ruleGraphHelper.getFor(rule);

        BnfRule superRule = myFile.getRule(getAttribute(rule, KnownAttribute.EXTENDS));
        if (superRule != null) {
          DiagramNode<BnfRule> source = nodeMap.get(rule);
          DiagramNode<BnfRule> target = nodeMap.get(superRule);
          if (source == null || target == null) continue;
          myEdges.add(new DiagramEdgeBase<>(source, target,
                                            new DiagramRelationshipInfoAdapter("EXTENDS", DiagramLineType.DASHED,
                                                                               "extends") {

                                              @Override
                                              public Shape getStartArrow() {
                                                return DELTA;
                                              }
                                            }) {

            @Override
            public @NotNull String getName() {
              return "";
            }
          });
        }
        for (PsiElement element : map.keySet()) {
          if (!(element instanceof BnfRule)) continue;
          RuleGraphHelper.Cardinality cardinality = map.get(element);
          assert cardinality != RuleGraphHelper.Cardinality.NONE;

          DiagramNode<BnfRule> source = nodeMap.get(rule);
          DiagramNode<BnfRule> target = nodeMap.get(element);
          if (source == null || target == null) continue;
          myEdges.add(
            new DiagramEdgeBase<>(source, target, new DiagramRelationshipInfoAdapter("CONTAINS", DiagramLineType.SOLID, "") {
              @Override
              public Label getUpperCenterLabel() {
                return new ColoredLabel(StringUtil.toLowerCase(cardinality.name()));
              }

              @Override
              public Shape getStartArrow() {
                return DELTA;
              }
            }) {

              @Override
              public Object getSourceAnchor() {
                return element;
              }

              @Override
              public Object getTargetAnchor() {
                return element;
              }

              @Override
              public Color getAnchorColor() {
                return JBColor.BLUE;
              }

              @Override
              public @NotNull String getName() {
                return "";
              }
            });
        }
      }
    }