diff options
author | Manuel Klimek <klimek@google.com> | 2015-05-07 12:26:30 +0000 |
---|---|---|
committer | Manuel Klimek <klimek@google.com> | 2015-05-07 12:26:30 +0000 |
commit | ec5c3db7acb04ee96fd8b49153e5458d8f21c38a (patch) | |
tree | fffc70bc12d7e8140795ab783822a4a2190b8405 /clang/lib | |
parent | 82cdd651232cf5f1440854c95eb9d6f66821e367 (diff) | |
download | bcm5719-llvm-ec5c3db7acb04ee96fd8b49153e5458d8f21c38a.tar.gz bcm5719-llvm-ec5c3db7acb04ee96fd8b49153e5458d8f21c38a.zip |
Implements a way to retrieve information about whether some lines were not formatted due to syntax errors.
llvm-svn: 236722
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Format/Format.cpp | 19 | ||||
-rw-r--r-- | clang/lib/Format/UnwrappedLineFormatter.cpp | 6 | ||||
-rw-r--r-- | clang/lib/Format/UnwrappedLineFormatter.h | 7 |
3 files changed, 20 insertions, 12 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index e7ebd685152..bb10c60b2f1 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -1219,7 +1219,7 @@ public: << "\n"); } - tooling::Replacements format() { + tooling::Replacements format(bool *IncompleteFormat) { tooling::Replacements Result; FormatTokenLexer Tokens(SourceMgr, ID, Style, Encoding); @@ -1234,7 +1234,8 @@ public: for (unsigned i = 0, e = UnwrappedLines[Run].size(); i != e; ++i) { AnnotatedLines.push_back(new AnnotatedLine(UnwrappedLines[Run][i])); } - tooling::Replacements RunResult = format(AnnotatedLines, Tokens); + tooling::Replacements RunResult = + format(AnnotatedLines, Tokens, IncompleteFormat); DEBUG({ llvm::dbgs() << "Replacements for run " << Run << ":\n"; for (tooling::Replacements::iterator I = RunResult.begin(), @@ -1253,7 +1254,7 @@ public: } tooling::Replacements format(SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, - FormatTokenLexer &Tokens) { + FormatTokenLexer &Tokens, bool *IncompleteFormat) { TokenAnnotator Annotator(Style, Tokens.getKeywords()); for (unsigned i = 0, e = AnnotatedLines.size(); i != e; ++i) { Annotator.annotate(*AnnotatedLines[i]); @@ -1269,7 +1270,7 @@ public: Whitespaces, Encoding, BinPackInconclusiveFunctions); UnwrappedLineFormatter Formatter(&Indenter, &Whitespaces, Style, - Tokens.getKeywords()); + Tokens.getKeywords(), IncompleteFormat); Formatter.format(AnnotatedLines, /*DryRun=*/false); return Whitespaces.generateReplacements(); } @@ -1489,16 +1490,18 @@ private: tooling::Replacements reformat(const FormatStyle &Style, SourceManager &SourceMgr, FileID ID, - ArrayRef<CharSourceRange> Ranges) { + ArrayRef<CharSourceRange> Ranges, + bool *IncompleteFormat) { if (Style.DisableFormat) return tooling::Replacements(); Formatter formatter(Style, SourceMgr, ID, Ranges); - return formatter.format(); + return formatter.format(IncompleteFormat); } tooling::Replacements reformat(const FormatStyle &Style, StringRef Code, ArrayRef<tooling::Range> Ranges, - StringRef FileName) { + StringRef FileName, + bool *IncompleteFormat) { if (Style.DisableFormat) return tooling::Replacements(); @@ -1521,7 +1524,7 @@ tooling::Replacements reformat(const FormatStyle &Style, StringRef Code, SourceLocation End = Start.getLocWithOffset(Range.getLength()); CharRanges.push_back(CharSourceRange::getCharRange(Start, End)); } - return reformat(Style, SourceMgr, ID, CharRanges); + return reformat(Style, SourceMgr, ID, CharRanges, IncompleteFormat); } LangOptions getFormattingLangOpts(const FormatStyle &Style) { diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp index fb1e8dd6842..672a911d8d6 100644 --- a/clang/lib/Format/UnwrappedLineFormatter.cpp +++ b/clang/lib/Format/UnwrappedLineFormatter.cpp @@ -403,6 +403,7 @@ UnwrappedLineFormatter::format(const SmallVectorImpl<AnnotatedLine *> &Lines, bool FixIndentation = FixBadIndentation && (LevelIndent != FirstTok->OriginalColumn); + bool ShouldFormat = TheLine.Affected || FixIndentation; if (TheLine.First->is(tok::eof)) { if (PreviousLine && PreviousLine->Affected && !DryRun) { // Remove the file's trailing whitespace. @@ -411,8 +412,7 @@ UnwrappedLineFormatter::format(const SmallVectorImpl<AnnotatedLine *> &Lines, /*IndentLevel=*/0, /*Spaces=*/0, /*TargetColumn=*/0); } - } else if (TheLine.Type != LT_Invalid && - (TheLine.Affected || FixIndentation)) { + } else if (TheLine.Type != LT_Invalid && ShouldFormat) { if (FirstTok->WhitespaceRange.isValid()) { if (!DryRun) formatFirstToken(*TheLine.First, PreviousLine, TheLine.Level, Indent, @@ -476,6 +476,8 @@ UnwrappedLineFormatter::format(const SmallVectorImpl<AnnotatedLine *> &Lines, } } } + if (TheLine.Type == LT_Invalid && ShouldFormat && IncompleteFormat) + *IncompleteFormat = true; if (!DryRun) markFinalized(TheLine.First); PreviousLine = *I; diff --git a/clang/lib/Format/UnwrappedLineFormatter.h b/clang/lib/Format/UnwrappedLineFormatter.h index d7e1f263c56..dcc67d875fe 100644 --- a/clang/lib/Format/UnwrappedLineFormatter.h +++ b/clang/lib/Format/UnwrappedLineFormatter.h @@ -33,9 +33,10 @@ public: UnwrappedLineFormatter(ContinuationIndenter *Indenter, WhitespaceManager *Whitespaces, const FormatStyle &Style, - const AdditionalKeywords &Keywords) + const AdditionalKeywords &Keywords, + bool *IncompleteFormat) : Indenter(Indenter), Whitespaces(Whitespaces), Style(Style), - Keywords(Keywords) {} + Keywords(Keywords), IncompleteFormat(IncompleteFormat) {} unsigned format(const SmallVectorImpl<AnnotatedLine *> &Lines, bool DryRun, int AdditionalIndent = 0, bool FixBadIndentation = false); @@ -169,6 +170,8 @@ private: // are many nested blocks. std::map<std::pair<const SmallVectorImpl<AnnotatedLine *> *, unsigned>, unsigned> PenaltyCache; + + bool *IncompleteFormat; }; } // end namespace format } // end namespace clang |