EffectiveStmtCtx is always implemented as a proxy on top of a StatementContextBase – hence it is a superfluous object.
Make sure StmtContext and EffectiveStmtCtx.Current can be implemented by StatementContextBase at the same time. There is a lot of overlap in their methods – these should be isolated into CommonStmtCtx with their (shorter) EffectiveStmtCtx names.
StmtContext should then extend CommonStmtCtx and provide its current method as default forwarders.