* git mv src/wasm-lib rust Signed-off-by: Jess Frazelle <github@jessfraz.com> * mv wasm-lib to workspace Signed-off-by: Jess Frazelle <github@jessfraz.com> * mv kcl-lib Signed-off-by: Jess Frazelle <github@jessfraz.com> * mv derive docs Signed-off-by: Jess Frazelle <github@jessfraz.com> * resolve file paths Signed-off-by: Jess Frazelle <github@jessfraz.com> * clippy Signed-off-by: Jess Frazelle <github@jessfraz.com> * move more shit Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix more paths Signed-off-by: Jess Frazelle <github@jessfraz.com> * make yarn build:wasm work Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix scripts Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixups Signed-off-by: Jess Frazelle <github@jessfraz.com> * better references Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix cargo ci Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix reference Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix more ci Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> * cargo sort Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix script Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix a dep Signed-off-by: Jess Frazelle <github@jessfraz.com> * sort Signed-off-by: Jess Frazelle <github@jessfraz.com> * remove unused deps Signed-off-by: Jess Frazelle <github@jessfraz.com> * Revert "remove unused deps" This reverts commit fbabdb062e275fd5cbc1476f8480a1afee15d972. * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * deps; Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com>
86 lines
2.0 KiB
Rust
86 lines
2.0 KiB
Rust
use anyhow::Result;
|
|
|
|
use super::ast_visitor::{Visitable, Visitor};
|
|
use crate::{
|
|
parsing::ast::types::{NodeRef, Program},
|
|
walk::Node,
|
|
};
|
|
|
|
/// *DEPRECATED* Walk trait.
|
|
///
|
|
/// This was written before [Visitor], which is the better way to traverse
|
|
/// a AST.
|
|
///
|
|
/// This trait continues to exist in order to not change all the linter
|
|
/// as we refine the walk code.
|
|
///
|
|
/// This, internally, uses the new [Visitor] trait, and is only provided as
|
|
/// a stub until we migrate all existing code off this trait.
|
|
pub trait Walker<'a> {
|
|
/// Walk will visit every element of the AST, recursing through the
|
|
/// whole tree.
|
|
fn walk(&self, n: Node<'a>) -> Result<bool>;
|
|
}
|
|
|
|
impl<'tree, VisitorT> Walker<'tree> for VisitorT
|
|
where
|
|
VisitorT: Visitor<'tree>,
|
|
VisitorT: Clone,
|
|
anyhow::Error: From<VisitorT::Error>,
|
|
VisitorT::Error: Send,
|
|
VisitorT::Error: Sync,
|
|
{
|
|
fn walk(&self, n: Node<'tree>) -> Result<bool> {
|
|
if !n.visit(self.clone())? {
|
|
return Ok(false);
|
|
}
|
|
for child in n.children() {
|
|
if !Self::walk(self, child)? {
|
|
return Ok(false);
|
|
}
|
|
}
|
|
Ok(true)
|
|
}
|
|
}
|
|
|
|
/// Run the Walker against all [Node]s in a [Program].
|
|
pub fn walk<'a, WalkT>(prog: NodeRef<'a, Program>, f: WalkT) -> Result<bool>
|
|
where
|
|
WalkT: Walker<'a>,
|
|
{
|
|
let prog: Node = prog.into();
|
|
f.walk(prog)
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
macro_rules! kcl {
|
|
( $kcl:expr ) => {{
|
|
$crate::parsing::top_level_parse($kcl).unwrap()
|
|
}};
|
|
}
|
|
|
|
#[test]
|
|
fn stop_walking() {
|
|
let program = kcl!(
|
|
"
|
|
const foo = 1
|
|
const bar = 2
|
|
"
|
|
);
|
|
|
|
walk(&program, |node| {
|
|
if let Node::VariableDeclarator(vd) = node {
|
|
if vd.id.name == "foo" {
|
|
return Ok::<bool, anyhow::Error>(false);
|
|
}
|
|
panic!("walk didn't stop");
|
|
}
|
|
Ok(true)
|
|
})
|
|
.unwrap();
|
|
}
|
|
}
|