forked from qt-creator/qt-creator
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:
@@ -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();
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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",
|
||||||
{},
|
{},
|
||||||
|
@@ -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"
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
#include "generated_file.h"
|
||||||
|
#include "generated_file.h"
|
||||||
|
|
Reference in New Issue
Block a user