diff --git a/src/indexer.cc b/src/indexer.cc index 3ed3ddc9..4d079d01 100644 --- a/src/indexer.cc +++ b/src/indexer.cc @@ -519,15 +519,18 @@ void OnIndexDiagnostic(CXClientData client_data, for (unsigned i = 0; i < clang_getNumDiagnosticsInSet(diagnostics); ++i) { CXDiagnostic diagnostic = clang_getDiagnosticInSet(diagnostics, i); - // Skip diagnostics in system headers. CXSourceLocation diag_loc = clang_getDiagnosticLocation(diagnostic); - if (clang_Location_isInSystemHeader(diag_loc)) - continue; + // Skip diagnostics in system headers. + // if (clang_Location_isInSystemHeader(diag_loc)) + // continue; // Get db so we can attribute diagnostic to the right indexed file. CXFile file; unsigned int line, column; clang_getSpellingLocation(diag_loc, &file, &line, &column, nullptr); + // Skip empty diagnostic. + if(!line && !column) + continue; IndexFile* db = ConsumeFile(param, file); if (!db) continue; @@ -1928,11 +1931,29 @@ std::vector> ParseWithTu( perf->index_build = timer.ElapsedMicrosecondsAndReset(); + std::unordered_map inc_to_line; + for (auto &inc : param.primary_file->includes) + inc_to_line[inc.resolved_path] = inc.line; + auto result = param.file_consumer->TakeLocalState(); for (std::unique_ptr& entry : result) { entry->import_file = file; entry->args = args; + // If there are errors, show at least one at the include position. + auto it = inc_to_line.find(entry->path); + if (it != inc_to_line.end()) { + int line = it->second; + for (auto ls_diagnostic : entry->diagnostics_) { + if (ls_diagnostic.severity != lsDiagnosticSeverity::Error) + continue; + ls_diagnostic.range = + lsRange(lsPosition(line, 10), lsPosition(line, 10)); + param.primary_file->diagnostics_.push_back(ls_diagnostic); + break; + } + } + // Update file contents and modification time. entry->file_contents_ = param.file_contents[entry->path].contents; entry->last_modification_time = param.file_modification_times[entry->path];