@@ -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