@Override
  public void visitThrowStatement(@NotNull GrThrowStatement throwStatement) {
    final GrExpression exception = throwStatement.getException();
    if (exception == null) return;

    exception.accept(this);
    final InstructionImpl throwInstruction = new ThrowingInstruction(throwStatement);
    addNodeAndCheckPending(throwInstruction);

    interruptFlow();
    final PsiType type = getNominalTypeNoRecursion(exception);

    // it is impossible to follow the consequences of throwing in closure, so throw will just interrupt the closure it was invoked within
    final GroovyPsiElement scopeElement = myFunctionalScopeStack.isEmpty() ? null : throwStatement;

    if (type != null) {
      ExceptionInfo info = findCatch(type);
      if (info != null) {
        info.myThrowers.add(throwInstruction);
      }
      else {
        addPendingEdge(scopeElement, throwInstruction);
      }
    }
    else {
      addPendingEdge(scopeElement, throwInstruction);
    }
  }
@Override
  public void visitThrowStatement(@NotNull GrThrowStatement throwStatement)