use crate::ast::{AliasSpec, Ast, ComposeItemSpec, LoopSpec, NodeId};
use proc_macro2::Span;
use std::rc::Rc;
use syn::spanned::Spanned;
use syn::Block;
#[derive(Debug)]
pub struct RawAST {
id: NodeId,
loops: Option<Rc<LoopSpec>>,
spec: Option<Rc<AliasSpec>>,
block: Block,
}
impl Ast for RawAST {
fn id(&self) -> NodeId {
self.id
}
fn span(&self) -> Span {
if let Some(loops) = &self.loops {
loops.span()
} else if let Some(spec) = &self.spec {
spec.span()
} else {
self.block.span()
}
}
}
impl RawAST {
pub fn new(
id: NodeId,
loops: Option<Rc<LoopSpec>>,
spec: Option<Rc<AliasSpec>>,
block: Block,
) -> Self {
Self {
id,
loops,
spec,
block,
}
}
pub fn from_compose_item_spec(spec: &ComposeItemSpec, block: Block) -> Self {
Self {
id: spec.id(),
loops: spec.loops(),
spec: spec.spec(),
block,
}
}
pub fn loops(&self) -> Option<Rc<LoopSpec>> {
self.loops.clone()
}
pub fn spec(&self) -> Option<Rc<AliasSpec>> {
self.spec.clone()
}
pub fn block(&self) -> &Block {
&self.block
}
}