-
Notifications
You must be signed in to change notification settings - Fork 66
Description
Problem
This is just a small pain point I've been having with Label
: you are required to pass in the FileId
when creating a Label
, which means that any error reporting logic must always be aware of what file it's operating on. This has led to some unfortunate coupling where FileId
has to be threaded throughout any logic that might report a diagnostic.
For example, I have a Parser
struct that can be constructed with a string reference:
let source : &str = "...";
let mut parser = Parser::new(source);
let ast = parser.parse_module();
But actually the Parser
needs the FileId
to create Label
instances, so it looks more like:
let file = filesystem.load("...");
let source = filesystem.resolve(file).unwrap();
let mut parser = Parser::new(source, file);
let ast = parser.parse_module();
Not a huge deal, but it's more annoying. Parser
will only ever report diagnostics for a single file. It also adds friction for writing tests with modules like Parser
. I have to instantiate that filesystem
for the tests instead of just passing in that &str
. I want Parser
and other modules like it to be independent of my filesystem abstraction, but this FileId
requirement makes that difficult.
Proposal
It would be nice if FileId
was not required when instantiating Label
and instead you could add it with another chained method like with_file
Label::primary(span).with_message("Invalid character").with_file(file_id);
This could be paired with an API for Diagnostic
that applies a FileId
to all Label
instances that don't have one, which would be useful for Parser
.