protected Set<MatcherState> getAllStates(AbstractElement element) { Set<MatcherState> result = newHashSet(); Iterator<EObject> i = EcoreUtil2.eAll(element); while (i.hasNext()) { EObject obj = i.next(); if (obj instanceof AbstractElement) { MatcherState state = nfaProvider.getNFA((AbstractElement) obj); if (state.hasTransitions()) result.add(state); } } return result; }
protected Set<MatcherState> findRuleCallsTo(AbstractRule rule, Set<AbstractRule> visited) { if (!visited.add(rule)) return Collections.emptySet(); Set<MatcherState> result = Sets.newHashSet(); Iterator<EObject> i = rule.eAllContents(); while (i.hasNext()) { EObject obj = i.next(); if (obj instanceof AbstractElement) { MatcherState state = nfaProvider.getNFA((AbstractElement) obj); if (state.hasTransitions()) for (MatcherTransition incoming : state.getAllIncoming()) if (incoming.isRuleCall() && result.add(incoming.getSource()) && incoming.getSource().isEndState()) result.addAll(findRuleCallsTo( GrammarUtil.containingRule(incoming.getSource().getGrammarElement()), visited)); } } return result; }
@Override protected Node drawAbstractElementTree(AbstractElement grammarElement, Digraph digraph) { Node node = super.drawAbstractElementTree(grammarElement, digraph); MatcherState nfas = nfaProvider.getNFA(grammarElement); for (MatcherTransition outgoing : nfas.getOutgoing()) digraph.add(drawFollowerEdge(grammarElement, outgoing, false)); for (MatcherTransition outgoingAfterReturn : nfas.getOutgoingAfterReturn()) digraph.add(drawFollowerEdge(grammarElement, outgoingAfterReturn, true)); // for (MatcherTransition outgoingToNextRule : nfas.getOutgoingToNextRule()) // digraph.add(drawOutgoingToNextRuel(outgoingToNextRule)); if (nfas.isEndState()) node.put("peripheries", "2"); if (!nfas.hasTransitions()) node.setStyle("dotted"); return node; }