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}