001package gudusoft.gsqlparser.ir.common;
002
003/**
004 * Visitor interface for traversing IR nodes across all layers.
005 * <p>
006 * Uses generic return type R and context parameter C (inspired by Calcite RelShuttle).
007 * <p>
008 * Concrete visitors should extend {@link AbstractIRVisitor} which provides default
009 * implementations returning null, rather than implementing this interface directly.
010 *
011 * @param <R> return type
012 * @param <C> context type
013 */
014public interface IRVisitor<R, C> {
015
016    // === Bound IR ===
017
018    R visitBoundObjectRef(gudusoft.gsqlparser.ir.bound.BoundObjectRef node, C ctx);
019    R visitBoundColumnRef(gudusoft.gsqlparser.ir.bound.BoundColumnRef node, C ctx);
020    R visitBoundRoutineRef(gudusoft.gsqlparser.ir.bound.BoundRoutineRef node, C ctx);
021    R visitBoundTypeRef(gudusoft.gsqlparser.ir.bound.BoundTypeRef node, C ctx);
022
023    // === Relational IR ===
024    // These will be uncommented as the node classes are created in later phases.
025    // For Phase A, only Bound IR visitor methods are active.
026
027    // R visitScan(ScanNode node, C ctx);
028    // R visitProject(ProjectNode node, C ctx);
029    // R visitFilter(FilterNode node, C ctx);
030    // R visitJoin(JoinNode node, C ctx);
031    // R visitAggregate(AggregateNode node, C ctx);
032    // R visitSetOp(SetOpNode node, C ctx);
033    // R visitSort(SortNode node, C ctx);
034    // R visitLimit(LimitNode node, C ctx);
035    // R visitWindow(WindowNode node, C ctx);
036    // R visitDistinct(DistinctNode node, C ctx);
037    // R visitInsert(InsertNode node, C ctx);
038    // R visitUpdate(UpdateNode node, C ctx);
039    // R visitDelete(DeleteNode node, C ctx);
040    // R visitMerge(MergeNode node, C ctx);
041    // R visitCreateViewAs(CreateViewAsNode node, C ctx);
042    // R visitCreateTableAs(CreateTableAsNode node, C ctx);
043    // R visitCteDefine(CteDefineNode node, C ctx);
044
045    // === Expression IR ===
046    // R visitRexLiteral(RexLiteral node, C ctx);
047    // R visitRexColumnRef(RexColumnRef node, C ctx);
048    // R visitRexCall(RexCall node, C ctx);
049    // R visitRexCase(RexCase node, C ctx);
050    // R visitRexCast(RexCast node, C ctx);
051    // R visitRexSubquery(RexSubquery node, C ctx);
052    // R visitRexFieldAccess(RexFieldAccess node, C ctx);
053    // R visitRexWindowCall(RexWindowCall node, C ctx);
054
055    // === Procedural IR ===
056    // R visitPlBlock(PlBlockNode node, C ctx);
057    // R visitPlDeclare(PlDeclareNode node, C ctx);
058    // R visitPlAssign(PlAssignNode node, C ctx);
059    // R visitPlIf(PlIfNode node, C ctx);
060    // R visitPlLoop(PlLoopNode node, C ctx);
061    // R visitPlCursorDef(PlCursorDefNode node, C ctx);
062    // R visitPlCursorOpen(PlCursorOpenNode node, C ctx);
063    // R visitPlCursorFetch(PlCursorFetchNode node, C ctx);
064    // R visitPlCursorClose(PlCursorCloseNode node, C ctx);
065    // R visitPlCall(PlCallNode node, C ctx);
066    // R visitPlReturn(PlReturnNode node, C ctx);
067    // R visitPlRaise(PlRaiseNode node, C ctx);
068    // R visitPlDynamicSql(PlDynamicSqlNode node, C ctx);
069    // R visitPlExceptionHandler(PlExceptionHandlerNode node, C ctx);
070    // R visitPlForAll(PlForAllNode node, C ctx);
071    // R visitPlPipeRow(PlPipeRowNode node, C ctx);
072    // R visitPlGoto(PlGotoNode node, C ctx);
073    // R visitPlExit(PlExitNode node, C ctx);
074    // R visitPlContinue(PlContinueNode node, C ctx);
075    // R visitPlNull(PlNullNode node, C ctx);
076
077    // === Flow IR ===
078    // R visitCfgBlock(CfgBlock node, C ctx);
079    // R visitCallEdge(CallEdge edge, C ctx);
080    // R visitProvenanceEdge(ProvenanceEdge edge, C ctx);
081
082    /** Default fallback for unknown node types. */
083    R visitDefault(IRNode node, C ctx);
084}