diff options
Diffstat (limited to 'lib/Frontend')
-rw-r--r-- | lib/Frontend/FixItRewriter.cpp | 5 | ||||
-rw-r--r-- | lib/Frontend/HTMLDiagnostics.cpp | 8 | ||||
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 7 | ||||
-rw-r--r-- | lib/Frontend/PlistDiagnostics.cpp | 94 | ||||
-rw-r--r-- | lib/Frontend/TextDiagnosticPrinter.cpp | 4 |
5 files changed, 68 insertions, 50 deletions
diff --git a/lib/Frontend/FixItRewriter.cpp b/lib/Frontend/FixItRewriter.cpp index 6fde5dae75..1ed89d75a9 100644 --- a/lib/Frontend/FixItRewriter.cpp +++ b/lib/Frontend/FixItRewriter.cpp @@ -22,8 +22,9 @@ #include "llvm/System/Path.h" using namespace clang; -FixItRewriter::FixItRewriter(Diagnostic &Diags, SourceManager &SourceMgr) - : Diags(Diags), Rewrite(SourceMgr), NumFailures(0) { +FixItRewriter::FixItRewriter(Diagnostic &Diags, SourceManager &SourceMgr, + const LangOptions &LangOpts) + : Diags(Diags), Rewrite(SourceMgr, LangOpts), NumFailures(0) { Client = Diags.getClient(); Diags.setClient(this); } diff --git a/lib/Frontend/HTMLDiagnostics.cpp b/lib/Frontend/HTMLDiagnostics.cpp index 83c2ac56a7..752d41fb4c 100644 --- a/lib/Frontend/HTMLDiagnostics.cpp +++ b/lib/Frontend/HTMLDiagnostics.cpp @@ -163,7 +163,7 @@ void HTMLDiagnostics::ReportDiag(const PathDiagnostic& D) { return; // FIXME: Emit a warning? // Create a new rewriter to generate HTML. - Rewriter R(const_cast<SourceManager&>(SMgr)); + Rewriter R(const_cast<SourceManager&>(SMgr), PP->getLangOptions()); // Process the path. unsigned n = D.size(); @@ -574,8 +574,8 @@ void HTMLDiagnostics::HighlightRange(Rewriter& R, FileID BugFileID, SourceRange Range, const char *HighlightStart, const char *HighlightEnd) { - - SourceManager& SM = R.getSourceMgr(); + SourceManager &SM = R.getSourceMgr(); + const LangOptions &LangOpts = R.getLangOpts(); SourceLocation InstantiationStart = SM.getInstantiationLoc(Range.getBegin()); unsigned StartLineNo = SM.getInstantiationLineNumber(InstantiationStart); @@ -596,7 +596,7 @@ void HTMLDiagnostics::HighlightRange(Rewriter& R, FileID BugFileID, if (EndColNo) { // Add in the length of the token, so that we cover multi-char tokens. - EndColNo += Lexer::MeasureTokenLength(Range.getEnd(), SM) - 1; + EndColNo += Lexer::MeasureTokenLength(Range.getEnd(), SM, LangOpts)-1; } // Highlight the range. Make the span tag the outermost tag for the diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index bc754cb845..b0b35e491b 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -482,14 +482,15 @@ PCHReader::PCHReadResult PCHReader::ReadSourceManagerBlock() { SourceLocation::getFromRawEncoding(Record[2]), SourceLocation::getFromRawEncoding(Record[3]), Lexer::MeasureTokenLength(SpellingLoc, - SourceMgr)); + SourceMgr, + PP.getLangOptions())); break; } - case pch::SM_LINE_TABLE: { + case pch::SM_LINE_TABLE: if (ParseLineTable(SourceMgr, Record)) return Failure; - } + break; } } } diff --git a/lib/Frontend/PlistDiagnostics.cpp b/lib/Frontend/PlistDiagnostics.cpp index d87a8f189f..726248431f 100644 --- a/lib/Frontend/PlistDiagnostics.cpp +++ b/lib/Frontend/PlistDiagnostics.cpp @@ -15,7 +15,7 @@ #include "clang/Analysis/PathDiagnostic.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/FileManager.h" -#include "clang/Lex/Lexer.h" +#include "clang/Lex/Preprocessor.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/Casting.h" @@ -36,8 +36,9 @@ namespace { class VISIBILITY_HIDDEN PlistDiagnostics : public PathDiagnosticClient { std::vector<const PathDiagnostic*> BatchedDiags; const std::string OutputFile; + const LangOptions &LangOpts; public: - PlistDiagnostics(const std::string& prefix); + PlistDiagnostics(const std::string& prefix, const LangOptions &LangOpts); ~PlistDiagnostics(); void HandlePathDiagnostic(const PathDiagnostic* D); @@ -47,13 +48,14 @@ namespace { }; } // end anonymous namespace -PlistDiagnostics::PlistDiagnostics(const std::string& output) - : OutputFile(output) {} +PlistDiagnostics::PlistDiagnostics(const std::string& output, + const LangOptions &LO) + : OutputFile(output), LangOpts(LO) {} PathDiagnosticClient* clang::CreatePlistDiagnosticClient(const std::string& s, - Preprocessor*, PreprocessorFactory*) { - return new PlistDiagnostics(s); + Preprocessor *PP, PreprocessorFactory*) { + return new PlistDiagnostics(s, PP->getLangOptions()); } static void AddFID(FIDMap &FIDs, llvm::SmallVectorImpl<FileID> &V, @@ -66,9 +68,9 @@ static void AddFID(FIDMap &FIDs, llvm::SmallVectorImpl<FileID> &V, V.push_back(FID); } -static unsigned GetFID(const FIDMap& FIDs, const SourceManager* SM, +static unsigned GetFID(const FIDMap& FIDs, const SourceManager &SM, SourceLocation L) { - FileID FID = SM->getFileID(SM->getInstantiationLoc(L)); + FileID FID = SM.getFileID(SM.getInstantiationLoc(L)); FIDMap::const_iterator I = FIDs.find(FID); assert(I != FIDs.end()); return I->second; @@ -79,14 +81,16 @@ static llvm::raw_ostream& Indent(llvm::raw_ostream& o, const unsigned indent) { return o; } -static void EmitLocation(llvm::raw_ostream& o, const SourceManager* SM, - SourceLocation L, const FIDMap& FM, - const unsigned indent, bool extend = false) { +static void EmitLocation(llvm::raw_ostream& o, const SourceManager &SM, + const LangOptions &LangOpts, + SourceLocation L, const FIDMap &FM, + unsigned indent, bool extend = false) { - FullSourceLoc Loc(SM->getInstantiationLoc(L), const_cast<SourceManager&>(*SM)); + FullSourceLoc Loc(SM.getInstantiationLoc(L), const_cast<SourceManager&>(SM)); // Add in the length of the token, so that we cover multi-char tokens. - unsigned offset = extend ? Lexer::MeasureTokenLength(Loc, *SM) - 1 : 0; + unsigned offset = + extend ? Lexer::MeasureTokenLength(Loc, SM, LangOpts) - 1 : 0; Indent(o, indent) << "<dict>\n"; Indent(o, indent) << " <key>line</key><integer>" @@ -98,19 +102,20 @@ static void EmitLocation(llvm::raw_ostream& o, const SourceManager* SM, Indent(o, indent) << "</dict>\n"; } -static void EmitLocation(llvm::raw_ostream& o, const SourceManager* SM, +static void EmitLocation(llvm::raw_ostream& o, const SourceManager &SM, + const LangOptions &LangOpts, const PathDiagnosticLocation &L, const FIDMap& FM, - const unsigned indent, bool extend = false) { - EmitLocation(o, SM, L.asLocation(), FM, indent, extend); + unsigned indent, bool extend = false) { + EmitLocation(o, SM, LangOpts, L.asLocation(), FM, indent, extend); } -static void EmitRange(llvm::raw_ostream& o, const SourceManager* SM, - SourceRange R, const FIDMap& FM, - const unsigned indent) { - +static void EmitRange(llvm::raw_ostream& o, const SourceManager &SM, + const LangOptions &LangOpts, + SourceRange R, const FIDMap &FM, + unsigned indent) { Indent(o, indent) << "<array>\n"; - EmitLocation(o, SM, R.getBegin(), FM, indent+1); - EmitLocation(o, SM, R.getEnd(), FM, indent+1, true); + EmitLocation(o, SM, LangOpts, R.getBegin(), FM, indent+1); + EmitLocation(o, SM, LangOpts, R.getEnd(), FM, indent+1, true); Indent(o, indent) << "</array>\n"; } @@ -134,7 +139,9 @@ static llvm::raw_ostream& EmitString(llvm::raw_ostream& o, static void ReportControlFlow(llvm::raw_ostream& o, const PathDiagnosticControlFlowPiece& P, - const FIDMap& FM, const SourceManager *SM, + const FIDMap& FM, + const SourceManager &SM, + const LangOptions &LangOpts, unsigned indent) { Indent(o, indent) << "<dict>\n"; @@ -145,9 +152,9 @@ static void ReportControlFlow(llvm::raw_ostream& o, // FIXME: Eventually remove (DEPRECATED) // Output the start and end locations. Indent(o, indent) << "<key>start</key>\n"; - EmitLocation(o, SM, P.getStartLocation(), FM, indent); + EmitLocation(o, SM, LangOpts, P.getStartLocation(), FM, indent); Indent(o, indent) << "<key>end</key>\n"; - EmitLocation(o, SM, P.getEndLocation(), FM, indent); + EmitLocation(o, SM, LangOpts, P.getEndLocation(), FM, indent); // Emit edges. Indent(o, indent) << "<key>edges</key>\n"; @@ -159,9 +166,9 @@ static void ReportControlFlow(llvm::raw_ostream& o, Indent(o, indent) << "<dict>\n"; ++indent; Indent(o, indent) << "<key>start</key>\n"; - EmitRange(o, SM, I->getStart().asRange(), FM, indent+1); + EmitRange(o, SM, LangOpts, I->getStart().asRange(), FM, indent+1); Indent(o, indent) << "<key>end</key>\n"; - EmitRange(o, SM, I->getEnd().asRange(), FM, indent+1); + EmitRange(o, SM, LangOpts, I->getEnd().asRange(), FM, indent+1); --indent; Indent(o, indent) << "</dict>\n"; } @@ -181,7 +188,9 @@ static void ReportControlFlow(llvm::raw_ostream& o, } static void ReportEvent(llvm::raw_ostream& o, const PathDiagnosticPiece& P, - const FIDMap& FM, const SourceManager* SM, + const FIDMap& FM, + const SourceManager &SM, + const LangOptions &LangOpts, unsigned indent) { Indent(o, indent) << "<dict>\n"; @@ -193,7 +202,7 @@ static void ReportEvent(llvm::raw_ostream& o, const PathDiagnosticPiece& P, FullSourceLoc L = P.getLocation().asLocation(); Indent(o, indent) << "<key>location</key>\n"; - EmitLocation(o, SM, L, FM, indent); + EmitLocation(o, SM, LangOpts, L, FM, indent); // Output the ranges (if any). PathDiagnosticPiece::range_iterator RI = P.ranges_begin(), @@ -203,7 +212,8 @@ static void ReportEvent(llvm::raw_ostream& o, const PathDiagnosticPiece& P, Indent(o, indent) << "<key>ranges</key>\n"; Indent(o, indent) << "<array>\n"; ++indent; - for ( ; RI != RE; ++RI ) EmitRange(o, SM, *RI, FM, indent+1); + for (; RI != RE; ++RI) + EmitRange(o, SM, LangOpts, *RI, FM, indent+1); --indent; Indent(o, indent) << "</array>\n"; } @@ -226,7 +236,8 @@ static void ReportEvent(llvm::raw_ostream& o, const PathDiagnosticPiece& P, static void ReportMacro(llvm::raw_ostream& o, const PathDiagnosticMacroPiece& P, - const FIDMap& FM, const SourceManager *SM, + const FIDMap& FM, const SourceManager &SM, + const LangOptions &LangOpts, unsigned indent) { for (PathDiagnosticMacroPiece::const_iterator I=P.begin(), E=P.end(); @@ -236,30 +247,35 @@ static void ReportMacro(llvm::raw_ostream& o, default: break; case PathDiagnosticPiece::Event: - ReportEvent(o, cast<PathDiagnosticEventPiece>(**I), FM, SM, indent); + ReportEvent(o, cast<PathDiagnosticEventPiece>(**I), FM, SM, LangOpts, + indent); break; case PathDiagnosticPiece::Macro: - ReportMacro(o, cast<PathDiagnosticMacroPiece>(**I), FM, SM, indent); + ReportMacro(o, cast<PathDiagnosticMacroPiece>(**I), FM, SM, LangOpts, + indent); break; } } } static void ReportDiag(llvm::raw_ostream& o, const PathDiagnosticPiece& P, - const FIDMap& FM, const SourceManager* SM) { + const FIDMap& FM, const SourceManager &SM, + const LangOptions &LangOpts) { unsigned indent = 4; switch (P.getKind()) { case PathDiagnosticPiece::ControlFlow: ReportControlFlow(o, cast<PathDiagnosticControlFlowPiece>(P), FM, SM, - indent); + LangOpts, indent); break; case PathDiagnosticPiece::Event: - ReportEvent(o, cast<PathDiagnosticEventPiece>(P), FM, SM, indent); + ReportEvent(o, cast<PathDiagnosticEventPiece>(P), FM, SM, LangOpts, + indent); break; case PathDiagnosticPiece::Macro: - ReportMacro(o, cast<PathDiagnosticMacroPiece>(P), FM, SM, indent); + ReportMacro(o, cast<PathDiagnosticMacroPiece>(P), FM, SM, LangOpts, + indent); break; } } @@ -352,7 +368,7 @@ PlistDiagnostics::~PlistDiagnostics() { o << " <array>\n"; for (PathDiagnostic::const_iterator I=D->begin(), E=D->end(); I != E; ++I) - ReportDiag(o, *I, FM, SM); + ReportDiag(o, *I, FM, *SM, LangOpts); o << " </array>\n"; @@ -366,7 +382,7 @@ PlistDiagnostics::~PlistDiagnostics() { // Output the location of the bug. o << " <key>location</key>\n"; - EmitLocation(o, SM, D->getLocation(), FM, 2); + EmitLocation(o, *SM, LangOpts, D->getLocation(), FM, 2); // Close up the entry. o << " </dict>\n"; diff --git a/lib/Frontend/TextDiagnosticPrinter.cpp b/lib/Frontend/TextDiagnosticPrinter.cpp index f1555dbff3..c472a140cb 100644 --- a/lib/Frontend/TextDiagnosticPrinter.cpp +++ b/lib/Frontend/TextDiagnosticPrinter.cpp @@ -82,7 +82,7 @@ void TextDiagnosticPrinter::HighlightRange(const SourceRange &R, --EndColNo; // Zero base the col #. // Add in the length of the token, so that we cover multi-char tokens. - EndColNo += Lexer::MeasureTokenLength(End, SM); + EndColNo += Lexer::MeasureTokenLength(End, SM, *LangOpts); } else { EndColNo = CaretLine.size(); } @@ -281,7 +281,7 @@ void TextDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level, continue; // Add in the length of the token, so that we cover multi-char tokens. - unsigned TokSize = Lexer::MeasureTokenLength(E, SM); + unsigned TokSize = Lexer::MeasureTokenLength(E, SM, *LangOpts); OS << '{' << SM.getLineNumber(BInfo.first, BInfo.second) << ':' << SM.getColumnNumber(BInfo.first, BInfo.second) << '-' |