use starlark_syntax::syntax::def::DefParamIndices;
use starlark_syntax::syntax::def::DefRegularParamMode;
use crate::collections::symbol::symbol::Symbol;
use crate::environment::slots::ModuleSlotId;
use crate::eval::compiler::expr::CompareOp;
use crate::eval::compiler::span::IrSpanned;
use crate::eval::runtime::frame_span::FrameSpan;
use crate::values::typing::type_compiled::compiled::TypeCompiled;
use crate::values::FrozenRef;
use crate::values::FrozenValue;
use crate::values::FrozenValueTyped;
use crate::values::StarlarkValue;
pub(crate) trait VisitSpanMut {
fn visit_spans(&mut self, visitor: &mut impl FnMut(&mut FrameSpan));
}
impl<V: VisitSpanMut> VisitSpanMut for IrSpanned<V> {
fn visit_spans(&mut self, visitor: &mut impl FnMut(&mut FrameSpan)) {
visitor(&mut self.span);
self.node.visit_spans(visitor);
}
}
impl VisitSpanMut for FrozenValue {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}
impl VisitSpanMut for TypeCompiled<FrozenValue> {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}
impl VisitSpanMut for String {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}
impl VisitSpanMut for bool {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}
impl VisitSpanMut for u32 {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}
impl VisitSpanMut for ModuleSlotId {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}
impl VisitSpanMut for CompareOp {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}
impl<V: VisitSpanMut> VisitSpanMut for Box<V> {
fn visit_spans(&mut self, visitor: &mut impl FnMut(&mut FrameSpan)) {
(**self).visit_spans(visitor);
}
}
impl<T: StarlarkValue<'static>> VisitSpanMut for FrozenValueTyped<'static, T> {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}
impl<T> VisitSpanMut for FrozenRef<'static, T> {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}
impl VisitSpanMut for Symbol {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}
impl<A: VisitSpanMut, B: VisitSpanMut> VisitSpanMut for (A, B) {
fn visit_spans(&mut self, visitor: &mut impl FnMut(&mut FrameSpan)) {
self.0.visit_spans(visitor);
self.1.visit_spans(visitor);
}
}
impl<A: VisitSpanMut, B: VisitSpanMut, C: VisitSpanMut> VisitSpanMut for (A, B, C) {
fn visit_spans(&mut self, visitor: &mut impl FnMut(&mut FrameSpan)) {
self.0.visit_spans(visitor);
self.1.visit_spans(visitor);
self.2.visit_spans(visitor);
}
}
impl<A: VisitSpanMut, B: VisitSpanMut, C: VisitSpanMut, D: VisitSpanMut> VisitSpanMut
for (A, B, C, D)
{
fn visit_spans(&mut self, visitor: &mut impl FnMut(&mut FrameSpan)) {
self.0.visit_spans(visitor);
self.1.visit_spans(visitor);
self.2.visit_spans(visitor);
self.3.visit_spans(visitor);
}
}
impl<V: VisitSpanMut> VisitSpanMut for Vec<V> {
fn visit_spans(&mut self, visitor: &mut impl FnMut(&mut FrameSpan)) {
for v in self {
v.visit_spans(visitor);
}
}
}
impl<V: VisitSpanMut> VisitSpanMut for Option<V> {
fn visit_spans(&mut self, visitor: &mut impl FnMut(&mut FrameSpan)) {
if let Some(v) = self {
v.visit_spans(visitor);
}
}
}
impl VisitSpanMut for DefRegularParamMode {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}
impl VisitSpanMut for DefParamIndices {
fn visit_spans(&mut self, _visitor: &mut impl FnMut(&mut FrameSpan)) {}
}