[PATCH] D84362: [NFC] Refactor DiagnosticBuilder and PartialDiagnostic
Andrzej Warzynski via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 29 07:14:43 PDT 2020
awarzynski added a comment.
Hi All,
I've just noticed this patch and realised that it takes `DiagnosticBuilder` in the direction tangential to what we proposed in [1]. I've just restarted our efforts with regard to refactoring these APIs and feel that it would be good to coordinate any future efforts in this area. I also want to make sure that we have a solution that works for everyone.
Basically, this patch makes `DiagnosticBuilder` more integrated with libclangBasic by assuming that every diagnostic contains `SourceLocation`s and `FixItHint`s (see the definition of `DiagnosticStorage`). However, that's not the case for driver diagnostics (i.e. diagnostics issued in libclangDriver). In [1] we proposed to create thin abstraction layers above all diagnostic classes that do not depend on `SourceLocation` (or anything else from libclangBasic). This patch makes `DiagnosticBuilder` _more_ dependant on `SourceLocation` and in this respect refactors `DiagnosticBuilder` in a direction opposite to what we proposed in [1].
Since this patch changes the `DiagnosticBuilder` API quite significantly, I am not entirely sure how to proceed with refactoring it (we need to make it independent of `SourceLocation` and any related classes). Originally, `DiagnosticBuilder` was a standalone class, but now we will have to refactor the following classes on top of `DiagnosticBuilder`:
- `DiagnosticStorage`
- `StreamingDiagnostic`
- `PartialDiagnostic`
One idea that immediately comes to mind is to split `DiagnosticStorage` as follows:
struct DiagnosticStorage {
// Storage that applies to all diagnostics
// Original content, but without DiagRanges and FixItHints
};
struct LangDiagnosticStorage {
// Storage that applies only to diagnostics that contain ranges and FixitHints - in practice these are language diagnostics
SmallVector<CharSourceRange, 8> DiagRanges;
SmallVector<FixItHint, 6> FixItHints;
LangDiagnosticStorage() = default;
}
How does this look? Sadly it will clutter this API, but I can't see any way around it. One other extreme alternative is to:
- revert this patch
- create a thin abstraction layer for `DiagnosticBuilder` independent of SourceLocation (as per our RFC [1])
- re-apply this patch (with some necessary modifications)
I appreciate that it is important to keep this API as clean and as lean as possible. However,
- it's required by libclangDriver
- we want to make libclangDriver independent of Clang (so that it can be used by Flang without the dependency on Clang).
Further refactoring will be required to achieve this. We sent 2 RFCs [1] [2] earlier this year to cfe-dev to discuss this, so I hope that this won't come as a surprise.
Do you have any suggestions?
CC @tra @rjmccall @rsmith @yaxunl
Thank you,
Andrzej
[1] http://lists.llvm.org/pipermail/cfe-dev/2020-July/066393.html
[2] http://lists.llvm.org/pipermail/llvm-dev/2020-June/141994.html
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D84362/new/
https://reviews.llvm.org/D84362
More information about the cfe-commits
mailing list