visitFrameSpec method

  1. @override
void visitFrameSpec(
  1. FrameSpec e,
  2. void arg
)
override

Implementation

@override
void visitFrameSpec(FrameSpec e, void arg) {
  void frameBoundary(FrameBoundary boundary) {
    void precedingOrFollowing(bool preceding) {
      if (boundary.isUnbounded) {
        keyword(TokenType.unbounded);
      } else {
        visit(boundary.offset!, arg);
      }

      keyword(preceding ? TokenType.preceding : TokenType.following);
    }

    if (boundary.isCurrentRow) {
      keyword(TokenType.current);
      keyword(TokenType.row);
    } else if (boundary.preceding) {
      precedingOrFollowing(true);
    } else {
      precedingOrFollowing(false);
    }
  }

  keyword(const {
    FrameType.range: TokenType.range,
    FrameType.rows: TokenType.rows,
    FrameType.groups: TokenType.groups,
  }[e.type!]!);

  keyword(TokenType.between);
  frameBoundary(e.start);
  keyword(TokenType.and);
  frameBoundary(e.end);

  if (e.excludeMode != null) {
    keyword(TokenType.exclude);
    switch (e.excludeMode!) {
      case ExcludeMode.noOthers:
        keyword(TokenType.no);
        keyword(TokenType.others);
        break;
      case ExcludeMode.currentRow:
        keyword(TokenType.current);
        keyword(TokenType.row);
        break;
      case ExcludeMode.group:
        keyword(TokenType.group);
        break;
      case ExcludeMode.ties:
        keyword(TokenType.ties);
        break;
    }
  }
}