// filter: S -> bool static void printExplainTree2_filterClasses(Explain e, O filter) { printExplainTree2_filterClasses(0, e, filter); } static void printExplainTree2_filterClasses(int indent, Explain e, O filter) { bool printNulls = false; if (e == null) { // this would print "null" for every etc if (printNulls) print(indent(indent) + "null"); } else { new L classNames; while true { addIfMatchesPredicate(classNames, e.className(), filter); if (!e.singleEqualChild()) break; e = e.sub(0); } print(indent(indent) + join(", ", classNames) + " | " + e.string()); for (Explain sub : e.subs) printExplainTree2_filterClasses(indent+2, sub, filter); } }