PchManager: Use Generated Files in BuildDependencyCollector

Task-number: QTCREATORBUG-21843
Change-Id: I33c29d50943a914313a4c2e577b0210460f663d8
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Marco Bubke
2019-01-22 14:38:02 +01:00
parent b5f7e303ee
commit 693c896e5a
7 changed files with 88 additions and 34 deletions

View File

@@ -192,7 +192,7 @@ struct Data // because we have a cycle dependency
database}; database};
ClangBackEnd::PchTasksMerger pchTaskMerger{pchTaskQueue}; ClangBackEnd::PchTasksMerger pchTaskMerger{pchTaskQueue};
ClangBackEnd::BuildDependenciesStorage<> buildDependencyStorage{database}; ClangBackEnd::BuildDependenciesStorage<> buildDependencyStorage{database};
ClangBackEnd::BuildDependencyCollector buildDependencyCollector{filePathCache}; ClangBackEnd::BuildDependencyCollector buildDependencyCollector{filePathCache, generatedFiles};
std::function<TimeStamp(FilePathView filePath)> getModifiedTime{ std::function<TimeStamp(FilePathView filePath)> getModifiedTime{
[&](ClangBackEnd::FilePathView path) -> TimeStamp { [&](ClangBackEnd::FilePathView path) -> TimeStamp {
return QFileInfo(QString(path)).lastModified().toSecsSinceEpoch(); return QFileInfo(QString(path)).lastModified().toSecsSinceEpoch();

View File

@@ -55,6 +55,8 @@ BuildDependency BuildDependencyCollector::create(const ProjectPartContainer &pro
setExcludedFilePaths( setExcludedFilePaths(
m_filePathCache.filePaths(projectPart.headerPathIds + projectPart.sourcePathIds)); m_filePathCache.filePaths(projectPart.headerPathIds + projectPart.sourcePathIds));
addUnsavedFiles(m_generatedFiles.fileContainers());
collect(); collect();
auto buildDependency = std::move(m_buildDependency); auto buildDependency = std::move(m_buildDependency);

View File

@@ -28,6 +28,7 @@
#include "builddependencygeneratorinterface.h" #include "builddependencygeneratorinterface.h"
#include <clangtool.h> #include <clangtool.h>
#include <generatedfilesinterface.h>
#include <sourcesmanager.h> #include <sourcesmanager.h>
#include <filepathcachingfwd.h> #include <filepathcachingfwd.h>
@@ -37,8 +38,10 @@ namespace ClangBackEnd {
class BuildDependencyCollector : public BuildDependencyGeneratorInterface class BuildDependencyCollector : public BuildDependencyGeneratorInterface
{ {
public: public:
BuildDependencyCollector(const FilePathCachingInterface &filePathCache) BuildDependencyCollector(const FilePathCachingInterface &filePathCache,
: m_filePathCache(filePathCache) const GeneratedFilesInterface &generatedFiles)
: m_filePathCache(filePathCache)
, m_generatedFiles(generatedFiles)
{ {
} }
@@ -92,6 +95,7 @@ private:
Utils::SmallStringVector m_directories; Utils::SmallStringVector m_directories;
SourcesManager m_sourcesManager; SourcesManager m_sourcesManager;
const FilePathCachingInterface &m_filePathCache; const FilePathCachingInterface &m_filePathCache;
const GeneratedFilesInterface &m_generatedFiles;
}; };
} // namespace ClangBackEnd } // namespace ClangBackEnd

View File

@@ -44,9 +44,17 @@ llvm::SmallString<256> absolutePath(clang::StringRef path)
{ {
llvm::SmallString<256> absolutePath; 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); 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); llvm::sys::fs::make_absolute(absolutePath);
return absolutePath; return absolutePath;

View File

@@ -27,6 +27,7 @@
#include <refactoringdatabaseinitializer.h> #include <refactoringdatabaseinitializer.h>
#include <filepathcaching.h> #include <filepathcaching.h>
#include <generatedfiles.h>
#include <builddependencycollector.h> #include <builddependencycollector.h>
#include <sqlitedatabase.h> #include <sqlitedatabase.h>
@@ -161,8 +162,9 @@ protected:
Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory}; Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory};
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database}; ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
ClangBackEnd::FilePathCaching filePathCache{database}; ClangBackEnd::FilePathCaching filePathCache{database};
ClangBackEnd::BuildDependencyCollector collector{filePathCache}; ClangBackEnd::GeneratedFiles generatedFiles;
ClangBackEnd::BuildDependencyCollector emptyCollector{filePathCache}; ClangBackEnd::BuildDependencyCollector collector{filePathCache, generatedFiles};
ClangBackEnd::BuildDependencyCollector emptyCollector{filePathCache, generatedFiles};
ClangBackEnd::FilePaths excludePaths = {TESTDATA_DIR "/builddependencycollector/project/main.cpp", ClangBackEnd::FilePaths excludePaths = {TESTDATA_DIR "/builddependencycollector/project/main.cpp",
TESTDATA_DIR "/builddependencycollector/project/main2.cpp", TESTDATA_DIR "/builddependencycollector/project/main2.cpp",
TESTDATA_DIR "/builddependencycollector/project/header1.h", TESTDATA_DIR "/builddependencycollector/project/header1.h",
@@ -527,10 +529,35 @@ TEST_F(BuildDependencyCollector, MissingInclude)
SourceType::UserInclude))); 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) TEST_F(BuildDependencyCollector, Create)
{ {
using ClangBackEnd::IncludeSearchPathType; 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{ ClangBackEnd::ProjectPartContainer projectPart{
"project1", "project1",
{}, {},
@@ -570,9 +597,15 @@ TEST_F(BuildDependencyCollector, Create)
fileStatus(TESTDATA_DIR "/builddependencycollector/external/external2.h"), fileStatus(TESTDATA_DIR "/builddependencycollector/external/external2.h"),
fileStatus(TESTDATA_DIR "/builddependencycollector/system/system1.h"), fileStatus(TESTDATA_DIR "/builddependencycollector/system/system1.h"),
fileStatus(TESTDATA_DIR "/builddependencycollector/system/indirect_system.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/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, Field(&BuildDependency::includes,
UnorderedElementsAre( UnorderedElementsAre(
HasInclude(id(TESTDATA_DIR "/builddependencycollector/project/header1.h"), HasInclude(id(TESTDATA_DIR "/builddependencycollector/project/header1.h"),
@@ -600,13 +633,14 @@ TEST_F(BuildDependencyCollector, Create)
"/builddependencycollector/system/indirect_system2.h"), "/builddependencycollector/system/indirect_system2.h"),
SourceType::SystemInclude), SourceType::SystemInclude),
HasInclude(id(TESTDATA_DIR "/builddependencycollector/project/macros.h"), 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, Field(&BuildDependency::usedMacros,
UnorderedElementsAre( UnorderedElementsAre(
UsedMacro{"DEFINE", UsedMacro{"DEFINE", id(TESTDATA_DIR "/builddependencycollector/project/macros.h")},
id(TESTDATA_DIR "/builddependencycollector/project/macros.h")}, UsedMacro{"IFDEF", id(TESTDATA_DIR "/builddependencycollector/project/macros.h")},
UsedMacro{"IFDEF",
id(TESTDATA_DIR "/builddependencycollector/project/macros.h")},
UsedMacro{"DEFINED", UsedMacro{"DEFINED",
id(TESTDATA_DIR "/builddependencycollector/project/macros.h")})), id(TESTDATA_DIR "/builddependencycollector/project/macros.h")})),
Field(&BuildDependency::sourceFiles, 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_system.h"),
id(TESTDATA_DIR "/builddependencycollector/system/indirect_system2.h"), id(TESTDATA_DIR "/builddependencycollector/system/indirect_system2.h"),
id(TESTDATA_DIR "/builddependencycollector/project/missingfile.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( Field(
&BuildDependency::sourceDependencies, &BuildDependency::sourceDependencies,
UnorderedElementsAre( UnorderedElementsAre(
SourceDependency(id(TESTDATA_DIR "/builddependencycollector/project/main4.cpp"), 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"), 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"), SourceDependency(id(TESTDATA_DIR "/builddependencycollector/project/main4.cpp"),
id(TESTDATA_DIR id(TESTDATA_DIR
"/builddependencycollector/project/missingfile.h")), "/builddependencycollector/project/missingfile.h")),
@@ -644,34 +681,33 @@ TEST_F(BuildDependencyCollector, Create)
id(TESTDATA_DIR "/builddependencycollector/system/system1.h")), id(TESTDATA_DIR "/builddependencycollector/system/system1.h")),
SourceDependency(id(TESTDATA_DIR "/builddependencycollector/project/main4.cpp"), SourceDependency(id(TESTDATA_DIR "/builddependencycollector/project/main4.cpp"),
id(TESTDATA_DIR "/builddependencycollector/project/macros.h")), 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"), SourceDependency(id(TESTDATA_DIR "/builddependencycollector/project/header2.h"),
id(TESTDATA_DIR id(TESTDATA_DIR
"/builddependencycollector/external/external3.h")), "/builddependencycollector/external/external3.h")),
SourceDependency(id(TESTDATA_DIR SourceDependency(
"/builddependencycollector/project/missingfile.h"), id(TESTDATA_DIR "/builddependencycollector/project/missingfile.h"),
id(TESTDATA_DIR id(TESTDATA_DIR "/builddependencycollector/external/external1.h")),
"/builddependencycollector/external/external1.h")), SourceDependency(
SourceDependency(id(TESTDATA_DIR id(TESTDATA_DIR "/builddependencycollector/external/external1.h"),
"/builddependencycollector/external/external1.h"), id(TESTDATA_DIR "/builddependencycollector/external/indirect_external.h")),
id(TESTDATA_DIR SourceDependency(
"/builddependencycollector/external/indirect_external.h")), id(TESTDATA_DIR "/builddependencycollector/external/indirect_external.h"),
SourceDependency(id(TESTDATA_DIR id(TESTDATA_DIR "/builddependencycollector/external/indirect_external2.h")),
"/builddependencycollector/external/indirect_external.h"),
id(TESTDATA_DIR
"/builddependencycollector/external/indirect_external2.h")),
SourceDependency(id(TESTDATA_DIR "/builddependencycollector/system/system1.h"), SourceDependency(id(TESTDATA_DIR "/builddependencycollector/system/system1.h"),
id(TESTDATA_DIR id(TESTDATA_DIR
"/builddependencycollector/system/indirect_system.h")), "/builddependencycollector/system/indirect_system.h")),
SourceDependency(id(TESTDATA_DIR SourceDependency(
"/builddependencycollector/system/indirect_system.h"), id(TESTDATA_DIR "/builddependencycollector/system/indirect_system.h"),
id(TESTDATA_DIR id(TESTDATA_DIR "/builddependencycollector/system/indirect_system2.h"))))));
"/builddependencycollector/system/indirect_system2.h"))))));
} }
TEST_F(BuildDependencyCollector, Clear) TEST_F(BuildDependencyCollector, Clear)
{ {
using ClangBackEnd::IncludeSearchPathType; using ClangBackEnd::IncludeSearchPathType;
ClangBackEnd::BuildDependencyCollector collector{filePathCache}; ClangBackEnd::BuildDependencyCollector collector{filePathCache, generatedFiles};
ClangBackEnd::ProjectPartContainer projectPart{ ClangBackEnd::ProjectPartContainer projectPart{
"project1", "project1",
{}, {},

View File

@@ -7,3 +7,4 @@
#include <../external/external2.h> #include <../external/external2.h>
#include <system1.h> #include <system1.h>
#include "macros.h" #include "macros.h"
#include "generated_file.h"

View File

@@ -0,0 +1,3 @@
#include "generated_file.h"
#include "generated_file.h"