@@ -55,17 +55,34 @@ StandaloneDiagnostic::StandaloneDiagnostic(const LangOptions &LangOpts,
5555
5656StoredDiagnostic
5757translateStandaloneDiag (FileManager &FileMgr, SourceManager &SrcMgr,
58- StandaloneDiagnostic &&StandaloneDiag) {
58+ const StandaloneDiagnostic &StandaloneDiag,
59+ llvm::StringMap<SourceLocation> &SrcLocCache) {
5960 const auto FileRef = FileMgr.getOptionalFileRef (StandaloneDiag.Filename );
6061 if (!FileRef)
6162 return StoredDiagnostic (StandaloneDiag.Level , StandaloneDiag.ID ,
62- std::move (StandaloneDiag.Message ));
63+ StandaloneDiag.Message );
64+
65+ // Try to get FileLoc from cache first
66+ SourceLocation FileLoc;
67+ auto It = SrcLocCache.find (StandaloneDiag.Filename );
68+ if (It != SrcLocCache.end ()) {
69+ FileLoc = It->getValue ();
70+ }
71+
72+ // Cache miss - compute the location
73+ if (FileLoc.isInvalid ()) {
74+ const auto FileID =
75+ SrcMgr.getOrCreateFileID (*FileRef, StandaloneDiag.FileKind );
76+ FileLoc = SrcMgr.getLocForStartOfFile (FileID);
77+
78+ if (FileLoc.isInvalid ())
79+ return StoredDiagnostic (StandaloneDiag.Level , StandaloneDiag.ID ,
80+ StandaloneDiag.Message );
81+
82+ // Store in cache
83+ SrcLocCache[StandaloneDiag.Filename ] = FileLoc;
84+ }
6385
64- const auto FileID =
65- SrcMgr.getOrCreateFileID (*FileRef, StandaloneDiag.FileKind );
66- const auto FileLoc = SrcMgr.getLocForStartOfFile (FileID);
67- assert (FileLoc.isValid () && " StandaloneDiagnostic should only use FilePath "
68- " for encoding a valid source location." );
6986 const auto DiagLoc = FileLoc.getLocWithOffset (StandaloneDiag.FileOffset );
7087 const FullSourceLoc Loc (DiagLoc, SrcMgr);
7188
@@ -77,16 +94,16 @@ translateStandaloneDiag(FileManager &FileMgr, SourceManager &SrcMgr,
7794 /* IsTokenRange*/ false );
7895 };
7996
80- SmallVector<CharSourceRange, 0 > TranslatedRanges;
97+ SmallVector<CharSourceRange, 4 > TranslatedRanges;
8198 TranslatedRanges.reserve (StandaloneDiag.Ranges .size ());
8299 transform (StandaloneDiag.Ranges , std::back_inserter (TranslatedRanges),
83100 ConvertOffsetRange);
84101
85- SmallVector<FixItHint, 0 > TranslatedFixIts;
102+ SmallVector<FixItHint, 2 > TranslatedFixIts;
86103 TranslatedFixIts.reserve (StandaloneDiag.FixIts .size ());
87104 for (const auto &FixIt : StandaloneDiag.FixIts ) {
88105 FixItHint TranslatedFixIt;
89- TranslatedFixIt.CodeToInsert = std::string ( FixIt.CodeToInsert ) ;
106+ TranslatedFixIt.CodeToInsert = FixIt.CodeToInsert ;
90107 TranslatedFixIt.RemoveRange = ConvertOffsetRange (FixIt.RemoveRange );
91108 TranslatedFixIt.InsertFromRange = ConvertOffsetRange (FixIt.InsertFromRange );
92109 TranslatedFixIt.BeforePreviousInsertions = FixIt.BeforePreviousInsertions ;
0 commit comments