From 1b74cfee4fb6dd62dee1b48543952a8f6e9899f1 Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Tue, 6 Jan 2026 14:59:15 -0300 Subject: [PATCH] refactor: Enforce facade pattern for `query/` module --- crates/plotnik-lib/src/analyze/link.rs | 3 +-- crates/plotnik-lib/src/analyze/recursion.rs | 2 +- .../plotnik-lib/src/analyze/symbol_table.rs | 2 +- .../src/analyze/type_check/infer.rs | 2 +- .../plotnik-lib/src/analyze/type_check/mod.rs | 2 +- crates/plotnik-lib/src/emit/emitter.rs | 2 +- .../parser/tests/recovery/coverage_tests.rs | 3 +-- crates/plotnik-lib/src/query/mod.rs | 22 +++++++++---------- crates/plotnik-lib/src/query/printer.rs | 5 ++--- crates/plotnik-lib/src/query/query_tests.rs | 8 +++---- .../plotnik-lib/src/query/source_map_tests.rs | 2 +- .../src/query/{query.rs => stages.rs} | 2 +- 12 files changed, 25 insertions(+), 30 deletions(-) rename crates/plotnik-lib/src/query/{query.rs => stages.rs} (99%) diff --git a/crates/plotnik-lib/src/analyze/link.rs b/crates/plotnik-lib/src/analyze/link.rs index f188e8cd..2942cd5b 100644 --- a/crates/plotnik-lib/src/analyze/link.rs +++ b/crates/plotnik-lib/src/analyze/link.rs @@ -26,8 +26,7 @@ use super::visitor::{Visitor, walk}; use crate::diagnostics::{DiagnosticKind, Diagnostics}; use crate::parser::ast::{self, Expr, NamedNode}; use crate::parser::{SyntaxKind, SyntaxToken, token_src}; -use crate::query::query::AstMap; -use crate::query::source_map::{SourceId, SourceMap}; +use crate::query::{AstMap, SourceId, SourceMap}; /// Link query against a language grammar. /// diff --git a/crates/plotnik-lib/src/analyze/recursion.rs b/crates/plotnik-lib/src/analyze/recursion.rs index 638b4607..7b400b1d 100644 --- a/crates/plotnik-lib/src/analyze/recursion.rs +++ b/crates/plotnik-lib/src/analyze/recursion.rs @@ -13,7 +13,7 @@ use super::visitor::{Visitor, walk_expr, walk_named_node}; use crate::Diagnostics; use crate::diagnostics::DiagnosticKind; use crate::parser::{AnonymousNode, Def, Expr, NamedNode, Ref, Root, SeqExpr}; -use crate::query::source_map::SourceId; +use crate::query::SourceId; /// Validate recursion using the pre-computed dependency analysis. pub fn validate_recursion( diff --git a/crates/plotnik-lib/src/analyze/symbol_table.rs b/crates/plotnik-lib/src/analyze/symbol_table.rs index a7afcce7..e020a992 100644 --- a/crates/plotnik-lib/src/analyze/symbol_table.rs +++ b/crates/plotnik-lib/src/analyze/symbol_table.rs @@ -11,7 +11,7 @@ use crate::diagnostics::DiagnosticKind; use crate::parser::{Root, ast, token_src}; use super::visitor::Visitor; -use crate::query::source_map::{SourceId, SourceMap}; +use crate::query::{SourceId, SourceMap}; /// Sentinel name for unnamed definitions (bare expressions at root level). /// Code generators can emit whatever name they want for this. diff --git a/crates/plotnik-lib/src/analyze/type_check/infer.rs b/crates/plotnik-lib/src/analyze/type_check/infer.rs index 9ce7d4a8..3abd47da 100644 --- a/crates/plotnik-lib/src/analyze/type_check/infer.rs +++ b/crates/plotnik-lib/src/analyze/type_check/infer.rs @@ -26,7 +26,7 @@ use crate::parser::{ AltExpr, AltKind, AnonymousNode, CapturedExpr, Def, Expr, FieldExpr, NamedNode, QuantifiedExpr, Ref, Root, SeqExpr, SyntaxKind, is_truly_empty_scope, }; -use crate::query::source_map::SourceId; +use crate::query::SourceId; /// Type annotation kind from `@capture :: Type` syntax. /// diff --git a/crates/plotnik-lib/src/analyze/type_check/mod.rs b/crates/plotnik-lib/src/analyze/type_check/mod.rs index 509a5ef9..9a6f0391 100644 --- a/crates/plotnik-lib/src/analyze/type_check/mod.rs +++ b/crates/plotnik-lib/src/analyze/type_check/mod.rs @@ -32,7 +32,7 @@ use crate::analyze::dependencies::DependencyAnalysis; use crate::analyze::symbol_table::{SymbolTable, UNNAMED_DEF}; use crate::diagnostics::Diagnostics; use crate::parser::Root; -use crate::query::source_map::SourceId; +use crate::query::SourceId; /// Run type inference on all definitions. /// diff --git a/crates/plotnik-lib/src/emit/emitter.rs b/crates/plotnik-lib/src/emit/emitter.rs index 04fb6646..de9b88f2 100644 --- a/crates/plotnik-lib/src/emit/emitter.rs +++ b/crates/plotnik-lib/src/emit/emitter.rs @@ -12,7 +12,7 @@ use crate::bytecode::{ Entrypoint, FieldSymbol, Header, NodeSymbol, SECTION_ALIGN, TriviaEntry, TypeMetaHeader, }; use crate::compile::Compiler; -use crate::query::query::LinkedQuery; +use crate::query::LinkedQuery; use super::EmitError; use super::layout::CacheAligned; diff --git a/crates/plotnik-lib/src/parser/tests/recovery/coverage_tests.rs b/crates/plotnik-lib/src/parser/tests/recovery/coverage_tests.rs index 3b3f4bb8..c8928a82 100644 --- a/crates/plotnik-lib/src/parser/tests/recovery/coverage_tests.rs +++ b/crates/plotnik-lib/src/parser/tests/recovery/coverage_tests.rs @@ -1,5 +1,4 @@ -use crate::Query; -use crate::query::query::QueryBuilder; +use crate::{Query, query::QueryBuilder}; use indoc::indoc; #[test] diff --git a/crates/plotnik-lib/src/query/mod.rs b/crates/plotnik-lib/src/query/mod.rs index f0b47dbf..a9ce0017 100644 --- a/crates/plotnik-lib/src/query/mod.rs +++ b/crates/plotnik-lib/src/query/mod.rs @@ -1,16 +1,9 @@ +//! Query facade for Plotnik compilation. + mod dump; mod printer; -pub mod source_map; - -pub use printer::QueryPrinter; -pub use query::{Query, QueryBuilder, QueryContext}; -pub use source_map::{SourceId, SourceMap}; - -#[allow(clippy::module_inception)] -pub mod query; - -// Re-export from analyze/ for backwards compatibility -pub use crate::analyze::SymbolTable; +mod source_map; +mod stages; #[cfg(test)] mod printer_tests; @@ -18,3 +11,10 @@ mod printer_tests; mod query_tests; #[cfg(test)] mod source_map_tests; + +// Public API +pub use printer::QueryPrinter; +pub use source_map::{Source, SourceId, SourceKind, SourceMap}; +pub use stages::{ + AstMap, LinkedQuery, Query, QueryAnalyzed, QueryBuilder, QueryConfig, QueryContext, QueryParsed, +}; diff --git a/crates/plotnik-lib/src/query/printer.rs b/crates/plotnik-lib/src/query/printer.rs index 834b13ab..c7defc5a 100644 --- a/crates/plotnik-lib/src/query/printer.rs +++ b/crates/plotnik-lib/src/query/printer.rs @@ -1,5 +1,6 @@ //! AST/CST pretty-printer for debugging and test snapshots. +use std::collections::HashMap; use std::fmt::Write; use indexmap::IndexSet; @@ -8,7 +9,7 @@ use rowan::NodeOrToken; use crate::parser::{self as ast, SyntaxNode}; use super::Query; -use super::source_map::SourceKind; +use super::SourceKind; use crate::analyze::type_check::Arity; /// Returns indentation string for the given level. @@ -111,8 +112,6 @@ impl<'q> QueryPrinter<'q> { } fn format_symbols(&self, w: &mut impl Write) -> std::fmt::Result { - use std::collections::HashMap; - let symbols = &self.query.symbol_table; if symbols.is_empty() { return Ok(()); diff --git a/crates/plotnik-lib/src/query/query_tests.rs b/crates/plotnik-lib/src/query/query_tests.rs index b07d4e8a..498e3767 100644 --- a/crates/plotnik-lib/src/query/query_tests.rs +++ b/crates/plotnik-lib/src/query/query_tests.rs @@ -1,10 +1,8 @@ use plotnik_langs::{Lang, from_name}; -use crate::{ - SourceMap, - bytecode::Module, - query::query::{LinkedQuery, QueryAnalyzed, QueryBuilder}, -}; +use crate::{SourceMap, bytecode::Module}; + +use super::{LinkedQuery, QueryAnalyzed, QueryBuilder}; fn javascript() -> Lang { from_name("javascript").expect("javascript lang") diff --git a/crates/plotnik-lib/src/query/source_map_tests.rs b/crates/plotnik-lib/src/query/source_map_tests.rs index adab45da..4f91d670 100644 --- a/crates/plotnik-lib/src/query/source_map_tests.rs +++ b/crates/plotnik-lib/src/query/source_map_tests.rs @@ -1,4 +1,4 @@ -use super::source_map::{SourceId, SourceKind, SourceMap}; +use super::{SourceId, SourceKind, SourceMap}; #[test] fn single_one_liner() { diff --git a/crates/plotnik-lib/src/query/query.rs b/crates/plotnik-lib/src/query/stages.rs similarity index 99% rename from crates/plotnik-lib/src/query/query.rs rename to crates/plotnik-lib/src/query/stages.rs index 568453a7..a3debdc1 100644 --- a/crates/plotnik-lib/src/query/query.rs +++ b/crates/plotnik-lib/src/query/stages.rs @@ -5,6 +5,7 @@ use indexmap::IndexMap; use plotnik_core::{Interner, NodeFieldId, NodeTypeId, Symbol}; use plotnik_langs::Lang; +use super::{SourceId, SourceMap}; use crate::Diagnostics; use crate::analyze::link; use crate::analyze::symbol_table::{SymbolTable, resolve_names}; @@ -12,7 +13,6 @@ use crate::analyze::type_check::{self, Arity, TypeContext}; use crate::analyze::validation::{validate_alt_kinds, validate_anchors}; use crate::analyze::{dependencies, validate_recursion}; use crate::parser::{Parser, Root, SyntaxNode, lex}; -use crate::query::source_map::{SourceId, SourceMap}; const DEFAULT_QUERY_PARSE_FUEL: u32 = 1_000_000; const DEFAULT_QUERY_PARSE_MAX_DEPTH: u32 = 4096;