code: protected void flow(Env<AttrContext> env, Queue<Env<AttrContext>> results) {
          if (compileStates.isDone(env, CompileState.FLOW)) {
              results.add(env);
              return;
          }
  
          try {
              if (shouldStop(CompileState.FLOW))
                  return;
  
              if (relax) {
                  results.add(env);
                  return;
              }
  
              if (verboseCompilePolicy)
                  printNote("[flow " + env.enclClass.sym + "]");
              JavaFileObject prev = log.useSource(
                                                  env.enclClass.sym.sourcefile != null ?
                                                  env.enclClass.sym.sourcefile :
                                                  env.toplevel.sourcefile);
              try {
                  make.at(Position.FIRSTPOS);
                  TreeMaker localMake = make.forToplevel(env.toplevel);
                  flow.analyzeTree(env, localMake);
                  compileStates.put(env, CompileState.FLOW);
  
                  if (shouldStop(CompileState.FLOW))
                      return;
  
                  results.add(env);
              }
              finally {
                  log.useSource(prev);
              }
          }
          finally {
              if (!taskListener.isEmpty()) {
                  TaskEvent e = new TaskEvent(TaskEvent.Kind.ANALYZE, env.toplevel, env.enclClass.sym);
                  taskListener.finished(e);
              }
          }
      }
docs: Perform dataflow checks on an attributed parse tree.