collectSlots method

Set<SlotId> collectSlots()

Collects all slot identifiers referenced by this expression.

Implementation

Set<SlotId> collectSlots() {
  final slots = <SlotId>{};

  void visit(Expr expr) {
    switch (expr) {
      case ExprSlot(:final slotId):
        slots.add(slotId);
      case ExprNot(:final arg) || ExprNegate(:final arg):
        visit(arg);
      case ExprAnd(:final left, :final right) ||
          ExprOr(:final left, :final right) ||
          ExprEquals(:final left, :final right) ||
          ExprNotEquals(:final left, :final right) ||
          ExprLessThan(:final left, :final right) ||
          ExprLessThanOrEquals(:final left, :final right) ||
          ExprGreaterThan(:final left, :final right) ||
          ExprGreaterThanOrEquals(:final left, :final right) ||
          ExprAdd(:final left, :final right) ||
          ExprSubt(:final left, :final right) ||
          ExprMult(:final left, :final right) ||
          ExprContains(:final left, :final right) ||
          ExprContainsAll(:final left, :final right) ||
          ExprContainsAny(:final left, :final right) ||
          ExprIn(:final left, :final right):
        visit(left);
        visit(right);
      case ExprGetAttribute(left: final left):
        visit(left);
      case ExprHasAttribute(left: final left):
        visit(left);
      case ExprGetTag(left: final left, tag: final tag):
        visit(left);
        visit(tag);
      case ExprHasTag(left: final left, tag: final tag):
        visit(left);
        visit(tag);
      case ExprLike(left: final left):
        visit(left);
      case ExprIs(left: final left, inExpr: final inExpr):
        visit(left);
        if (inExpr case final Expr expr) {
          visit(expr);
        }
      case ExprIfThenElse(:final cond, :final then, :final otherwise):
        visit(cond);
        visit(then);
        visit(otherwise);
      case ExprSet(:final expressions):
        for (final expression in expressions) {
          visit(expression);
        }
      case ExprRecord(:final attributes):
        for (final expr in attributes.values) {
          visit(expr);
        }
      case ExprExtensionCall(args: final args):
        for (final arg in args) {
          visit(arg);
        }
      default:
        break;
    }
  }

  visit(this);
  return slots;
}