示例#1
0
 @Nullable
 @Override
 public Spacing getSpacing(@Nullable Block block, @NotNull Block block2) {
   if (block != null) {
     if (block instanceof SelBlock) {
       if (((SelBlock) block).isNode()) {
         return Spacing.createSpacing(0, 1, 1, true, 1);
       }
     }
     if (block2 instanceof SelBlock) {
       if (((SelBlock) block2).isNode()) {
         return Spacing.createSpacing(0, 1, 1, true, 1);
       }
     }
   }
   return Spacing.createSafeSpacing(false, 0);
 }
  //
  // Visitor generation methods
  //
  public void generateDepthFirstVisitor() throws FileExistsException {
    try {
      File file = new File(visitorDir, outFilename);

      if (Globals.noOverwrite && file.exists()) throw new FileExistsException(outFilename);

      PrintWriter out = new PrintWriter(new FileOutputStream(file), false);
      Spacing spc = new Spacing(INDENT_AMT);

      out.println(Globals.fileHeader(spc));
      out.println();
      out.println(spc.spc + "package " + Globals.visitorPackage + ";");
      if (!Globals.visitorPackage.equals(Globals.nodePackage))
        out.println(spc.spc + "import " + Globals.nodePackage + ".*;");
      out.println(spc.spc + "import java.util.*;\n");
      out.println(spc.spc + "/**");
      out.println(
          spc.spc
              + " * Provides default methods which visit each "
              + "node in the tree in depth-first");
      out.println(spc.spc + " * order.  Your visitors may extend this class.");
      out.println(spc.spc + " */");
      out.println(
          spc.spc
              + "public class "
              + visitorName
              + "<R,A> implements "
              + Globals.GJVisitorName
              + "<R,A> {");
      printAutoVisitorMethods(out);

      spc.updateSpc(+1);
      out.println(spc.spc + "//");
      out.println(spc.spc + "// User-generated visitor methods below");
      out.println(spc.spc + "//");
      out.println();

      for (Enumeration e = classList.elements(); e.hasMoreElements(); ) {
        ClassInfo cur = (ClassInfo) e.nextElement();
        String name = cur.getName();

        out.println(spc.spc + "/**");
        if (Globals.javaDocComments) out.println(spc.spc + " * <PRE>");
        out.println(cur.getEbnfProduction(spc));
        if (Globals.javaDocComments) out.println(spc.spc + " * </PRE>");
        out.println(spc.spc + " */");
        out.print(spc.spc + "public R visit");
        out.println("(" + name + " n, A argu) {");

        spc.updateSpc(+1);
        out.println(spc.spc + "R _ret=null;");
        for (Enumeration f = cur.getNameList().elements(); f.hasMoreElements(); )
          out.println(spc.spc + "n." + (String) f.nextElement() + ".accept(this, argu);");
        out.println(spc.spc + "return _ret;");
        spc.updateSpc(-1);
        out.println(spc.spc + "}\n");
      }

      spc.updateSpc(-1);
      out.println(spc.spc + "}");

      out.flush();
      out.close();
    } catch (IOException e) {
      Errors.hardErr("Could not generate " + outFilename);
    }
  }