@Nullable
 private InstructionImpl reduceAllNegationsIntoInstruction(
     GroovyPsiElement currentScope, List<? extends GotoInstruction> negations) {
   if (negations.size() > 1) {
     InstructionImpl instruction = addNode(new InstructionImpl(currentScope));
     for (GotoInstruction negation : negations) {
       addEdge(negation, instruction);
     }
     return instruction;
   } else if (negations.size() == 1) {
     GotoInstruction instruction = negations.get(0);
     myHead = instruction;
     return instruction;
   }
   return null;
 }
  public Instruction[] buildControlFlow(GroovyPsiElement scope) {
    myInstructions = new ArrayList<InstructionImpl>();
    myProcessingStack = new ArrayDeque<InstructionImpl>();
    myCaughtExceptionInfos = new ArrayDeque<ExceptionInfo>();
    myConditions = new ArrayDeque<ConditionInstruction>();

    myFinallyCount = 0;
    myPending = new ArrayList<Pair<InstructionImpl, GroovyPsiElement>>();
    myInstructionNumber = 0;

    myScope = scope;

    startNode(null);
    if (scope instanceof GrClosableBlock) {
      buildFlowForClosure((GrClosableBlock) scope);
    } else {
      scope.accept(this);
    }

    final InstructionImpl end = startNode(null);
    checkPending(end); // collect return edges

    return assertValidPsi(myInstructions.toArray(new Instruction[myInstructions.size()]));
  }