// query-type: graph
import cpp

class DestructorCallEnhanced extends DestructorCall {
  override string toString() {
    if exists(this.getQualifier().(VariableAccess).getTarget().getName())
    then
      result =
        "call to " + this.getQualifier().(VariableAccess).getTarget().getName() + "." +
          this.getTarget().getName()
    else result = super.toString()
  }
}

string scope(ControlFlowNode x) {
  if exists(x.getControlFlowScope().getQualifiedName())
  then result = x.getControlFlowScope().getQualifiedName()
  else result = "<no scope>"
}

predicate isNode(boolean isEdge, ControlFlowNode x, ControlFlowNode y, string label) {
  isEdge = false and
  x = y and
  label = x.toString() + "\n" + x.getLocation().toString().regexpReplaceAll(".*/", "")
}

predicate isSuccessor(boolean isEdge, ControlFlowNode x, ControlFlowNode y, string label) {
  exists(string truelabel, string falselabel |
    isEdge = true and
    x.getASuccessor() = y and
    (if x.getATrueSuccessor() = y then truelabel = "T" else truelabel = "") and
    (if x.getAFalseSuccessor() = y then falselabel = "F" else falselabel = "") and
    label = truelabel + falselabel
  )
}

from boolean isEdge, ControlFlowNode x, ControlFlowNode y, string label
where isNode(isEdge, x, y, label) or isSuccessor(isEdge, x, y, label)
select scope(x), isEdge, x, y, label
