docs: public T visitExpression(Expression elm, C context) {
          if (elm instanceof AggregateExpression) return visitAggregateExpression((AggregateExpression)elm, context);
          else if (elm instanceof AliasRef) return visitAliasRef((AliasRef)elm, context);
          else if (elm instanceof BinaryExpression) return visitBinaryExpression((BinaryExpression)elm, context);
          else if (elm instanceof Case) return visitCase((Case)elm, context);
          else if (elm instanceof Combine) return visitCombine((Combine)elm, context);
          else if (elm instanceof Current) return visitCurrent((Current)elm, context);
          else if (elm instanceof DateTime) return visitDateTime((DateTime)elm, context);
          else if (elm instanceof ExpressionRef) return visitExpressionRef((ExpressionRef)elm, context);
          else if (elm instanceof Filter) return visitFilter((Filter)elm, context);
          else if (elm instanceof First) return visitFirst((First)elm, context);
          else if (elm instanceof ForEach) return visitForEach((ForEach)elm, context);
          else if (elm instanceof FunctionRef) return visitFunctionRef((FunctionRef)elm, context);
          else if (elm instanceof IdentifierRef) return visitIdentifierRef((IdentifierRef)elm, context);
          else if (elm instanceof If) return visitIf((If)elm, context);
          else if (elm instanceof IndexOf) return visitIndexOf((IndexOf)elm, context);
          else if (elm instanceof Instance) return visitInstance((Instance)elm, context);
          else if (elm instanceof Interval) return visitInterval((Interval)elm, context);
          else if (elm instanceof Last) return visitLast((Last)elm, context);
          else if (elm instanceof List) return visitList((List)elm, context);
          else if (elm instanceof Literal) return visitLiteral((Literal)elm, context);
          else if (elm instanceof MaxValue) return visitMaxValue((MaxValue)elm, context);
          else if (elm instanceof MinValue) return visitMinValue((MinValue)elm, context);
          else if (elm instanceof NaryExpression) return visitNaryExpression((NaryExpression)elm, context);
          else if (elm instanceof Now) return visitNow((Now)elm, context);
          else if (elm instanceof Null) return visitNull((Null)elm, context);
          else if (elm instanceof OperandRef) return visitOperandRef((OperandRef)elm, context);
          else if (elm instanceof ParameterRef) return visitParameterRef((ParameterRef)elm, context);
          else if (elm instanceof PositionOf) return visitPositionOf((PositionOf)elm, context);
          else if (elm instanceof Property) return visitProperty((Property)elm, context);
          else if (elm instanceof Query) return visitQuery((Query)elm, context);
          else if (elm instanceof QueryLetRef) return visitQueryLetRef((QueryLetRef)elm, context);
          else if (elm instanceof Round) return visitRound((Round)elm, context);
          else if (elm instanceof Sort) return visitSort((Sort)elm, context);
          else if (elm instanceof Split) return visitSplit((Split)elm, context);
          else if (elm instanceof Substring) return visitSubstring((Substring)elm, context);
          else if (elm instanceof TernaryExpression) return visitTernaryExpression((TernaryExpression)elm, context);
          else if (elm instanceof Time) return visitTime((Time)elm, context);
          else if (elm instanceof TimeOfDay) return visitTimeOfDay((TimeOfDay)elm, context);
          else if (elm instanceof Today) return visitToday((Today)elm, context);
          else if (elm instanceof Tuple) return visitTuple((Tuple)elm, context);
          else if (elm instanceof UnaryExpression) return visitUnaryExpression((UnaryExpression)elm, context);
          else return null;
      }