class DefaultTraversalSymbolVisitor<C, R> extends SymbolVisitor<C, R> {

    /*
     * These methods don't call into super to enable subclasses to use overwrite `visitSymbol` to visit all leaves.
     * If we called super.visitXY here,
     * it would cause visitSymbol to be called for Function, FetchReference and MatchPredicate as well.
     */

    @Override
    public R visitFunction(Function symbol, C context) {
        for (Symbol arg : symbol.arguments()) {
            arg.accept(this, context);
        }
        var filter = symbol.filter();
        if (filter != null) {
            filter.accept(this, context);
        }
        return null;
    }

    @Override
    public R visitWindowFunction(WindowFunction symbol, C context) {<FILL_FUNCTION_BODY>}

    @Override
    public R visitFetchReference(FetchReference fetchReference, C context) {
        fetchReference.fetchId().accept(this, context);
        fetchReference.ref().accept(this, context);
        return null;
    }

    @Override
    public R visitMatchPredicate(MatchPredicate matchPredicate, C context) {
        for (Symbol field : matchPredicate.identBoostMap().keySet()) {
            field.accept(this, context);
        }
        matchPredicate.queryTerm().accept(this, context);
        matchPredicate.options().accept(this, context);
        return null;
    }

    @Override
    public R visitAlias(AliasSymbol aliasSymbol, C context) {
        aliasSymbol.symbol().accept(this, context);
        return null;
    }
}

        for (Symbol arg : symbol.arguments()) {
            arg.accept(this, context);
        }
        Symbol filter = symbol.filter();
        if (filter != null) {
            filter.accept(this, context);
        }
        WindowDefinition windowDefinition = symbol.windowDefinition();
        OrderBy orderBy = windowDefinition.orderBy();
        if (orderBy != null) {
            for (Symbol orderBySymbol : orderBy.orderBySymbols()) {
                orderBySymbol.accept(this, context);
            }
        }
        for (Symbol partition : windowDefinition.partitions()) {
            partition.accept(this, context);
        }

        Symbol frameStartValueSymbol = windowDefinition.windowFrameDefinition().start().value();
        if (frameStartValueSymbol != null) {
            frameStartValueSymbol.accept(this, context);
        }

        FrameBoundDefinition end = windowDefinition.windowFrameDefinition().end();
        if (end != null) {
            Symbol frameEndValueSymbol = end.value();
            if (frameEndValueSymbol != null) {
                frameEndValueSymbol.accept(this, context);
            }
        }

        return null;
    
<methods>public non-sealed void <init>() ,public R visitAggregation(io.crate.expression.symbol.Aggregation, C) ,public R visitAlias(io.crate.expression.symbol.AliasSymbol, C) ,public R visitDynamicReference(io.crate.expression.symbol.DynamicReference, C) ,public R visitFetchMarker(io.crate.expression.symbol.FetchMarker, C) ,public R visitFetchReference(io.crate.expression.symbol.FetchReference, C) ,public R visitFetchStub(io.crate.expression.symbol.FetchStub, C) ,public R visitField(io.crate.expression.symbol.ScopedSymbol, C) ,public R visitFunction(io.crate.expression.symbol.Function, C) ,public R visitInputColumn(io.crate.expression.symbol.InputColumn, C) ,public R visitLiteral(Literal<?>, C) ,public R visitMatchPredicate(io.crate.expression.symbol.MatchPredicate, C) ,public R visitOuterColumn(io.crate.expression.symbol.OuterColumn, C) ,public R visitParameterSymbol(io.crate.expression.symbol.ParameterSymbol, C) ,public R visitReference(io.crate.metadata.Reference, C) ,public R visitSelectSymbol(io.crate.expression.symbol.SelectSymbol, C) ,public R visitVoidReference(io.crate.expression.symbol.VoidReference, C) ,public R visitWindowFunction(io.crate.expression.symbol.WindowFunction, C) <variables>