r230495 - Add support for inserting ArrayRef<FixItHint> into DiagnosticBuilder.
Alexander Kornienko
alexfh at google.com
Thu Feb 26 03:50:57 PST 2015
On Wed, Feb 25, 2015 at 6:39 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
> On Wed, Feb 25, 2015 at 6:40 AM, Alexander Kornienko <alexfh at google.com>
> wrote:
>
>> Author: alexfh
>> Date: Wed Feb 25 08:40:56 2015
>> New Revision: 230495
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=230495&view=rev
>> Log:
>> Add support for inserting ArrayRef<FixItHint> into DiagnosticBuilder.
>>
>> This is going to be needed in clang-tidy as more checks add complex
>> fixits.
>>
>> Modified:
>> cfe/trunk/include/clang/Basic/Diagnostic.h
>> cfe/trunk/lib/Sema/SemaChecking.cpp
>>
>> Modified: cfe/trunk/include/clang/Basic/Diagnostic.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic.h?rev=230495&r1=230494&r2=230495&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/Diagnostic.h (original)
>> +++ cfe/trunk/include/clang/Basic/Diagnostic.h Wed Feb 25 08:40:56 2015
>> @@ -991,7 +991,8 @@ public:
>>
>> void AddFixItHint(const FixItHint &Hint) const {
>> assert(isActive() && "Clients must not add to cleared diagnostic!");
>> - DiagObj->DiagFixItHints.push_back(Hint);
>> + if (!Hint.isNull())
>>
>
> Why is this null check required/used? (it'd be nicer to hold the invariant
> that the FixItHints can't be null, if possible/reasonable)
>
The check for isNull() in the operator<< was added in r153122
<http://reviews.llvm.org/rL153122> "Don't include FixIts with a null
replacement range. Fixes rdar://problem/11040133".
>
> (also, if we do need FixItHints to have a null state, perhaps they should
> be boolean testable with an explicit operator bool)
>
The FixItHint::isNull() method is used just a handful of times in the code.
I don't know whether it makes sense to introduce a conversion to boolean to
make these usages simpler.
>
>
>> + DiagObj->DiagFixItHints.push_back(Hint);
>> }
>>
>> void addFlagValue(StringRef V) const { DiagObj->FlagValue = V; }
>> @@ -1095,7 +1096,13 @@ inline const DiagnosticBuilder &operator
>>
>> inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
>> const FixItHint &Hint) {
>> - if (!Hint.isNull())
>> + DB.AddFixItHint(Hint);
>> + return DB;
>> +}
>> +
>> +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
>> + ArrayRef<FixItHint> Hints) {
>> + for (const FixItHint &Hint : Hints)
>> DB.AddFixItHint(Hint);
>> return DB;
>> }
>>
>> Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=230495&r1=230494&r2=230495&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Feb 25 08:40:56 2015
>> @@ -3152,10 +3152,7 @@ void CheckFormatHandler::EmitFormatDiagn
>> if (InFunctionCall) {
>> const Sema::SemaDiagnosticBuilder &D = S.Diag(Loc, PDiag);
>> D << StringRange;
>> - for (ArrayRef<FixItHint>::iterator I = FixIt.begin(), E =
>> FixIt.end();
>> - I != E; ++I) {
>> - D << *I;
>> - }
>> + D << FixIt;
>> } else {
>> S.Diag(IsStringLocation ? ArgumentExpr->getExprLoc() : Loc, PDiag)
>> << ArgumentExpr->getSourceRange();
>> @@ -3165,10 +3162,7 @@ void CheckFormatHandler::EmitFormatDiagn
>> diag::note_format_string_defined);
>>
>> Note << StringRange;
>> - for (ArrayRef<FixItHint>::iterator I = FixIt.begin(), E =
>> FixIt.end();
>> - I != E; ++I) {
>> - Note << *I;
>> - }
>> + Note << FixIt;
>> }
>> }
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150226/cf0ba702/attachment.html>
More information about the cfe-commits
mailing list