-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Initial generation of IR from nu AST. #40
base: main
Are you sure you want to change the base?
Conversation
This is the same as #30 (sorry for the duplicate PR), with initial comments applied. See math snapshots tests, as those are the ones that don't get any errors. I am playing with integrating it with the actual nushell in https://github.com/doriath/nushell/tree/new-parser (it is not submittable and is extremely hacky, but allows me to test if a simple IR actually can be executed) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
looks like a great start 😄
The initial implementation only handles simple math expressions, the focus is primarily on introducing new structs, agreeing on naming and adding the output to insta tests.
r | ||
} | ||
|
||
fn span_to_string(&mut self, node_id: NodeId) -> Option<String> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can this use std::str::from_utf8() instead and return &str
to avoid the String allocation?
Also, I'd move these two span_to_xxx()
functions to the Compiler, and perhaps rename then to node_as_string/i64()
, or similar.
let mut spans = vec![]; | ||
let mut ast = vec![]; | ||
for _ in 0..(self.instructions.len()) { | ||
spans.push(Span { start: 0, end: 0 }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there a reason to separate generate()
and block()
into two functions? I believe you could create the IrBlock at the beginning and then while generating the nodes, it could push the instructions to it with a proper span on the fly.
Better than using a Span is to modify IrBlock to use NodeId, but this can be done later and in stages (e.g., first use both Span and NodeId until we migrate fully, then deletee Span), not in the scope of this PR.
The AST field can be None since we don't need the old Nushell AST for anything. Once we use NodeId instead of Span, as outlined above, then the NodeIds form the sub-AST corresponding to the IrBlock, I think that should suffice.
Left some comments, but overall looks like a good start! |
The initial implementation only handles simple math expressions, the focus is primarily on introducing new structs, agreeing on naming and adding the output to insta tests.