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 "";
}
});
}
}
}