From 60fca0596adfc98af9e3ef4e657d90eec4af9486 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 1 Oct 2021 16:32:47 +0200 Subject: [PATCH] ClangTools: Add header files to the list of files to be analyzed Now that the CMakeProjectManager is reporting the header files as source files, it makes sense to analyze the headers as source files. Note that the header type needs to change to source type since the "cxx-header" argument that will be send if the Kind is CxxHeader is handled by the compiler as an argument to produce a precompiled header, which is not what we want. Fixes: QTCREATORBUG-21452 Fixes: QTCREATORBUG-25644 Fixes: QTCREATORBUG-25782 Change-Id: Icd674962ff8312b8fbfa46491938eb721edd761d Reviewed-by: Christian Kandeler --- src/plugins/clangtools/clangtool.cpp | 7 +++-- .../clangtools/documentclangtoolrunner.cpp | 5 +-- src/plugins/cppeditor/cppprojectfile.cpp | 31 +++++++++++++++++++ src/plugins/cppeditor/cppprojectfile.h | 3 ++ 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index 2825c643e4d..c8de027bce6 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -340,9 +340,12 @@ static FileInfos sortedFileInfos(const QVector if (file.path == CppEditor::CppModelManager::configurationFileName()) continue; - if (file.active && CppEditor::ProjectFile::isSource(file.kind)) { + if (file.active + && (CppEditor::ProjectFile::isSource(file.kind) + || CppEditor::ProjectFile::isHeader(file.kind))) { + ProjectFile::Kind sourceKind = CppEditor::ProjectFile::sourceKind(file.kind); fileInfos.emplace_back(Utils::FilePath::fromString(file.path), - file.kind, + sourceKind, projectPart); } } diff --git a/src/plugins/clangtools/documentclangtoolrunner.cpp b/src/plugins/clangtools/documentclangtoolrunner.cpp index 5ec59339201..d62b882d4a2 100644 --- a/src/plugins/clangtools/documentclangtoolrunner.cpp +++ b/src/plugins/clangtools/documentclangtoolrunner.cpp @@ -160,11 +160,12 @@ static FileInfo getFileInfo(const FilePath &file, Project *project) if (!projectFile.active) continue; // found the best candidate, early return + ProjectFile::Kind sourceKind = ProjectFile::sourceKind(projectFile.kind); if (projectPart->buildTargetType != BuildTargetType::Unknown) - return FileInfo(projectFilePath, projectFile.kind, projectPart); + return FileInfo(projectFilePath, sourceKind, projectPart); // found something but keep looking for better candidates if (candidate.projectPart.isNull()) - candidate = FileInfo(projectFilePath, projectFile.kind, projectPart); + candidate = FileInfo(projectFilePath, sourceKind, projectPart); } } diff --git a/src/plugins/cppeditor/cppprojectfile.cpp b/src/plugins/cppeditor/cppprojectfile.cpp index 382a0b7c056..fa3bf8c0238 100644 --- a/src/plugins/cppeditor/cppprojectfile.cpp +++ b/src/plugins/cppeditor/cppprojectfile.cpp @@ -87,6 +87,37 @@ bool ProjectFile::isAmbiguousHeader(const QString &filePath) return filePath.endsWith(".h"); } +ProjectFile::Kind ProjectFile::sourceForHeaderKind(ProjectFile::Kind kind) +{ + ProjectFile::Kind sourceKind; + switch (kind) { + case ProjectFile::CHeader: + sourceKind = ProjectFile::CSource; + break; + case ProjectFile::ObjCHeader: + sourceKind = ProjectFile::ObjCSource; + break; + case ProjectFile::ObjCXXHeader: + sourceKind = ProjectFile::ObjCXXSource; + break; + case ProjectFile::Unsupported: // no file extension, e.g. stl headers + case ProjectFile::AmbiguousHeader: + case ProjectFile::CXXHeader: + default: + sourceKind = ProjectFile::CXXSource; + } + + return sourceKind; +} + +ProjectFile::Kind ProjectFile::sourceKind(Kind kind) +{ + ProjectFile::Kind sourceKind = kind; + if (ProjectFile::isHeader(kind)) + sourceKind = ProjectFile::sourceForHeaderKind(kind); + return sourceKind; +} + bool ProjectFile::isHeader(ProjectFile::Kind kind) { switch (kind) { diff --git a/src/plugins/cppeditor/cppprojectfile.h b/src/plugins/cppeditor/cppprojectfile.h index f86c668d5ff..078b93cce9e 100644 --- a/src/plugins/cppeditor/cppprojectfile.h +++ b/src/plugins/cppeditor/cppprojectfile.h @@ -53,6 +53,9 @@ public: static Kind classifyByMimeType(const QString &mt); static Kind classify(const QString &filePath); + static Kind sourceForHeaderKind(Kind kind); + static Kind sourceKind(Kind kind); + static bool isSource(Kind kind); static bool isHeader(Kind kind); static bool isC(Kind kind);