Skip to content
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

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

Conversation

doriath
Copy link
Contributor

@doriath doriath commented Jan 2, 2025

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.

@doriath
Copy link
Contributor Author

doriath commented Jan 2, 2025

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)

Copy link
Contributor

@132ikl 132ikl left a 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 😄

src/ir_generator.rs Show resolved Hide resolved
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> {
Copy link
Collaborator

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 });
Copy link
Collaborator

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.

@kubouch
Copy link
Collaborator

kubouch commented Jan 12, 2025

Left some comments, but overall looks like a good start!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants