protected List<MatcherTransition> findTransitionsToToken(MatcherState from, Set<MatcherState> targets,
boolean returning, boolean canReturn, Set<MatcherState> visited) {
if (!visited.add(from))
return Collections.emptyList();
if (targets != null && targets.contains(from))
targets = null;
List<MatcherTransition> result = Lists.newArrayList();
for (MatcherTransition transition : returning ? from.getOutgoingAfterReturn() : from.getOutgoing()) {
if (transition.getTarget().isParserRuleCall())
result.addAll(findTransitionsToToken(transition.getTarget(), targets, false, transition.getTarget()
.isParserRuleCallOptional(), visited));
else if (targets == null || targets.contains(transition.getTarget()))
result.add(transition);
}
if (canReturn && from.isEndState())
for (MatcherState caller : findRuleCallsTo(GrammarUtil.containingRule(from.getGrammarElement()),
Sets.<AbstractRule> newHashSet()))
result.addAll(findTransitionsToToken(caller, targets, true, true, visited));
return result;
}