Skip to content

Commit

Permalink
embed binding rules into the output crate (NomicFoundation#1010)
Browse files Browse the repository at this point in the history
  • Loading branch information
OmarTawfik authored Jun 13, 2024
1 parent 21c0bcf commit 3845dc7
Show file tree
Hide file tree
Showing 57 changed files with 178 additions and 96 deletions.
2 changes: 2 additions & 0 deletions crates/codegen/language/definition/src/model/manifest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ pub struct Language {
pub name: Identifier,

pub documentation_dir: PathBuf,
pub binding_rules_file: PathBuf,

pub root_item: Identifier,

pub leading_trivia: TriviaParser,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: An expression with the name 'Expression1' already exists.
--> src/fail/definitions/duplicate_expression_name/test.rs:33:36
--> src/fail/definitions/duplicate_expression_name/test.rs:34:36
|
33 | ... name = Expression1,
34 | ... name = Expression1,
| ^^^^^^^^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar1,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: An item with the name 'Bar1' already exists.
--> src/fail/definitions/duplicate_item_name/test.rs:16:31
--> src/fail/definitions/duplicate_item_name/test.rs:17:31
|
16 | Struct(name = Bar1, fields = (field = Required(Bar2))),
17 | Struct(name = Bar1, fields = (field = Required(Bar2))),
| ^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: A variant referencing 'Baz1' already exists.
--> src/fail/definitions/duplicate_variant_name/test.rs:20:49
--> src/fail/definitions/duplicate_variant_name/test.rs:21:49
|
20 | EnumVariant(reference = Baz1)
21 | EnumVariant(reference = Baz1)
| ^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: All operators under the same expression must have the same model and type.
--> src/fail/definitions/operator_mismatch/test.rs:18:32
--> src/fail/definitions/operator_mismatch/test.rs:19:32
|
18 | name = Foo,
19 | name = Foo,
| ^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Duplicate map key.
--> src/fail/parsing/duplicate_map_key/test.rs:19:25
--> src/fail/parsing/duplicate_map_key/test.rs:20:25
|
19 | field_1 = Required(Baz),
20 | field_1 = Required(Baz),
| ^^^^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Set entries must be unique.
--> src/fail/parsing/duplicate_set_entry/test.rs:9:26
|
9 | versions = ["1.0.0", "1.0.0", "3.0.0"],
| ^^^^^^^
--> src/fail/parsing/duplicate_set_entry/test.rs:10:26
|
10 | versions = ["1.0.0", "1.0.0", "3.0.0"],
| ^^^^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Expected a non-empty string.
--> src/fail/parsing/empty_string/test.rs:16:63
--> src/fail/parsing/empty_string/test.rs:17:63
|
16 | definitions = [TokenDefinition(scanner = Atom(""))]
17 | definitions = [TokenDefinition(scanner = Atom(""))]
| ^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Expected field: 'title'.
--> src/fail/parsing/missing_field/test.rs:12:9
--> src/fail/parsing/missing_field/test.rs:13:9
|
12 | topics = []
13 | topics = []
| ^^^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: unexpected token
--> src/fail/parsing/unrecognized_field/test.rs:18:13
--> src/fail/parsing/unrecognized_field/test.rs:19:13
|
18 | unrecognized_field = true
19 | unrecognized_field = true
| ^^^^^^^^^^^^^^^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar1,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Expected a variant: 'Struct' or 'Enum' or 'Repeated' or 'Separated' or 'Precedence' or 'Trivia' or 'Keyword' or 'Token' or 'Fragment'
--> src/fail/parsing/unrecognized_variant/test.rs:20:49
--> src/fail/parsing/unrecognized_variant/test.rs:21:49
|
20 | Topic(title = "Topic Two", items = [Unrecognized(true)])
21 | Topic(title = "Topic Two", items = [Unrecognized(true)])
| ^^^^^^^^^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar1,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
error: Item 'Baz1' is not reachable from grammar root.
--> src/fail/reachability/unreachable/test.rs:19:31
--> src/fail/reachability/unreachable/test.rs:20:31
|
19 | Struct(name = Baz1, fields = (field = Required(Baz2))),
20 | Struct(name = Baz1, fields = (field = Required(Baz2))),
| ^^^^

error: Item 'Baz2' is not reachable from grammar root.
--> src/fail/reachability/unreachable/test.rs:20:31
--> src/fail/reachability/unreachable/test.rs:21:31
|
20 | Struct(name = Baz2, fields = (field = Required(Baz1)))
21 | Struct(name = Baz2, fields = (field = Required(Baz1)))
| ^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Item 'Baz' is not used in versions: 1.0.0..2.0.0
--> src/fail/reachability/unused_version/test.rs:20:28
--> src/fail/reachability/unused_version/test.rs:21:28
|
20 | name = Baz,
21 | name = Baz,
| ^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = One,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Parent scope is only enabled in '2.0.0..3.0.0'.
--> src/fail/references/disabled_too_late/test.rs:28:79
--> src/fail/references/disabled_too_late/test.rs:29:79
|
28 | fields = (field_1 = Optional(reference = Three, enabled = Till("4.0.0")))
29 | fields = (field_1 = Optional(reference = Three, enabled = Till("4.0.0")))
| ^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = One,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Parent scope is only enabled in '2.0.0..3.0.0'.
--> src/fail/references/enabled_too_early/test.rs:28:79
--> src/fail/references/enabled_too_early/test.rs:29:79
|
28 | fields = (field_1 = Optional(reference = Three, enabled = From("1.0.0")))
29 | fields = (field_1 = Optional(reference = Three, enabled = From("1.0.0")))
| ^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Reference 'Baz' of kind 'Fragment' is not valid. Expected: [Struct, Enum, Repeated, Separated, Precedence, Keyword, Token]
--> src/fail/references/invalid_filter/test.rs:15:63
--> src/fail/references/invalid_filter/test.rs:16:63
|
15 | Struct(name = Bar, fields = (field = Required(Baz))),
16 | Struct(name = Bar, fields = (field = Required(Baz))),
| ^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
error: Reference 'Baz' is only defined in '2.0.0..3.0.0', but not in '3.0.0..MAX'.
--> src/fail/references/invalid_version/test.rs:20:41
--> src/fail/references/invalid_version/test.rs:21:41
|
20 | ... reference = Baz,
21 | ... reference = Baz,
| ^^^

error: Reference 'Baz' is only defined in '2.0.0..3.0.0', but not in '1.0.0..2.0.0'.
--> src/fail/references/invalid_version/test.rs:25:41
--> src/fail/references/invalid_version/test.rs:26:41
|
25 | ... reference = Baz,
26 | ... reference = Baz,
| ^^^

error: Reference 'Baz' is only defined in '2.0.0..3.0.0', but not in '1.0.0..2.0.0 | 3.0.0..MAX'.
--> src/fail/references/invalid_version/test.rs:30:41
--> src/fail/references/invalid_version/test.rs:31:41
|
30 | ... reference = Baz
31 | ... reference = Baz
| ^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = Bar,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Reference to unknown item 'Unknown'.
--> src/fail/references/unknown_reference/test.rs:17:75
--> src/fail/references/unknown_reference/test.rs:18:75
|
17 | fields = (field_1 = Required(Baz), field_2 = Required(Unknown))
18 | fields = (field_1 = Required(Baz), field_2 = Required(Unknown))
| ^^^^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = One,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Version '3.0.0' must be less than corresponding version '2.0.0'.
--> src/fail/references/unordered_version_pair/test.rs:20:52
--> src/fail/references/unordered_version_pair/test.rs:21:52
|
20 | ... enabled = Range(from = "3.0.0", till = "2.0.0")
21 | ... enabled = Range(from = "3.0.0", till = "2.0.0")
| ^^^^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
codegen_language_macros::compile!(Language(
name = Foo,
documentation_dir = "foo/bar",
binding_rules_file = "bindings/rules.msgb",
root_item = One,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: Version '3.0.0' does not exist in the language definition.
--> src/fail/references/version_not_found/test.rs:18:76
--> src/fail/references/version_not_found/test.rs:19:76
|
18 | field_1 = Optional(reference = Two, enabled = From("3.0.0")),
19 | field_1 = Optional(reference = Two, enabled = From("3.0.0")),
| ^^^^^^^
2 changes: 2 additions & 0 deletions crates/codegen/language/tests/src/pass/tiny_language.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use semver::Version;
codegen_language_macros::compile!(Language(
name = Tiny,
documentation_dir = "tiny/docs",
binding_rules_file = "tiny/bindings/rules.msgb",
root_item = Foo,
leading_trivia = Sequence([]),
trailing_trivia = Sequence([]),
Expand Down Expand Up @@ -47,6 +48,7 @@ fn definition() {
Language {
name: "Tiny".into(),
documentation_dir: Path::repo_path("tiny/docs"),
binding_rules_file: Path::repo_path("tiny/bindings/rules.msgb"),
root_item: "Foo".into(),
leading_trivia: TriviaParser::Sequence { parsers: [].into() },
trailing_trivia: TriviaParser::Sequence { parsers: [].into() },
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#[allow(clippy::needless_raw_string_hashes)]
#[allow(dead_code)] // TODO(#982): use to create the graph
pub const BINDING_RULES_SOURCE: &str = r#####"
{{ model.bindings.binding_rules_source }}
"#####;

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions crates/codegen/runtime/cargo/src/runtime/bindings/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#[path = "generated/binding_rules.rs"]
mod binding_rules;

use metaslang_graph_builder::ast;
pub use metaslang_graph_builder::functions::Functions;
pub use metaslang_graph_builder::{ExecutionConfig, ExecutionError, NoCancellation, Variables};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ pub struct Separated {
}

impl AstModel {
pub fn create(language: &model::Language) -> Self {
pub fn from_language(language: &model::Language) -> Self {
let mut model = Self::default();

// First pass: collect all terminals:
Expand Down
Loading

0 comments on commit 3845dc7

Please sign in to comment.