collectSlots method
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;
}