Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/v1/02_parse.dag
Original file line number Diff line number Diff line change
Expand Up @@ -1224,6 +1224,13 @@ fn stamp_parsed_node_children(
head_role: ParsedOccurrenceReference { category: CallableOccurrence },
tail_role: ParsedOccurrenceUnclassified
)
ExprLet =>
stamp_parsed_node_list(
nodes: node.children,
ancestors: ancestors,
ctx: ctx,
role: ParsedOccurrenceUnclassified
)
ExprLambda =>
stamp_parsed_node_list_with_head_role(
nodes: node.children,
Expand Down
51 changes: 35 additions & 16 deletions src/v1/compiler_tests_rust.dag
Original file line number Diff line number Diff line change
Expand Up @@ -332,34 +332,53 @@ fn ct_pipeline_test() -> String {
" let result = std::thread::Builder::new()\n",
" .stack_size(16 * 1024 * 1024)\n",
" .spawn(|| {\n",
" let source = std::rc::Rc::new(crate::v1_compiler_compile::SourceFile {\n",
" path: \"occurrence_sidecar_serde.dag\".to_string(),\n",
" content: \"module occurrence.sidecar_serde\\nfn left(x: Int) -> Int { x }\\nfn right(x: Int) -> Int { left(x) }\\n\".to_string(),\n",
" let left_source = std::rc::Rc::new(crate::v1_compiler_compile::SourceFile {\n",
" path: \"occurrence_sidecar_left.dag\".to_string(),\n",
" content: \"module occurrence.sidecar_left\\nfn shared(x: Int) -> Int { x }\\n\".to_string(),\n",
" });\n",
" let right_source = std::rc::Rc::new(crate::v1_compiler_compile::SourceFile {\n",
" path: \"occurrence_sidecar_right.dag\".to_string(),\n",
" content: \"module occurrence.sidecar_right\\nfn shared(x: Int) -> Int { x }\\n\".to_string(),\n",
" });\n",
" let resolved = crate::v1_compiler_compile::compile_to_resolved(\n",
" std::rc::Rc::new(im::vector![source]),\n",
" std::rc::Rc::new(im::vector![left_source, right_source]),\n",
" );\n",
" let graph = resolved\n",
" .graph\n",
" .as_ref()\n",
" .expect(\"production compile must preserve a resolved graph\");\n",
" let typed_module = graph\n",
" .modules\n",
" .get(0)\n",
" .expect(\"production compile must preserve its typed module\");\n",
" let transport = typed_module\n",
" .occurrence_transport\n",
" .as_ref()\n",
" .expect(\"typed module must preserve occurrence transport\");\n",
" assert!(!transport.index.entries.is_empty());\n",
" assert!(!transport.declarations.is_empty());\n",
" assert!(!transport.references.is_empty());\n\n",
" assert_eq!(graph.modules.len(), 2);\n",
" let mut occurrence_ids = std::collections::HashSet::new();\n",
" for typed_module in graph.modules.iter() {\n",
" let transport = typed_module\n",
" .occurrence_transport\n",
" .as_ref()\n",
" .expect(\"typed module must preserve occurrence transport\");\n",
" assert!(!transport.index.entries.is_empty());\n",
" assert!(!transport.declarations.is_empty());\n",
" assert!(!transport.references.is_empty());\n",
" for entry in transport.index.entries.iter() {\n",
" assert!(\n",
" occurrence_ids.insert(entry.projection.occurrence.value),\n",
" \"graph-scoped occurrence ids must remain disjoint across modules\"\n",
" );\n",
" }\n",
" let module_bytes = serde_json::to_vec(typed_module)\n",
" .expect(\"serialize typed module occurrence sidecar\");\n",
" let decoded_module: std::rc::Rc<crate::v1_compiler_infer_items::TypedModule> =\n",
" serde_json::from_slice(&module_bytes)\n",
" .expect(\"deserialize typed module occurrence sidecar\");\n",
" assert_eq!(&decoded_module, typed_module);\n",
" }\n\n",
" let graph_bytes = serde_json::to_vec(graph)\n",
" .expect(\"serialize resolved graph occurrence sidecar\");\n",
" let decoded_graph: std::rc::Rc<crate::v1_compiler_infer_items::ResolvedGraph> =\n",
" serde_json::from_slice(&graph_bytes)\n",
" .expect(\"deserialize resolved graph occurrence sidecar\");\n",
" assert_eq!(&decoded_graph, graph);\n\n",
" assert_eq!(&decoded_graph, graph);\n",
" for (before, after) in graph.modules.iter().zip(decoded_graph.modules.iter()) {\n",
" assert_eq!(after.occurrence_transport, before.occurrence_transport);\n",
" }\n\n",
" let resolved_bytes = serde_json::to_vec(&resolved)\n",
" .expect(\"serialize resolved pipeline occurrence sidecar\");\n",
" let decoded: std::rc::Rc<crate::v1_compiler_compile::ResolvedPipelineResult> =\n",
Expand Down
61 changes: 42 additions & 19 deletions src/v1/stage0/src/compiler_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -323,35 +323,58 @@ mod compiler_tests {
let result = std::thread::Builder::new()
.stack_size(16 * 1024 * 1024)
.spawn(|| {
let source = std::rc::Rc::new(crate::v1_compiler_compile::SourceFile {
path: "occurrence_sidecar_serde.dag".to_string(),
content: "module occurrence.sidecar_serde\nfn left(x: Int) -> Int { x }\nfn right(x: Int) -> Int { left(x) }\n".to_string(),
let left_source = std::rc::Rc::new(crate::v1_compiler_compile::SourceFile {
path: "occurrence_sidecar_left.dag".to_string(),
content: "module occurrence.sidecar_left\nfn shared(x: Int) -> Int { x }\n"
.to_string(),
});
let resolved = crate::v1_compiler_compile::compile_to_resolved(
std::rc::Rc::new(im::vector![source]),
);
let right_source = std::rc::Rc::new(crate::v1_compiler_compile::SourceFile {
path: "occurrence_sidecar_right.dag".to_string(),
content: "module occurrence.sidecar_right\nfn shared(x: Int) -> Int { x }\n"
.to_string(),
});
let resolved =
crate::v1_compiler_compile::compile_to_resolved(std::rc::Rc::new(im::vector![
left_source,
right_source
]));
let graph = resolved
.graph
.as_ref()
.expect("production compile must preserve a resolved graph");
let typed_module = graph
.modules
.get(0)
.expect("production compile must preserve its typed module");
let transport = typed_module
.occurrence_transport
.as_ref()
.expect("typed module must preserve occurrence transport");
assert!(!transport.index.entries.is_empty());
assert!(!transport.declarations.is_empty());
assert!(!transport.references.is_empty());
assert_eq!(graph.modules.len(), 2);
let mut occurrence_ids = std::collections::HashSet::new();
for typed_module in graph.modules.iter() {
let transport = typed_module
.occurrence_transport
.as_ref()
.expect("typed module must preserve occurrence transport");
assert!(!transport.index.entries.is_empty());
assert!(!transport.declarations.is_empty());
assert!(!transport.references.is_empty());
for entry in transport.index.entries.iter() {
assert!(
occurrence_ids.insert(entry.projection.occurrence.value),
"graph-scoped occurrence ids must remain disjoint across modules"
);
}
let module_bytes = serde_json::to_vec(typed_module)
.expect("serialize typed module occurrence sidecar");
let decoded_module: std::rc::Rc<crate::v1_compiler_infer_items::TypedModule> =
serde_json::from_slice(&module_bytes)
.expect("deserialize typed module occurrence sidecar");
assert_eq!(&decoded_module, typed_module);
}

let graph_bytes = serde_json::to_vec(graph)
.expect("serialize resolved graph occurrence sidecar");
let graph_bytes =
serde_json::to_vec(graph).expect("serialize resolved graph occurrence sidecar");
let decoded_graph: std::rc::Rc<crate::v1_compiler_infer_items::ResolvedGraph> =
serde_json::from_slice(&graph_bytes)
.expect("deserialize resolved graph occurrence sidecar");
assert_eq!(&decoded_graph, graph);
for (before, after) in graph.modules.iter().zip(decoded_graph.modules.iter()) {
assert_eq!(after.occurrence_transport, before.occurrence_transport);
}

let resolved_bytes = serde_json::to_vec(&resolved)
.expect("serialize resolved pipeline occurrence sidecar");
Expand Down
Loading
Loading