-
-
Notifications
You must be signed in to change notification settings - Fork 320
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
Automatic annotation of type signatures #7130
base: main
Are you sure you want to change the base?
Conversation
f03b305
to
387c509
Compare
buffer | ||
} | ||
|
||
pub fn annotation_edits( |
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've exposed this and annotations_edit() publicly to be used in the language server but It feels weird to expose them from the cli crate. If it should be in another crate what one?
crates/cli/src/main.rs
Outdated
|
||
let annotate_exit_code = match annotate_file(&arena, roc_file_path.to_owned()) { | ||
Ok(()) => 0, | ||
Err(LoadingProblem::FormattedReport(report)) => { |
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.
If there's a problem loading the file then it just prints out the error. I know this needs to be updated but I'm not sure what the error message should be. Should it include the loading problem or just say that there was one?
I've added some comments on the code with some questions about things that I'm not sure about
|
Thank you for your contribution! Sometimes PRs end up staying open for a long time without activity, which can make the list of open PRs get long and time-consuming to review. To keep things manageable for reviewers, this bot automatically closes PRs that haven’t had activity in 60 days. This PR hasn’t had activity in 30 days, so it will be automatically closed if there is no more activity in the next 30 days. Keep in mind that PRs marked |
387c509
to
acea61b
Compare
This has been open long enough so I've put it up for review. There's still issues with suffixed expressions from #7126 but the code for this is independent from that. |
acea61b
to
d4e558d
Compare
I changed an if to an assert last minute 🙃. That should fix it |
@snobee -- can you please merge latest main? Apologies for leaving it so long... I think this slipped through and got forgotten about. |
@lukewilliamboswell No problem 😃 Should be ready for review now! |
if self.should_visit(region) { | ||
if let Expr::Call(_, args, CalledVia::QuestionSuffix) = expr { | ||
let Expr::Closure(ClosureData { arguments, .. }) = &args[1].1.value else { | ||
internal_error!("Suffixed expression did not contain a closure") |
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.
Particularly for the language server, I think we should be more careful about crashing. Is there a sensible default we can use here?
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.
Just skipping this node and printing an error is probably the best way to handle it.
That being said, I can see that this form of question suffix desugaring was removed from the compiler, it's just the enum variant that remains. I think I can just remove this whole section instead.
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.
@lukewilliamboswell do you know what the status is of CalledVia::QuestionSuffix?
decl.range, | ||
); | ||
|
||
let pos = roc_region::all::Position::new(offset as u32); |
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.
Can you add a use
statement at the top for Position?
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.
lsp_type::Position is already imported and I must have forgot about renaming imports. I'll import as RocPosition or something
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.
Ahh I missed that there was another thing named Position. In that case, I don't feel strongly.
let symbol = decls.symbols[index]; | ||
let expr = &decls.expressions[index].value; | ||
|
||
use roc_problem::can::RuntimeError::ExposedButNotDefined; |
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.
Should this use be moved to the top?
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.
yep!
// Generated names for errors start with `#` | ||
.replace('#', ""); |
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.
It seems that if there's an error in the type, don't we want to cancel the operation, no?
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.
maybe? These only seem show up when a type doesn't implement an ability it's supposed to. I'm not sure how I'd go about detecting all type errors. I could try looking for
Error
FlexVar(None)
orFlexAbleVar(None, ...)
that show up anywhere except as argumentsFlexVar
orFlexAbleVar
that have names that start with '#'
But that still allows things like List.first(8)
which has the type Result a [ListWasEmpty]
. I'm not sure if that would be counted as an error or not? a
doesn't come from anywhere so maybe that means it is?
This stuff is a bit over my head so maybe I'm missing something but I don't see anything in the codebase for this already
The other way to disallow errors is not from the type but if the code itself has any warnings or errors but that seems a bit heavy handed
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.
a
doesn't come from anywhere so maybe that means it is?
I think (this is not really my area...) that may be fine, and the constraint is that a
needs to be a fresh name (not bound in the outer scope).
Maybe @bhansconnect has more specific advice about how we should be applying types here?
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 would short circuit and break out if there are any errors in types, I think it's too easy to generate wrong annotations otherwise. If the easiest method to implement it is to check if the code has any errors, I think that's fine at this moment in time
Resolves #7042
I've started with all the logic in analysed_doc but I'll probably end up moving some of it into fmt when I start on that part
I'm making some assumptions here that I wanted to confirm: