Skip to content

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
Member

@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 😄

r
}

fn span_to_string(&mut self, node_id: NodeId) -> Option<String> {
Copy link
Contributor

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.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds great, moved to Compiler and renamed.

let mut spans = vec![];
let mut ast = vec![];
for _ in 0..(self.instructions.len()) {
spans.push(Span { start: 0, end: 0 });
Copy link
Contributor

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.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe generate() and block() are separated because of errors and to follow other classes (like typechecker). I could aldo just change generate() to return Result<IrBlock, Vec<SourceError>>. WDYT?

Applied the suggestion to create IrBlock in constructor, and then modify it as part of the execution.

@kubouch
Copy link
Contributor

kubouch commented Jan 12, 2025

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

@doriath
Copy link
Contributor Author

doriath commented Jan 17, 2025

Thank you for the review!

@kubouch
Copy link
Contributor

kubouch commented Jan 19, 2025

OK, seems better. One more thing, you can pass NodeId as a parameter to add_instruction() and use that to set the proper span from self.compiler.spans instead of Span { start: 0, end: 0 }.

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 21, 2025

Updated to properly populate spans.

@kubouch
Copy link
Contributor

kubouch commented Jan 23, 2025

Awesome, thanks!

@kubouch kubouch merged commit f91d922 into nushell:main Jan 23, 2025
4 checks passed
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