anchor.diff:          //fudge factor to point following stuff back to location preceding inserted newlines
           offsetTracker.recordOffsetChange(-1, lineLength);
        }
  -     (function_separator_blob -> template() "")* { leadingComments = $text; }
  +     ((function_separator_blob { appendToLeadingComments($text, $start.getCharPositionInLine()); }) -> template() "")*
        -> template(gap={"\n\n"}) "<gap>"
     ;
   
  
positive.code: private boolean inCurly() { return !bracketStack.isEmpty() && bracketStack.peek() == LCURLY; }
  private boolean inSquare() { return !bracketStack.isEmpty() && bracketStack.peek() == LSQUARE; }
  
  private String leadingComments = null;
  
  private String getCommentStringToInsert() {
      if(leadingComments == null) {
          return "";
      }
      String commentString = leadingComments + "\n";
      leadingComments = null;
      return commentString;
  }
  }
  
  
negative.code:   ;
  
  function_beginning :
       (((dt_FILLER | dt_LINE_TERMINATOR | dt_COMMENT | dt_BRACKET_COMMENT) { appendToLeadingComments($text, $start.getCharPositionInLine()); }) -> template() "")*
    ;
  
  function_separator :
  