void process(ExpressionNode node) {
            if (node instanceof ReferenceNode refNode) {
                String featureName = refNode.reference().toString();
                if (! localVariables.contains(featureName)) {
                    target.add(featureName);
                }
                return;
            }
            Optional<FeatureFinder> subProcessor = Optional.empty();
            if (node instanceof TensorFunctionNode t) {
                var fun = t.function();
                if (fun instanceof Generate<?> g) {
                    var ff = new FeatureFinder(target);
                    var genType = g.type(null); // Generate knows its own type without any context
                    for (var dim : genType.dimensions()) {
                        ff.localVariables.add(dim.name());
                    }
                    subProcessor = Optional.of(ff);
                }
            }
            if (node instanceof CompositeNode composite) {
                final FeatureFinder processor = subProcessor.orElse(this);
                composite.children().forEach(child -> processor.process(child));
            }
        }
Returns this as a double binary operator

@throws IllegalStateException if this has more than two arguments
searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java