From bf2992dfea327453f8a3c93ac7f7ec3b3066f884 Mon Sep 17 00:00:00 2001 From: Lukas Heidemann Date: Tue, 12 Aug 2025 13:34:44 +0100 Subject: [PATCH 1/5] Documentation. --- hugr-model/src/v0/mod.rs | 69 +++++---- tree-sitter-hugr/Cargo.lock | 199 +++++++++++++++++++++++++ tree-sitter-hugr/hugr.dylib | Bin 0 -> 149464 bytes tree-sitter-hugr/tree-sitter-hugr.wasm | Bin 0 -> 67038 bytes 4 files changed, 235 insertions(+), 33 deletions(-) create mode 100644 tree-sitter-hugr/Cargo.lock create mode 100755 tree-sitter-hugr/hugr.dylib create mode 100755 tree-sitter-hugr/tree-sitter-hugr.wasm diff --git a/hugr-model/src/v0/mod.rs b/hugr-model/src/v0/mod.rs index c74201a910..d832168b64 100644 --- a/hugr-model/src/v0/mod.rs +++ b/hugr-model/src/v0/mod.rs @@ -1,14 +1,10 @@ -//! Version 0 (unstable). -//! -//! **Warning**: This module is still under development and is expected to change. -//! It is included in the library to allow for early experimentation, and for -//! the core and model to converge incrementally. +//! Version 0. //! //! This module defines representations of the hugr IR as plain data, designed -//! to be as independent of implementation details as feasible. It can be used -//! by the core compiler, alternative implementations or tooling that does not -//! need the power/complexity of the full compiler. We provide the following -//! in-memory representations: +//! to be as independent of implementation details of the compiler as feasible. +//! It can be used by the core compiler, alternative implementations or tooling +//! that does not need the power/complexity of the full compiler. We provide the +//! following in-memory representations: //! //! - [Table]: Efficient intermediate data structure to facilitate conversions. //! - [AST]: Abstract syntax tree that uses direct references rather than table indices. @@ -28,18 +24,22 @@ //! //! Nodes are organised into __regions__ and do not have any explicit ordering //! between them; any schedule that respects the data dependencies between nodes -//! is valid. Regions come in three different kinds. __Module regions__ form the +//! is valid. Previous designs included order-edges that could be added between nodes +//! to further constrain the ordering; as long as this system is still used, order hint +//! metadata can be used to encode the additional ordering constraints. +//! +//! Regions come in three different kinds. __Module regions__ form the //! top level of a module and can only contain symbols. __Dataflow regions__ //! describe how data flows from the region's __source__ ports to the region's -//! __target__ ports. __Controlflow regions__ are control flow graphs containing -//! dataflow __blocks__, with control flow originating from the region's source -//! ports and ending in the region's target ports. +//! __target__ ports and are restricted to contain instructions. __Controlflow regions__ +//! are control flow graphs containing dataflow __blocks__, with control flow originating +//! from the region's source ports and ending in the region's target ports. //! //! __Terms__ form a meta language that is used to describe types, parameters and metadata that -//! are known statically. To allow types to be parameterized by values, types and values -//! are treated uniformly as terms, enabling a restricted form of dependent typing. -//! Terms are extensible declaratively via __constructors__. -//! __Constraints__ can be used to express more complex validation rules. +//! are known statically. To allow types to be parameterized by statically known values, types +//! and static values are treated uniformly as terms, enabling a restricted form of dependent typing. +//! Terms are extensible declaratively via __constructors__. __Constraints__ can be used to express +//! more complex validation rules. //! //! # Remaining Mismatch with `hugr-core` //! @@ -48,15 +48,26 @@ //! development. However, there are still some mismatches with `hugr-core` that are not //! addressed by conversions in import/export: //! -//! - Some static types can not yet be represented in `hugr-core` although they should be. +//! - Some terms can not yet be represented in `hugr-core` although they should be. +//! Importing such terms will result in an error that declares these terms as currently +//! unsupported. +//! - In particular `hugr-core` currently only allows to define custom runtime types but +//! can not represent custom term constructors for static types. Implementing support for +//! static `Term`s in `hugr-core` will allow to use the term system for extensible metadata +//! and constants. Once that is implemented, the hugr IR will have a unified extension mechanism. +//! - `hugr-core` uses a JSON encoding for metadata which is supported by `hugr-model` via the +//! `compat.meta_json` metadata constructor. `hugr-model` further allows to declare custom +//! metadata constructors so that metadata can be composed of terms. These are currently not +//! supported in `hugr-core` beyond a few exceptions which are hard-coded into the import/export +//! process. +//! - `hugr-core` uses JSON encoded constants. Similarly to metadata, `hugr-model` provides a +//! compatibility mechanism via the `compat.const_json` constant constructor but also allows +//! to declare custom constant constructors. Import/export has hard-coded support for a small +//! fixed set of these for now. //! - The model does not have types with a copy bound as `hugr-core` does, and instead uses //! a more general form of type constraints ([#1556]). Similarly, the model does not have //! bounded naturals. We perform a conversion for compatibility where possible, but this does //! not fully cover all potential cases of bounds. -//! - `hugr-model` allows to declare term constructors that serve as blueprints for constructing -//! runtime values. This allows constants to have potentially multiple representations, -//! which can be essential in case of very large constants that require efficient encodings. -//! `hugr-core` is more restricted, requiring a canonical representation for constant values. //! - `hugr-model` has support for passing closed regions as static parameters to operations, //! which allows for higher-order operations that require their function arguments to be //! statically known. We currently do not yet support converting this to `hugr-core`. @@ -65,19 +76,11 @@ //! `hugr-core` restricts connectivity so that in any group of connected ports there is at //! most one output port (for dataflow) or at most one input port (for control flow). In //! these cases, there is no mismatch. -//! - `hugr-core` only allows to define type aliases, but not aliases for other terms. -//! - `hugr-model` has no concept of order edges, encoding a strong preference that ordering -//! requirements be encoded within the dataflow paradigm. -//! - Both `hugr-model` and `hugr-core` support metadata, but they use different encodings. -//! `hugr-core` encodes metadata as JSON objects, while `hugr-model` uses terms. Using -//! terms has the advantage that metadata can be validated with the same type checking -//! mechanism as the rest of the model ([#1553]). -//! - `hugr-model` have a root region that corresponds to a root `Module` in `hugr-core`. -//! `hugr-core` however can have nodes with different operations as their root ([#1554]). +//! - `hugr-core` only allows to define type aliases, but not aliases for other terms. The +//! alias system is under-developed in both `hugr-core` and `hugr-model` and will need some +//! considerable design and implementation work (or to be removed if deemed unnecessary). //! //! [#1556]: https://github.com/CQCL/hugr/discussions/1556 -//! [#1553]: https://github.com/CQCL/hugr/issues/1553 -//! [#1554]: https://github.com/CQCL/hugr/issues/1554 //! [Text]: crate::v0::ast //! [Binary]: crate::v0::binary //! [Table]: crate::v0::table diff --git a/tree-sitter-hugr/Cargo.lock b/tree-sitter-hugr/Cargo.lock new file mode 100644 index 0000000000..652ad56bec --- /dev/null +++ b/tree-sitter-hugr/Cargo.lock @@ -0,0 +1,199 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "cc" +version = "1.2.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" +dependencies = [ + "shlex", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "hashbrown" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" + +[[package]] +name = "indexmap" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "indexmap", + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tree-sitter" +version = "0.25.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7b8994f367f16e6fa14b5aebbcb350de5d7cbea82dc5b00ae997dd71680dd2" +dependencies = [ + "cc", + "regex", + "regex-syntax", + "serde_json", + "streaming-iterator", + "tree-sitter-language", +] + +[[package]] +name = "tree-sitter-hugr" +version = "0.1.0" +dependencies = [ + "cc", + "tree-sitter", + "tree-sitter-language", +] + +[[package]] +name = "tree-sitter-language" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4013970217383f67b18aef68f6fb2e8d409bc5755227092d32efb0422ba24b8" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" diff --git a/tree-sitter-hugr/hugr.dylib b/tree-sitter-hugr/hugr.dylib new file mode 100755 index 0000000000000000000000000000000000000000..6434e0521190adf0fd41e254f43d7d234e9c2049 GIT binary patch literal 149464 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 literal 0 HcmV?d00001 diff --git a/tree-sitter-hugr/tree-sitter-hugr.wasm b/tree-sitter-hugr/tree-sitter-hugr.wasm new file mode 100755 index 0000000000000000000000000000000000000000..dc157b0239fc8d377b649faa16cc239f3fc1a394 GIT binary patch literal 67038 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 a$$9zq;91sz1C@YHKwUuAy)>``{{Ig?^1PS; literal 0 HcmV?d00001 From dae5d632d650840250b27f61bc79f89a9a3a2cbd Mon Sep 17 00:00:00 2001 From: Lukas Heidemann Date: Tue, 12 Aug 2025 13:54:27 +0100 Subject: [PATCH 2/5] Error hints in import. More error messages. --- hugr-core/src/import.rs | 262 +++++++++++++++++++++++++++++++++++----- 1 file changed, 232 insertions(+), 30 deletions(-) diff --git a/hugr-core/src/import.rs b/hugr-core/src/import.rs index 98d21f55cc..f1d65ece5f 100644 --- a/hugr-core/src/import.rs +++ b/hugr-core/src/import.rs @@ -52,17 +52,47 @@ pub struct ImportError { generator: Option, } +const UNSUPPORTED_HINT: &str = concat!( + "Hint: The import process encountered a `hugr-model` feature", + "that is currently unsupported in `hugr-core`.", + "As `hugr-core` evolves towards the same expressivity as `hugr-model`", + "we expect that errors of this kind will be removed.", +); + +const UNINFERRED_HINT: &str = concat!( + "Hint: The import process encountered implicit information in the `hugr-model`", + "package that it can not yet fill in.", + "Such implicit information can be signatures for nodes and regions,", + "wildcard terms or symbol applications with fewer arguments than the symbol has parameters.", + "Until more comprehensive inference is implemented, `hugr-model` packages will need to be very explicit.", + "To avoid this error, make sure to include as much information as possible when generating packages." +); + +/// Error hint explaining the concept of a closed tuple. +const CLOSED_TUPLE_HINT: &str = concat!( + "Hint: A tuple is closed if all of its items are known.", + "Closed tuples can contain spliced subtuples, as long as they can be recursively flattened", + "into a tuple that only contains individual items." +); + +/// Error hint explaining the concept of a closed list. +const CLOSED_LIST_HINT: &str = concat!( + "Hint: A list is closed if all of its items are known.", + "Closed lists can contain spliced sublists, as long as they can be recursively flattened", + "into a list that only contains individual items." +); + #[derive(Debug, Clone, Error)] enum ImportErrorInner { /// The model contains a feature that is not supported by the importer yet. /// Errors of this kind are expected to be removed as the model format and /// the core HUGR representation converge. - #[error("currently unsupported: {0}")] + #[error("Unsupported: {0}\n{hint}", hint = UNSUPPORTED_HINT)] Unsupported(String), /// The model contains implicit information that has not yet been inferred. /// This includes wildcards and application of functions with implicit parameters. - #[error("uninferred implicit: {0}")] + #[error("Uninferred implicit: {0}\n{hint}", hint = UNINFERRED_HINT)] Uninferred(String), /// The model is not well-formed. @@ -419,7 +449,10 @@ impl<'a> Context<'a> { } _ => { return Err(error_unsupported!( - "link {:?} would require hyperedge", + concat!( + "Link {:?} would require a hyperedge because it connects more", + "than one input port with more than one output port." + ), link_id )); } @@ -432,6 +465,7 @@ impl<'a> Context<'a> { Ok(()) } + /// Connects static ports according to the connections in [`self.static_edges`]. fn link_static_ports(&mut self) -> Result<(), ImportErrorInner> { for (src_id, dst_id) in std::mem::take(&mut self.static_edges) { // None of these lookups should fail given how we constructed `static_edges`. @@ -497,7 +531,11 @@ impl<'a> Context<'a> { let result = match node_data.operation { table::Operation::Invalid => { - return Err(error_invalid!("tried to import an `invalid` operation")); + return Err(error_invalid!(concat!( + "Tried to import an `invalid` operation.\n", + "The `invalid` operation in `hugr-model` is a placeholder indicating a missing operation.", + "It currently has no equivalent in `hugr-core`." + ))); } table::Operation::Dfg => Some( @@ -761,6 +799,9 @@ impl<'a> Context<'a> { Ok(()) } + /// Imports a closed list whose first element is an ADT with a closed list + /// of variants. The variants and the remaining elements of the list are + /// returned as type rows. fn import_adt_and_rest( &mut self, list: table::TermId, @@ -812,7 +853,7 @@ impl<'a> Context<'a> { if sum_rows.len() != 2 { return Err(error_invalid!( - "loop nodes expect their first target to be an ADT with two variants" + "Loop nodes expect their first target to be an ADT with two variants." )); } @@ -883,6 +924,21 @@ impl<'a> Context<'a> { Ok(node) } + /// Imports a control flow region. + /// + /// The `hugr-model` and `hugr-core` representations of control flow are + /// slightly different, and so this method needs to perform some conversion. + /// + /// In `hugr-core` the first node in the region is a [`BasicBlock`] that by + /// virtue of its position is the designated entry block. The second node in + /// the region is an [`ExitBlock`]. The [`ExitBlock`] is analogous to an + /// [`Output`] node in a dataflow graph, while there is no direct control flow + /// equivalent to [`Input`] nodes. + /// + /// In `hugr-model` control flow regions have a single source and target port, + /// respectively, mirroring data flow regions. The region's source port needs + /// to be connected to either the input port of a block in the region or to the + /// target port. fn import_cfg_region( &mut self, region: table::RegionId, @@ -1055,6 +1111,18 @@ impl<'a> Context<'a> { }) } + /// Import a node with a custom operation. + /// + /// A custom operation in `hugr-model` referred to by a symbol application + /// term. The name of the symbol specifies the name of the custom operation, + /// and the arguments supplied to the symbol are the arguments to be passed + /// to the custom operation. This method imports the custom operations as + /// [`OpaqueOp`]s. The [`OpaqueOp`]s are then resolved later against the + /// [`ExtensionRegistry`]. + /// + /// Some operations that needed to be builtins in `hugr-core` are custom + /// operations in `hugr-model`. This method detects these and converts them + /// to the corresponding `hugr-core` builtins. fn import_node_custom( &mut self, node_id: table::NodeId, @@ -1072,11 +1140,38 @@ impl<'a> Context<'a> { } if let Some([_, _, func]) = self.match_symbol(operation, model::CORE_CALL)? { - let table::Term::Apply(symbol, args) = self.get_term(func)? else { - return Err(error_invalid!( - "expected a symbol application to be passed to `{}`", - model::CORE_CALL - )); + let (symbol, args) = match self.get_term(func)? { + table::Term::Apply(symbol, args) => (symbol, args), + table::Term::Var(_) => { + // TODO: Allow calling functions that are passed as variables. + // + // This would be necessary to allow functions which take + // other functions as static parameters and then call them. + return Err(error_unsupported!( + "`{}` does not yet support function variables.", + model::CORE_CALL + )); + } + table::Term::Func(_) => { + // TODO: Allow importing and calling anonoymous functions. + // + // This could be implemented in `hugr-core` by lifting the anonymous function + // into a function to be added into the containing module and then calling that + // function. + return Err(error_unsupported!( + "`{}` does not yet support anonymous functions.", + model::CORE_CALL + )); + } + _ => { + return Err(error_invalid!( + concat!( + "Expected a function to be passed to `{}`.\n", + "Currently this is restricted to symbols that refer to functions." + ), + model::CORE_CALL + )); + } }; let func_sig = self.get_func_signature(*symbol)?; @@ -1152,11 +1247,24 @@ impl<'a> Context<'a> { } if let Some([_, _, tag]) = self.match_symbol(operation, model::CORE_MAKE_ADT)? { - let table::Term::Literal(model::Literal::Nat(tag)) = self.get_term(tag)? else { - return Err(error_invalid!( - "`{}` expects a nat literal tag", - model::CORE_MAKE_ADT - )); + let tag = match self.get_term(tag)? { + table::Term::Literal(model::Literal::Nat(tag)) => tag, + table::Term::Var(_) => { + return Err(error_unsupported!( + concat!( + "`{}` does not yet support passing a variable as the tag.\n", + "The `hugr-core` builtin `Tag` operation expects a concrete value for the tag.", + "Therefore we must insist on a tag given as a natural number literal on import.", + ), + model::CORE_MAKE_ADT + )); + } + _ => { + return Err(error_invalid!( + "`{}` expects a nat literal tag", + model::CORE_MAKE_ADT + )); + } }; let signature = node_data @@ -1267,12 +1375,19 @@ impl<'a> Context<'a> { .ok_or_else(|| error_invalid!("unknown variable {}", var))? .bound = TypeBound::Copyable; } else { - return Err(error_unsupported!("constraint other than copy or discard")); + return Err(error_unsupported!( + concat!( + "Constraints other than `{}` can not yet be imported.\n", + "`hugr-core` does not have support for arbitrary constraints yet,", + "instead relying on operation-specific Rust code to compute and", + "validate signatures of custom operations." + ), + model::CORE_NON_LINEAR + )); } } for (index, param) in symbol.params.iter().enumerate() { - // NOTE: `PolyFuncType` only has explicit type parameters at present. let bound = self.local_vars[&table::VarId(node, index as _)].bound; imported_params.push( self.import_term_with_bound(param.r#type, bound) @@ -1489,9 +1604,9 @@ impl<'a> Context<'a> { // The following terms are not runtime types, but the core `Type` only contains runtime types. // We therefore report a type error here. - table::Term::List { .. } + table::Term::Literal(_) + | table::Term::List { .. } | table::Term::Tuple { .. } - | table::Term::Literal(_) | table::Term::Func { .. } => Err(error_invalid!("expected a runtime type")), } })() @@ -1514,6 +1629,14 @@ impl<'a> Context<'a> { .ok_or(error_invalid!("expected a control type")) } + /// Import a [`Signature`] or [`FuncValueType`]. + /// + /// When importing a [`Signature`] the lists of input and output types need + /// to be closed. In constrast [`FuncValueType`] admits importing open lists + /// of input and output types via "row variables". + /// + /// Function types are not special-cased in `hugr-model` but are represented + /// via the `core.fn` term constructor. fn import_func_type( &mut self, term_id: table::TermId, @@ -1531,6 +1654,17 @@ impl<'a> Context<'a> { .map_err(|err| error_context!(err, "function type")) } + /// Import a closed list as a vector of term ids. + /// + /// This method supports list terms that contain spliced sublists as long as + /// the list can be recursively flattened to only contain individual items. + /// + /// To allow for IR constructions that are parameterised by static + /// parameters, open lists with spliced variables should be supported where + /// possible. Closed lists might be required in some places of the IR that + /// are not supposed to be parameterised with variables or where such + /// parameterisation is not yet supported by the `hugr-core` structures that + /// we are importing into. fn import_closed_list( &mut self, term_id: table::TermId, @@ -1555,7 +1689,12 @@ impl<'a> Context<'a> { } } } - _ => return Err(error_invalid!("expected a closed list")), + _ => { + return Err(error_invalid!( + "Expected a closed list.\n{}", + CLOSED_LIST_HINT + )); + } } Ok(()) @@ -1566,6 +1705,9 @@ impl<'a> Context<'a> { Ok(types) } + /// Import a closed tuple as a vector of term ids. + /// + /// This is the tuple version of [`Self::import_closed_list`]. fn import_closed_tuple( &mut self, term_id: table::TermId, @@ -1590,7 +1732,12 @@ impl<'a> Context<'a> { } } } - _ => return Err(error_invalid!("expected a closed tuple")), + _ => { + return Err(error_invalid!( + "Expected a closed tuple term.\n{}", + CLOSED_TUPLE_HINT + )); + } } Ok(()) @@ -1601,6 +1748,9 @@ impl<'a> Context<'a> { Ok(types) } + /// Imports a list of lists as a vector of type rows. + /// + /// See [`Self::import_type_row`]. fn import_type_rows( &mut self, term_id: table::TermId, @@ -1611,6 +1761,11 @@ impl<'a> Context<'a> { .collect() } + /// Imports a list as a type row. + /// + /// This method works to produce a [`TypeRow`] or a [`TypeRowRV`], depending + /// on the `RV` type argument. For [`TypeRow`] a closed list is expected. + /// For [`TypeRowRV`] we import spliced variables as row variables. fn import_type_row( &mut self, term_id: table::TermId, @@ -1637,7 +1792,9 @@ impl<'a> Context<'a> { } table::Term::Var(table::VarId(_, index)) => { let var = RV::try_from_rv(RowVariable(*index as _, TypeBound::Linear)) - .map_err(|_| error_invalid!("expected a closed list"))?; + .map_err(|_| { + error_invalid!("Expected a closed list.\n{}", CLOSED_LIST_HINT) + })?; types.push(TypeBase::new(TypeEnum::RowVar(var))); } _ => return Err(error_invalid!("expected a list")), @@ -1672,6 +1829,11 @@ impl<'a> Context<'a> { } } + /// Import a constant term as a [`Value`]. + /// + /// This method supports the JSON compatibility constants and a small selection of built in + /// constant constructors. It is a compatibility shim until constants can be represented as + /// terms in `hugr-core` at which point this method will become redundant. fn import_value( &mut self, term_id: table::TermId, @@ -1809,13 +1971,23 @@ impl<'a> Context<'a> { match term_data { table::Term::Wildcard => Err(error_uninferred!("wildcard")), - table::Term::Var(_) => Err(error_unsupported!("constant value containing a variable")), + table::Term::Var(_) => Err(error_unsupported!(concat!( + "Constant value containing a variable.\n", + "The constant system in `hugr-core` is not set up yet to support", + "constants that depend on variables.", + ))), table::Term::Apply(symbol, _) => { let symbol_name = self.get_symbol_name(*symbol)?; Err(error_unsupported!( - "unknown custom constant value `{}`", - symbol_name + concat!( + "Unknown custom constant constructor `{}`.\n", + "Importing constants from `hugr-model` to `hugr-core` currently only supports a small", + "and hard-coded list of constant constructors. To support JSON encoded constants", + "use the constant constructor `{}`." + ), + symbol_name, + model::COMPAT_CONST_JSON )) // TODO: This should ultimately include the following cases: // - function definitions @@ -1826,10 +1998,27 @@ impl<'a> Context<'a> { Err(error_invalid!("expected constant")) } - table::Term::Func { .. } => Err(error_unsupported!("constant function value")), + table::Term::Func { .. } => Err(error_unsupported!("Constant function value.")), } } + /// Check if a term is an application of a symbol with the given name. If + /// so, return the arguments of the application. + /// + /// We allow the match even if the symbol is applied to fewer arguments than + /// expected. In that case, the arguments are considered implicit and the + /// return array is padded with wildcard terms at the beginning. The match + /// fails if the symbol is applied to more arguments than expected. + /// + /// # Errors + /// + /// An error is returned in the following cases: + /// + /// - The term id does not exist in the module to be imported. + /// - The term is a symbol application but the node id in the application does not refer to a symbol. + /// + /// Failed matches return `Ok(None)` instead of an error so that this method can be used + /// in sequence to probe for applications of different symbol constructors. fn match_symbol( &self, term_id: table::TermId, @@ -1847,9 +2036,6 @@ impl<'a> Context<'a> { return Ok(None); } - // We allow the match even if the symbol is applied to fewer arguments - // than parameters. In that case, the arguments are padded with wildcards - // at the beginning. if args.len() > N { return Ok(None); } @@ -1864,19 +2050,35 @@ impl<'a> Context<'a> { Ok(Some(result)) } + /// Expects a term to be an application of a symbol with the given name and + /// returns the arguments of the application. + /// + /// See [`Self::match_symbol`]. + /// + /// # Errors + /// + /// In addition to the error cases described in [`Self::match_symbol`], this + /// method also returns an error when the match failed. fn expect_symbol( &self, term_id: table::TermId, name: &str, ) -> Result<[table::TermId; N], ImportErrorInner> { self.match_symbol(term_id, name)?.ok_or(error_invalid!( - "expected symbol `{}` with arity {}", + "Expected symbol `{}` with arity {}.", name, N )) } /// Searches for `core.title` metadata on the given node. + /// + /// The `core.title` metadata is used as the `hugr-core` name for private function symbols. + /// This is necessary as a compatibility shim to bridge between the different concepts of name + /// in `hugr-core` and `hugr-model`: In `hugr-model` the name of a symbol uniquely identifies + /// that symbol within a module, while in `hugr-core` the name started out as procedurally + /// irrelevant debug metadata. With linking, the `hugr-core` name has become significant, + /// but only for public functions. fn import_title_metadata( &self, node_id: table::NodeId, From 4019a13f600b415cc154ab669da6fb8a6da763f3 Mon Sep 17 00:00:00 2001 From: Lukas Heidemann Date: Wed, 3 Sep 2025 13:26:06 +0100 Subject: [PATCH 3/5] Spaces in concatenated error messages. --- hugr-core/src/import.rs | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/hugr-core/src/import.rs b/hugr-core/src/import.rs index f1d65ece5f..67440dd753 100644 --- a/hugr-core/src/import.rs +++ b/hugr-core/src/import.rs @@ -53,32 +53,32 @@ pub struct ImportError { } const UNSUPPORTED_HINT: &str = concat!( - "Hint: The import process encountered a `hugr-model` feature", - "that is currently unsupported in `hugr-core`.", - "As `hugr-core` evolves towards the same expressivity as `hugr-model`", + "Hint: The import process encountered a `hugr-model` feature ", + "that is currently unsupported in `hugr-core`. ", + "As `hugr-core` evolves towards the same expressivity as `hugr-model` ", "we expect that errors of this kind will be removed.", ); const UNINFERRED_HINT: &str = concat!( - "Hint: The import process encountered implicit information in the `hugr-model`", - "package that it can not yet fill in.", - "Such implicit information can be signatures for nodes and regions,", - "wildcard terms or symbol applications with fewer arguments than the symbol has parameters.", - "Until more comprehensive inference is implemented, `hugr-model` packages will need to be very explicit.", + "Hint: The import process encountered implicit information in the `hugr-model` ", + "package that it can not yet fill in. ", + "Such implicit information can be signatures for nodes and regions, ", + "wildcard terms or symbol applications with fewer arguments than the symbol has parameters. ", + "Until more comprehensive inference is implemented, `hugr-model` packages will need to be very explicit. ", "To avoid this error, make sure to include as much information as possible when generating packages." ); /// Error hint explaining the concept of a closed tuple. const CLOSED_TUPLE_HINT: &str = concat!( - "Hint: A tuple is closed if all of its items are known.", - "Closed tuples can contain spliced subtuples, as long as they can be recursively flattened", + "Hint: A tuple is closed if all of its items are known. ", + "Closed tuples can contain spliced subtuples, as long as they can be recursively flattened ", "into a tuple that only contains individual items." ); /// Error hint explaining the concept of a closed list. const CLOSED_LIST_HINT: &str = concat!( - "Hint: A list is closed if all of its items are known.", - "Closed lists can contain spliced sublists, as long as they can be recursively flattened", + "Hint: A list is closed if all of its items are known. ", + "Closed lists can contain spliced sublists, as long as they can be recursively flattened ", "into a list that only contains individual items." ); @@ -450,7 +450,7 @@ impl<'a> Context<'a> { _ => { return Err(error_unsupported!( concat!( - "Link {:?} would require a hyperedge because it connects more", + "Link {:?} would require a hyperedge because it connects more ", "than one input port with more than one output port." ), link_id @@ -533,7 +533,7 @@ impl<'a> Context<'a> { table::Operation::Invalid => { return Err(error_invalid!(concat!( "Tried to import an `invalid` operation.\n", - "The `invalid` operation in `hugr-model` is a placeholder indicating a missing operation.", + "The `invalid` operation in `hugr-model` is a placeholder indicating a missing operation. ", "It currently has no equivalent in `hugr-core`." ))); } @@ -1253,7 +1253,7 @@ impl<'a> Context<'a> { return Err(error_unsupported!( concat!( "`{}` does not yet support passing a variable as the tag.\n", - "The `hugr-core` builtin `Tag` operation expects a concrete value for the tag.", + "The `hugr-core` builtin `Tag` operation expects a concrete value for the tag. ", "Therefore we must insist on a tag given as a natural number literal on import.", ), model::CORE_MAKE_ADT @@ -1378,8 +1378,8 @@ impl<'a> Context<'a> { return Err(error_unsupported!( concat!( "Constraints other than `{}` can not yet be imported.\n", - "`hugr-core` does not have support for arbitrary constraints yet,", - "instead relying on operation-specific Rust code to compute and", + "`hugr-core` does not have support for arbitrary constraints yet, ", + "instead relying on operation-specific Rust code to compute and ", "validate signatures of custom operations." ), model::CORE_NON_LINEAR @@ -1973,7 +1973,7 @@ impl<'a> Context<'a> { table::Term::Wildcard => Err(error_uninferred!("wildcard")), table::Term::Var(_) => Err(error_unsupported!(concat!( "Constant value containing a variable.\n", - "The constant system in `hugr-core` is not set up yet to support", + "The constant system in `hugr-core` is not set up yet to support ", "constants that depend on variables.", ))), @@ -1982,8 +1982,8 @@ impl<'a> Context<'a> { Err(error_unsupported!( concat!( "Unknown custom constant constructor `{}`.\n", - "Importing constants from `hugr-model` to `hugr-core` currently only supports a small", - "and hard-coded list of constant constructors. To support JSON encoded constants", + "Importing constants from `hugr-model` to `hugr-core` currently only supports a small ", + "and hard-coded list of constant constructors. To support JSON encoded constants ", "use the constant constructor `{}`." ), symbol_name, From 2bde82d17a12466a0fdbed5e97f6eb4320696935 Mon Sep 17 00:00:00 2001 From: Lukas Heidemann Date: Fri, 5 Sep 2025 12:34:23 +0100 Subject: [PATCH 4/5] Remove accidentally committed tree-sitter files. --- tree-sitter-hugr/Cargo.lock | 199 ------------------------- tree-sitter-hugr/hugr.dylib | Bin 149464 -> 0 bytes tree-sitter-hugr/tree-sitter-hugr.wasm | Bin 67038 -> 0 bytes 3 files changed, 199 deletions(-) delete mode 100644 tree-sitter-hugr/Cargo.lock delete mode 100755 tree-sitter-hugr/hugr.dylib delete mode 100755 tree-sitter-hugr/tree-sitter-hugr.wasm diff --git a/tree-sitter-hugr/Cargo.lock b/tree-sitter-hugr/Cargo.lock deleted file mode 100644 index 652ad56bec..0000000000 --- a/tree-sitter-hugr/Cargo.lock +++ /dev/null @@ -1,199 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "cc" -version = "1.2.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" -dependencies = [ - "shlex", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "hashbrown" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" - -[[package]] -name = "indexmap" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "memchr" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" -dependencies = [ - "indexmap", - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" - -[[package]] -name = "syn" -version = "2.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tree-sitter" -version = "0.25.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7b8994f367f16e6fa14b5aebbcb350de5d7cbea82dc5b00ae997dd71680dd2" -dependencies = [ - "cc", - "regex", - "regex-syntax", - "serde_json", - "streaming-iterator", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-hugr" -version = "0.1.0" -dependencies = [ - "cc", - "tree-sitter", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-language" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4013970217383f67b18aef68f6fb2e8d409bc5755227092d32efb0422ba24b8" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" diff --git a/tree-sitter-hugr/hugr.dylib b/tree-sitter-hugr/hugr.dylib deleted file mode 100755 index 6434e0521190adf0fd41e254f43d7d234e9c2049..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149464 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 diff --git a/tree-sitter-hugr/tree-sitter-hugr.wasm b/tree-sitter-hugr/tree-sitter-hugr.wasm deleted file mode 100755 index dc157b0239fc8d377b649faa16cc239f3fc1a394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67038 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 a$$9zq;91sz1C@YHKwUuAy)>``{{Ig?^1PS; From 8485482f4c4bfca494de8dc242952e67b028d2c3 Mon Sep 17 00:00:00 2001 From: Lukas Heidemann Date: Fri, 5 Sep 2025 12:48:02 +0100 Subject: [PATCH 5/5] More comments on constants. --- hugr-core/src/import.rs | 5 +++-- hugr-model/src/v0/mod.rs | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/hugr-core/src/import.rs b/hugr-core/src/import.rs index 67440dd753..46d195035c 100644 --- a/hugr-core/src/import.rs +++ b/hugr-core/src/import.rs @@ -1147,17 +1147,18 @@ impl<'a> Context<'a> { // // This would be necessary to allow functions which take // other functions as static parameters and then call them. + // See #2301. return Err(error_unsupported!( "`{}` does not yet support function variables.", model::CORE_CALL )); } table::Term::Func(_) => { - // TODO: Allow importing and calling anonoymous functions. + // TODO: Allow importing and calling anonymous functions. // // This could be implemented in `hugr-core` by lifting the anonymous function // into a function to be added into the containing module and then calling that - // function. + // function. See #2559. return Err(error_unsupported!( "`{}` does not yet support anonymous functions.", model::CORE_CALL diff --git a/hugr-model/src/v0/mod.rs b/hugr-model/src/v0/mod.rs index d832168b64..40a637e413 100644 --- a/hugr-model/src/v0/mod.rs +++ b/hugr-model/src/v0/mod.rs @@ -51,7 +51,7 @@ //! - Some terms can not yet be represented in `hugr-core` although they should be. //! Importing such terms will result in an error that declares these terms as currently //! unsupported. -//! - In particular `hugr-core` currently only allows to define custom runtime types but +//! - In particular `hugr-core` (as of `v0.22.3`) only allows to define custom runtime types but //! can not represent custom term constructors for static types. Implementing support for //! static `Term`s in `hugr-core` will allow to use the term system for extensible metadata //! and constants. Once that is implemented, the hugr IR will have a unified extension mechanism. @@ -64,6 +64,19 @@ //! compatibility mechanism via the `compat.const_json` constant constructor but also allows //! to declare custom constant constructors. Import/export has hard-coded support for a small //! fixed set of these for now. +//! - In `hugr-core` a constant is a `Value`, included in the hugr graph via a `Const` node. +//! A `LoadConst` node connects to the `Const` node via a static edge. `Value`s are separate +//! from `Term`s in `hugr-core` and can not refer to local variables or to function nodes. +//! In `hugr-model` the `Const` node is not needed: The `core.load_const` operation takes +//! the constant's description as a term argument. This enables `hugr-model` constants to +//! depend on local variables and to refer to functions in the module (removing the need +//! for a separate `LoadFunc` operation). +//! - `Value`s in `hugr-core` have a single representation for every constant. The encoding +//! of constants as terms in `hugr-model` can use different constructors for the same type +//! of constant value. This can be useful for large constants by enabling efficient encodings. +//! For example, a constant array of integers could have a constructor taking a byte string +//! that consists of the integer values, which is significantly more economical than a generic +//! representation of arrays that has a term for every element. //! - The model does not have types with a copy bound as `hugr-core` does, and instead uses //! a more general form of type constraints ([#1556]). Similarly, the model does not have //! bounded naturals. We perform a conversion for compatibility where possible, but this does @@ -79,8 +92,10 @@ //! - `hugr-core` only allows to define type aliases, but not aliases for other terms. The //! alias system is under-developed in both `hugr-core` and `hugr-model` and will need some //! considerable design and implementation work (or to be removed if deemed unnecessary). +//! See [#2558]. //! //! [#1556]: https://github.com/CQCL/hugr/discussions/1556 +//! [#2558]: https://github.com/CQCL/hugr/issues/2558 //! [Text]: crate::v0::ast //! [Binary]: crate::v0::binary //! [Table]: crate::v0::table