src/language-js/print/flow.js/printFlow
function printFlow(path, options, print) {
  const n = path.getValue();
  const semi = options.semi ? ";" : "";
  switch (n.type) {
    case "DeclareClass":
      return printFlowDeclaration(path, printClass(path, options, print));
    case "DeclareFunction":
      return printFlowDeclaration(
        path,
        concat([
          "function ",
          path.call(print, "id"),
          n.predicate ? " " : "",
          path.call(print, "predicate"),
          semi,
        ])
      );
    case "DeclareModule":
      return printFlowDeclaration(
        path,
        concat([
          "module ",
          path.call(print, "id"),
          " ",
          path.call(print, "body"),
        ])
      );
    case "DeclareModuleExports":
      return printFlowDeclaration(
        path,
        concat([
          "module.exports",
          ": ",
          path.call(print, "typeAnnotation"),
          semi,
        ])
      );
    case "DeclareVariable":
      return printFlowDeclaration(
        path,
        concat(["var ", path.call(print, "id"), semi])
      );
    case "DeclareOpaqueType":
      return printFlowDeclaration(path, printOpaqueType(path, options, print));
    case "DeclareInterface":
      return printFlowDeclaration(path, printInterface(path, options, print));
    case "DeclareTypeAlias":
      return printFlowDeclaration(path, printTypeAlias(path, options, print));
    case "DeclareExportDeclaration":
      return printFlowDeclaration(
        path,
        printExportDeclaration(path, options, print)
      );
    case "DeclareExportAllDeclaration":
      return printFlowDeclaration(
        path,
        printExportAllDeclaration(path, options, print)
      );
    case "OpaqueType":
      return printOpaqueType(path, options, print);
    case "TypeAlias":
      return printTypeAlias(path, options, print);
    case "IntersectionTypeAnnotation":
      return printIntersectionType(path, options, print);
    case "UnionTypeAnnotation":
      return printUnionType(path, options, print);
    case "FunctionTypeAnnotation":
      return printFunctionType(path, options, print);
    case "TupleTypeAnnotation":
      return printTupleType(path, options, print);
    case "GenericTypeAnnotation":
      return concat([
        path.call(print, "id"),
        printTypeParameters(path, options, print, "typeParameters"),
      ]);
    // Type Annotations for Facebook Flow, typically stripped out or
    // transformed away before printing.
    case "TypeAnnotation":
      return path.call(print, "typeAnnotation");
  }
}