diff --git a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp index 4e2b19db8b4..d62fa6e41de 100644 --- a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp +++ b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp @@ -192,7 +192,7 @@ struct Data // because we have a cycle dependency database}; ClangBackEnd::PchTasksMerger pchTaskMerger{pchTaskQueue}; ClangBackEnd::BuildDependenciesStorage<> buildDependencyStorage{database}; - ClangBackEnd::BuildDependencyCollector buildDependencyCollector{filePathCache}; + ClangBackEnd::BuildDependencyCollector buildDependencyCollector{filePathCache, generatedFiles}; std::function getModifiedTime{ [&](ClangBackEnd::FilePathView path) -> TimeStamp { return QFileInfo(QString(path)).lastModified().toSecsSinceEpoch(); diff --git a/src/tools/clangpchmanagerbackend/source/builddependencycollector.cpp b/src/tools/clangpchmanagerbackend/source/builddependencycollector.cpp index 833691fa893..6647d02531d 100644 --- a/src/tools/clangpchmanagerbackend/source/builddependencycollector.cpp +++ b/src/tools/clangpchmanagerbackend/source/builddependencycollector.cpp @@ -55,6 +55,8 @@ BuildDependency BuildDependencyCollector::create(const ProjectPartContainer &pro setExcludedFilePaths( m_filePathCache.filePaths(projectPart.headerPathIds + projectPart.sourcePathIds)); + addUnsavedFiles(m_generatedFiles.fileContainers()); + collect(); auto buildDependency = std::move(m_buildDependency); diff --git a/src/tools/clangpchmanagerbackend/source/builddependencycollector.h b/src/tools/clangpchmanagerbackend/source/builddependencycollector.h index 2ea7fb7c903..b9446c96928 100644 --- a/src/tools/clangpchmanagerbackend/source/builddependencycollector.h +++ b/src/tools/clangpchmanagerbackend/source/builddependencycollector.h @@ -28,6 +28,7 @@ #include "builddependencygeneratorinterface.h" #include +#include #include #include @@ -37,8 +38,10 @@ namespace ClangBackEnd { class BuildDependencyCollector : public BuildDependencyGeneratorInterface { public: - BuildDependencyCollector(const FilePathCachingInterface &filePathCache) - : m_filePathCache(filePathCache) + BuildDependencyCollector(const FilePathCachingInterface &filePathCache, + const GeneratedFilesInterface &generatedFiles) + : m_filePathCache(filePathCache) + , m_generatedFiles(generatedFiles) { } @@ -92,6 +95,7 @@ private: Utils::SmallStringVector m_directories; SourcesManager m_sourcesManager; const FilePathCachingInterface &m_filePathCache; + const GeneratedFilesInterface &m_generatedFiles; }; } // namespace ClangBackEnd diff --git a/src/tools/clangrefactoringbackend/source/sourcelocationsutils.h b/src/tools/clangrefactoringbackend/source/sourcelocationsutils.h index c179c9599ee..45bc71fdb45 100644 --- a/src/tools/clangrefactoringbackend/source/sourcelocationsutils.h +++ b/src/tools/clangrefactoringbackend/source/sourcelocationsutils.h @@ -44,9 +44,17 @@ llvm::SmallString<256> absolutePath(clang::StringRef path) { llvm::SmallString<256> absolutePath; + if (llvm::sys::path::is_absolute(path)) { + absolutePath = path; + + llvm::sys::path::remove_dots(absolutePath, true); + + return absolutePath; + } + std::error_code errorCode = llvm::sys::fs::real_path(path, absolutePath, true); - if (!errorCode && !llvm::sys::path::is_absolute(absolutePath)) + if (!errorCode) llvm::sys::fs::make_absolute(absolutePath); return absolutePath; diff --git a/tests/unit/unittest/builddependencycollector-test.cpp b/tests/unit/unittest/builddependencycollector-test.cpp index 2c698f735f8..4631a883766 100644 --- a/tests/unit/unittest/builddependencycollector-test.cpp +++ b/tests/unit/unittest/builddependencycollector-test.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -161,8 +162,9 @@ protected: Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory}; ClangBackEnd::RefactoringDatabaseInitializer databaseInitializer{database}; ClangBackEnd::FilePathCaching filePathCache{database}; - ClangBackEnd::BuildDependencyCollector collector{filePathCache}; - ClangBackEnd::BuildDependencyCollector emptyCollector{filePathCache}; + ClangBackEnd::GeneratedFiles generatedFiles; + ClangBackEnd::BuildDependencyCollector collector{filePathCache, generatedFiles}; + ClangBackEnd::BuildDependencyCollector emptyCollector{filePathCache, generatedFiles}; ClangBackEnd::FilePaths excludePaths = {TESTDATA_DIR "/builddependencycollector/project/main.cpp", TESTDATA_DIR "/builddependencycollector/project/main2.cpp", TESTDATA_DIR "/builddependencycollector/project/header1.h", @@ -527,10 +529,35 @@ TEST_F(BuildDependencyCollector, MissingInclude) SourceType::UserInclude))); } + +TEST_F(BuildDependencyCollector, GeneratedFile) +{ + generatedFiles.update( + {{TESTDATA_DIR "/builddependencycollector/project/generated_file.h", "#pragma once"}}); + emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/main6.cpp"), + {"cc", + "-I", + TESTDATA_DIR "/builddependencycollector/external", + "-I", + TESTDATA_DIR "/builddependencycollector/project", + "-isystem", + TESTDATA_DIR "/builddependencycollector/system"}); + emptyCollector.addUnsavedFiles(generatedFiles.fileContainers()); + + emptyCollector.collect(); + + ASSERT_THAT(emptyCollector.includeIds(), + ElementsAre( + HasInclude(id(TESTDATA_DIR "/builddependencycollector/project/generated_file.h"), + SourceType::UserInclude))); +} + TEST_F(BuildDependencyCollector, Create) { using ClangBackEnd::IncludeSearchPathType; - ClangBackEnd::BuildDependencyCollector collector{filePathCache}; + ClangBackEnd::BuildDependencyCollector collector{filePathCache, generatedFiles}; + generatedFiles.update( + {{TESTDATA_DIR "/builddependencycollector/project/generated_file.h", "#pragma once"}}); ClangBackEnd::ProjectPartContainer projectPart{ "project1", {}, @@ -570,9 +597,15 @@ TEST_F(BuildDependencyCollector, Create) fileStatus(TESTDATA_DIR "/builddependencycollector/external/external2.h"), fileStatus(TESTDATA_DIR "/builddependencycollector/system/system1.h"), fileStatus(TESTDATA_DIR "/builddependencycollector/system/indirect_system.h"), - fileStatus(TESTDATA_DIR "/builddependencycollector/system/indirect_system2.h"), + fileStatus(TESTDATA_DIR + "/builddependencycollector/system/indirect_system2.h"), fileStatus(TESTDATA_DIR "/builddependencycollector/project/missingfile.h"), - fileStatus(TESTDATA_DIR "/builddependencycollector/project/macros.h"))), + fileStatus(TESTDATA_DIR "/builddependencycollector/project/macros.h"), + ClangBackEnd::FileStatus( + id(TESTDATA_DIR "/builddependencycollector/project/generated_file.h"), + 12, + 0, + false))), Field(&BuildDependency::includes, UnorderedElementsAre( HasInclude(id(TESTDATA_DIR "/builddependencycollector/project/header1.h"), @@ -600,13 +633,14 @@ TEST_F(BuildDependencyCollector, Create) "/builddependencycollector/system/indirect_system2.h"), SourceType::SystemInclude), HasInclude(id(TESTDATA_DIR "/builddependencycollector/project/macros.h"), - SourceType::UserInclude))), + SourceType::UserInclude), + HasInclude(id(TESTDATA_DIR + "/builddependencycollector/project/generated_file.h"), + SourceType::TopProjectInclude))), Field(&BuildDependency::usedMacros, UnorderedElementsAre( - UsedMacro{"DEFINE", - id(TESTDATA_DIR "/builddependencycollector/project/macros.h")}, - UsedMacro{"IFDEF", - id(TESTDATA_DIR "/builddependencycollector/project/macros.h")}, + UsedMacro{"DEFINE", id(TESTDATA_DIR "/builddependencycollector/project/macros.h")}, + UsedMacro{"IFDEF", id(TESTDATA_DIR "/builddependencycollector/project/macros.h")}, UsedMacro{"DEFINED", id(TESTDATA_DIR "/builddependencycollector/project/macros.h")})), Field(&BuildDependency::sourceFiles, @@ -623,14 +657,17 @@ TEST_F(BuildDependencyCollector, Create) id(TESTDATA_DIR "/builddependencycollector/system/indirect_system.h"), id(TESTDATA_DIR "/builddependencycollector/system/indirect_system2.h"), id(TESTDATA_DIR "/builddependencycollector/project/missingfile.h"), - id(TESTDATA_DIR "/builddependencycollector/project/macros.h"))), + id(TESTDATA_DIR "/builddependencycollector/project/macros.h"), + id(TESTDATA_DIR "/builddependencycollector/project/generated_file.h"))), Field( &BuildDependency::sourceDependencies, UnorderedElementsAre( SourceDependency(id(TESTDATA_DIR "/builddependencycollector/project/main4.cpp"), - id(TESTDATA_DIR "/builddependencycollector/project/header1.h")), + id(TESTDATA_DIR + "/builddependencycollector/project/header1.h")), SourceDependency(id(TESTDATA_DIR "/builddependencycollector/project/main4.cpp"), - id(TESTDATA_DIR "/builddependencycollector/project/header2.h")), + id(TESTDATA_DIR + "/builddependencycollector/project/header2.h")), SourceDependency(id(TESTDATA_DIR "/builddependencycollector/project/main4.cpp"), id(TESTDATA_DIR "/builddependencycollector/project/missingfile.h")), @@ -644,34 +681,33 @@ TEST_F(BuildDependencyCollector, Create) id(TESTDATA_DIR "/builddependencycollector/system/system1.h")), SourceDependency(id(TESTDATA_DIR "/builddependencycollector/project/main4.cpp"), id(TESTDATA_DIR "/builddependencycollector/project/macros.h")), + SourceDependency(id(TESTDATA_DIR "/builddependencycollector/project/main4.cpp"), + id(TESTDATA_DIR + "/builddependencycollector/project/generated_file.h")), SourceDependency(id(TESTDATA_DIR "/builddependencycollector/project/header2.h"), id(TESTDATA_DIR "/builddependencycollector/external/external3.h")), - SourceDependency(id(TESTDATA_DIR - "/builddependencycollector/project/missingfile.h"), - id(TESTDATA_DIR - "/builddependencycollector/external/external1.h")), - SourceDependency(id(TESTDATA_DIR - "/builddependencycollector/external/external1.h"), - id(TESTDATA_DIR - "/builddependencycollector/external/indirect_external.h")), - SourceDependency(id(TESTDATA_DIR - "/builddependencycollector/external/indirect_external.h"), - id(TESTDATA_DIR - "/builddependencycollector/external/indirect_external2.h")), + SourceDependency( + id(TESTDATA_DIR "/builddependencycollector/project/missingfile.h"), + id(TESTDATA_DIR "/builddependencycollector/external/external1.h")), + SourceDependency( + id(TESTDATA_DIR "/builddependencycollector/external/external1.h"), + id(TESTDATA_DIR "/builddependencycollector/external/indirect_external.h")), + SourceDependency( + id(TESTDATA_DIR "/builddependencycollector/external/indirect_external.h"), + id(TESTDATA_DIR "/builddependencycollector/external/indirect_external2.h")), SourceDependency(id(TESTDATA_DIR "/builddependencycollector/system/system1.h"), id(TESTDATA_DIR "/builddependencycollector/system/indirect_system.h")), - SourceDependency(id(TESTDATA_DIR - "/builddependencycollector/system/indirect_system.h"), - id(TESTDATA_DIR - "/builddependencycollector/system/indirect_system2.h")))))); + SourceDependency( + id(TESTDATA_DIR "/builddependencycollector/system/indirect_system.h"), + id(TESTDATA_DIR "/builddependencycollector/system/indirect_system2.h")))))); } TEST_F(BuildDependencyCollector, Clear) { using ClangBackEnd::IncludeSearchPathType; - ClangBackEnd::BuildDependencyCollector collector{filePathCache}; + ClangBackEnd::BuildDependencyCollector collector{filePathCache, generatedFiles}; ClangBackEnd::ProjectPartContainer projectPart{ "project1", {}, diff --git a/tests/unit/unittest/data/builddependencycollector/project/main4.cpp b/tests/unit/unittest/data/builddependencycollector/project/main4.cpp index ff215f43d77..bb348e8a024 100644 --- a/tests/unit/unittest/data/builddependencycollector/project/main4.cpp +++ b/tests/unit/unittest/data/builddependencycollector/project/main4.cpp @@ -7,3 +7,4 @@ #include <../external/external2.h> #include #include "macros.h" +#include "generated_file.h" diff --git a/tests/unit/unittest/data/builddependencycollector/project/main6.cpp b/tests/unit/unittest/data/builddependencycollector/project/main6.cpp new file mode 100644 index 00000000000..9564e054262 --- /dev/null +++ b/tests/unit/unittest/data/builddependencycollector/project/main6.cpp @@ -0,0 +1,3 @@ +#include "generated_file.h" +#include "generated_file.h" +