diff --git a/src/clang_tu.cc b/src/clang_tu.cc index 5042714f0..131adcc05 100644 --- a/src/clang_tu.cc +++ b/src/clang_tu.cc @@ -27,6 +27,13 @@ std::string pathFromFileEntry(const FileEntry &file) { return normalizeFolder(ret) ? ret : realPath(ret); } +bool isInsideMainFile(const SourceManager &sm, SourceLocation sl) { + if (!sl.isValid()) + return false; + FileID fid = sm.getFileID(sm.getExpansionLoc(sl)); + return fid == sm.getMainFileID() || fid == sm.getPreambleFileID(); +} + static Pos decomposed2LineAndCol(const SourceManager &sm, std::pair i) { int l = (int)sm.getLineNumber(i.first, i.second) - 1, diff --git a/src/clang_tu.hh b/src/clang_tu.hh index b53799a88..b37950926 100644 --- a/src/clang_tu.hh +++ b/src/clang_tu.hh @@ -20,6 +20,8 @@ namespace vfs = clang::vfs; namespace ccls { std::string pathFromFileEntry(const clang::FileEntry &file); +bool isInsideMainFile(const clang::SourceManager &sm, clang::SourceLocation sl); + Range fromCharSourceRange(const clang::SourceManager &sm, const clang::LangOptions &lang, clang::CharSourceRange csr, diff --git a/src/sema_manager.cc b/src/sema_manager.cc index 6a228f391..1002565b7 100644 --- a/src/sema_manager.cc +++ b/src/sema_manager.cc @@ -243,7 +243,7 @@ class StoreDiags : public DiagnosticConsumer { return; const SourceManager &sm = info.getSourceManager(); StringRef filename = sm.getFilename(info.getLocation()); - bool concerned = sm.isWrittenInMainFile(l); + bool concerned = isInsideMainFile(sm, l); auto fillDiagBase = [&](DiagBase &d) { llvm::SmallString<64> message; info.FormatDiagnostic(message);