docs: public Set<Integer> expressionLiterals(Expression expression) {
          return expression.match(new Expression.MatchBlock<Set<Integer>>() {
              @Override
              public Set<Integer> _case(Add x) {
                  final Set<Integer> results = expressionLiterals(x.left);
                  results.addAll(expressionLiterals(x.right));
                  return results;
              }
  
              @Override
              public Set<Integer> _case(Variable x) {
                  return new HashSet<Integer>();
              }
  
              @Override
              public Set<Integer> _case(IntLiteral x) {
                  return new HashSet<Integer>(asList(x.value));
              }
  
              @Override
              public Set<Integer> _case(LongLiteral x) {
                  return new HashSet<Integer>();
              }
          });
      }