diff --git a/Cargo.lock b/Cargo.lock index 50f9989..bedb295 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -401,6 +401,7 @@ dependencies = [ "googletest", "monorepo", "rnix", + "rowan", "status", ] diff --git a/src/xatu/BUILD b/src/xatu/BUILD index 3466168..4a72c08 100644 --- a/src/xatu/BUILD +++ b/src/xatu/BUILD @@ -14,6 +14,7 @@ rust_library( deps = [ "//src/status:status", "//third_party/crates:rnix", + "//third_party/crates/rowan-0.16.1:rowan", ], ) diff --git a/src/xatu/Cargo.toml b/src/xatu/Cargo.toml index ce0e581..d12e186 100644 --- a/src/xatu/Cargo.toml +++ b/src/xatu/Cargo.toml @@ -14,6 +14,7 @@ path = "xatu_main.rs" clap = { workspace = true, features = ["derive"] } monorepo = { workspace = true } rnix = { workspace = true } +rowan = { workspace = true } status = { workspace = true } [dev-dependencies] diff --git a/src/xatu/ast.rs b/src/xatu/ast.rs index 8fb0c90..1addbf4 100644 --- a/src/xatu/ast.rs +++ b/src/xatu/ast.rs @@ -3,10 +3,17 @@ use crate::FileId; #[derive(Debug)] pub struct ParsedFile { pub file_id: FileId, + pub nodes: Vec, pub tokens: Vec, pub errors: Vec, } +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Node { + pub range: SourceRange, + pub data: NodeData, +} + #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct SourceRange { pub start: usize, @@ -19,6 +26,45 @@ impl std::fmt::Display for SourceRange { } } +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum NodeData { + Apply(Apply), + LetIn(LetIn), + Inherit(Inherit), +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Apply { + pub function: Expr, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum Expr { + Ident(Ident), + Select(Box