import cpp string getASuccessorOrNone(ControlFlowNode n) { if exists(n.getASuccessor()) then exists (ControlFlowNode s, string trueSucc, string falseSucc | s = n.getASuccessor() and if s = n.getATrueSuccessor() then trueSucc = " " else trueSucc = "" and if s = n.getAFalseSuccessor() then falseSucc = " " else falseSucc = "" and result = trueSucc + falseSucc + s.toString()) else result = "" } from ControlFlowNode n select n.getLocation().getFile().getShortName(), n.getControlFlowScope(), n.getLocation().getStartLine(), count(n.getAPredecessor*()), // This helps order things sensibly n.getLocation(), n, getASuccessorOrNone(n)