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.
Problem
This is just a small pain point I've been having with
Label: you are required to pass in theFileIdwhen creating aLabel, 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 whereFileIdhas to be threaded throughout any logic that might report a diagnostic.For example, I have a
Parserstruct that can be constructed with a string reference:But actually the
Parserneeds theFileIdto createLabelinstances, so it looks more like:Not a huge deal, but it's more annoying.
Parserwill only ever report diagnostics for a single file. It also adds friction for writing tests with modules likeParser. I have to instantiate thatfilesystemfor the tests instead of just passing in that&str. I wantParserand other modules like it to be independent of my filesystem abstraction, but thisFileIdrequirement makes that difficult.Proposal
It would be nice if
FileIdwas not required when instantiatingLabeland instead you could add it with another chained method likewith_fileThis could be paired with an API for
Diagnosticthat applies aFileIdto allLabelinstances that don't have one, which would be useful forParser.