ui: Added compilation database loading via project wizzard
This commit is contained in:
@@ -31,19 +31,11 @@ std::vector<std::string> SolutionParserCompilationDatabase::getProjectItems()
|
|||||||
|
|
||||||
std::vector<std::string> SolutionParserCompilationDatabase::getIncludePaths()
|
std::vector<std::string> SolutionParserCompilationDatabase::getIncludePaths()
|
||||||
{
|
{
|
||||||
if(m_searchPaths.empty())
|
|
||||||
{
|
|
||||||
parseDatabase();
|
|
||||||
}
|
|
||||||
return m_searchPaths;
|
return m_searchPaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> SolutionParserCompilationDatabase::getFrameworkPaths()
|
std::vector<std::string> SolutionParserCompilationDatabase::getFrameworkPaths()
|
||||||
{
|
{
|
||||||
if(m_searchPaths.empty())
|
|
||||||
{
|
|
||||||
parseDatabase();
|
|
||||||
}
|
|
||||||
return m_frameworkPaths;
|
return m_frameworkPaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,6 +81,11 @@ void SolutionParserCompilationDatabase::parseDatabase()
|
|||||||
{
|
{
|
||||||
m_searchPaths.push_back(p);
|
m_searchPaths.push_back(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(std::string p : frameworkPaths)
|
||||||
|
{
|
||||||
|
m_frameworkPaths.push_back(p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -28,14 +28,16 @@ public:
|
|||||||
virtual std::vector<std::string> getIncludePaths();
|
virtual std::vector<std::string> getIncludePaths();
|
||||||
std::vector<std::string> getFrameworkPaths();
|
std::vector<std::string> getFrameworkPaths();
|
||||||
|
|
||||||
|
void parseDatabase();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<clang::tooling::JSONCompilationDatabase> m_database;
|
|
||||||
void parseDatabase();
|
|
||||||
bool m_parsed;
|
|
||||||
clang::tooling::JSONCompilationDatabase* getDatabase();
|
clang::tooling::JSONCompilationDatabase* getDatabase();
|
||||||
std::vector<std::string> m_searchPaths;
|
|
||||||
std::vector<std::string> m_frameworkPaths;
|
|
||||||
std::string getIncludePath(const std::string& argument, const std::string& dir);
|
std::string getIncludePath(const std::string& argument, const std::string& dir);
|
||||||
|
|
||||||
|
std::shared_ptr<clang::tooling::JSONCompilationDatabase> m_database;
|
||||||
|
|
||||||
|
std::vector<std::string> m_searchPaths;
|
||||||
|
std::vector<std::string> m_frameworkPaths;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
#include "qt/window/project_wizzard/QtProjectWizzardContentSummary.h"
|
#include "qt/window/project_wizzard/QtProjectWizzardContentSummary.h"
|
||||||
#include "qt/window/project_wizzard/QtProjectWizzardWindow.h"
|
#include "qt/window/project_wizzard/QtProjectWizzardWindow.h"
|
||||||
#include "utility/messaging/type/MessageLoadProject.h"
|
#include "utility/messaging/type/MessageLoadProject.h"
|
||||||
|
#include "utility/solution/SolutionParserCompilationDatabase.h"
|
||||||
#include "utility/solution/SolutionParserVisualStudio.h"
|
#include "utility/solution/SolutionParserVisualStudio.h"
|
||||||
|
|
||||||
QtProjectWizzard::QtProjectWizzard(QWidget* parent)
|
QtProjectWizzard::QtProjectWizzard(QWidget* parent)
|
||||||
@@ -91,6 +92,38 @@ void QtProjectWizzard::refreshProjectFromVisualStudioSolution(const std::string&
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QtProjectWizzard::newProjectFromCompilationDatabase(const std::string& compilationDatabasePath)
|
||||||
|
{
|
||||||
|
m_settings = getSettingsForCompilationDatabase(compilationDatabasePath);
|
||||||
|
|
||||||
|
QtProjectWizzardWindow* window = createWindowWithContent<QtProjectWizzardContentPathsCDBSource>();
|
||||||
|
connect(window, SIGNAL(next()), this, SLOT(showSummary()));
|
||||||
|
|
||||||
|
connect(dynamic_cast<QtProjectWizzardContentPathsCDBSource*>(window->content()),
|
||||||
|
SIGNAL(showSourceFiles()), this, SLOT(showSourceFiles()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtProjectWizzard::refreshProjectFromCompilationDatabase(const std::string& compilationDatabasePath)
|
||||||
|
{
|
||||||
|
QtProjectWizzardWindow* window = dynamic_cast<QtProjectWizzardWindow*>(m_windowStack.getTopWindow());
|
||||||
|
if (window)
|
||||||
|
{
|
||||||
|
window->content()->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
ProjectSettings settings = getSettingsForCompilationDatabase(compilationDatabasePath);
|
||||||
|
|
||||||
|
m_settings.setSourcePaths(settings.getSourcePaths());
|
||||||
|
m_settings.setHeaderSearchPaths(settings.getHeaderSearchPaths());
|
||||||
|
m_settings.setFrameworkSearchPaths(settings.getFrameworkSearchPaths());
|
||||||
|
m_settings.setCompilationDatabasePath(FilePath(compilationDatabasePath));
|
||||||
|
|
||||||
|
if (window)
|
||||||
|
{
|
||||||
|
window->content()->load();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QtProjectWizzard::editProject(const ProjectSettings& settings)
|
void QtProjectWizzard::editProject(const ProjectSettings& settings)
|
||||||
{
|
{
|
||||||
m_settings = settings;
|
m_settings = settings;
|
||||||
@@ -194,6 +227,45 @@ ProjectSettings QtProjectWizzard::getSettingsForVisualStudioSolution(const std::
|
|||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ProjectSettings QtProjectWizzard::getSettingsForCompilationDatabase(const std::string& compilationDatabasePath) const
|
||||||
|
{
|
||||||
|
SolutionParserCompilationDatabase parser;
|
||||||
|
parser.openSolutionFile(compilationDatabasePath);
|
||||||
|
parser.parseDatabase();
|
||||||
|
|
||||||
|
ProjectSettings settings;
|
||||||
|
settings.setProjectName(parser.getSolutionName());
|
||||||
|
settings.setProjectFileLocation(parser.getSolutionPath());
|
||||||
|
settings.setCompilationDatabasePath(FilePath(compilationDatabasePath));
|
||||||
|
|
||||||
|
std::vector<std::string> sourceFiles = parser.getProjectItems();
|
||||||
|
std::vector<FilePath> sourcePaths;
|
||||||
|
for (const std::string& p : sourceFiles)
|
||||||
|
{
|
||||||
|
sourcePaths.push_back(FilePath(p));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> includePaths = parser.getIncludePaths();
|
||||||
|
std::vector<FilePath> headerPaths;
|
||||||
|
for (const std::string& p : includePaths)
|
||||||
|
{
|
||||||
|
headerPaths.push_back(FilePath(p));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> frameworkPaths = parser.getFrameworkPaths();
|
||||||
|
std::vector<FilePath> frameworkSearchPaths;
|
||||||
|
for (const std::string& p : frameworkPaths)
|
||||||
|
{
|
||||||
|
frameworkSearchPaths.push_back(FilePath(p));
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.setSourcePaths(sourcePaths);
|
||||||
|
settings.setHeaderSearchPaths(headerPaths);
|
||||||
|
settings.setFrameworkSearchPaths(frameworkSearchPaths);
|
||||||
|
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
|
||||||
void QtProjectWizzard::cancelWizzard()
|
void QtProjectWizzard::cancelWizzard()
|
||||||
{
|
{
|
||||||
m_windowStack.clearWindows();
|
m_windowStack.clearWindows();
|
||||||
@@ -242,9 +314,17 @@ void QtProjectWizzard::selectedProjectType(QtProjectWizzardContentSelect::Projec
|
|||||||
}
|
}
|
||||||
|
|
||||||
case QtProjectWizzardContentSelect::PROJECT_CDB:
|
case QtProjectWizzardContentSelect::PROJECT_CDB:
|
||||||
QMessageBox msgBox;
|
{
|
||||||
msgBox.setText("Project type not implemented yet!");
|
QString fileName = QFileDialog::getOpenFileName(
|
||||||
msgBox.exec();
|
this, tr("Open JSON Compilation Database"), "", "JSON Compilation Database (*.json)"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!fileName.isNull())
|
||||||
|
{
|
||||||
|
newProjectFromCompilationDatabase(fileName.toStdString());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -344,6 +424,10 @@ void QtProjectWizzard::showSummary()
|
|||||||
SIGNAL(refreshVisualStudioSolution(const std::string&)),
|
SIGNAL(refreshVisualStudioSolution(const std::string&)),
|
||||||
this, SLOT(refreshProjectFromVisualStudioSolution(const std::string&)));
|
this, SLOT(refreshProjectFromVisualStudioSolution(const std::string&)));
|
||||||
|
|
||||||
|
connect(dynamic_cast<QtProjectWizzardContentBuildFile*>(summary->contentBuildFile()),
|
||||||
|
SIGNAL(refreshCompilationDatabase(const std::string&)),
|
||||||
|
this, SLOT(refreshProjectFromCompilationDatabase(const std::string&)));
|
||||||
|
|
||||||
connect(dynamic_cast<QtProjectWizzardContentPathsSource*>(summary->contentPathsSource()),
|
connect(dynamic_cast<QtProjectWizzardContentPathsSource*>(summary->contentPathsSource()),
|
||||||
SIGNAL(showSourceFiles()), this, SLOT(showSourceFiles()));
|
SIGNAL(showSourceFiles()), this, SLOT(showSourceFiles()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ public slots:
|
|||||||
void newProject();
|
void newProject();
|
||||||
void newProjectFromVisualStudioSolution(const std::string& visualStudioSolutionPath);
|
void newProjectFromVisualStudioSolution(const std::string& visualStudioSolutionPath);
|
||||||
void refreshProjectFromVisualStudioSolution(const std::string& visualStudioSolutionPath);
|
void refreshProjectFromVisualStudioSolution(const std::string& visualStudioSolutionPath);
|
||||||
|
void newProjectFromCompilationDatabase(const std::string& compilationDatabasePath);
|
||||||
|
void refreshProjectFromCompilationDatabase(const std::string& compilationDatabasePath);
|
||||||
void editProject(const ProjectSettings& settings);
|
void editProject(const ProjectSettings& settings);
|
||||||
void showPreferences();
|
void showPreferences();
|
||||||
|
|
||||||
@@ -39,6 +41,7 @@ private:
|
|||||||
QtProjectWizzardWindow* createPopupWithContent();
|
QtProjectWizzardWindow* createPopupWithContent();
|
||||||
|
|
||||||
ProjectSettings getSettingsForVisualStudioSolution(const std::string& visualStudioSolutionPath) const;
|
ProjectSettings getSettingsForVisualStudioSolution(const std::string& visualStudioSolutionPath) const;
|
||||||
|
ProjectSettings getSettingsForCompilationDatabase(const std::string& compilationDatabasePath) const;
|
||||||
|
|
||||||
QtWindowStack m_windowStack;
|
QtWindowStack m_windowStack;
|
||||||
std::shared_ptr<QtProjectWizzardWindow> m_popup;
|
std::shared_ptr<QtProjectWizzardWindow> m_popup;
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ void QtProjectWizzardContentBuildFile::populateForm(QGridLayout* layout, int& ro
|
|||||||
break;
|
break;
|
||||||
case QtProjectWizzardContentSelect::PROJECT_CDB:
|
case QtProjectWizzardContentSelect::PROJECT_CDB:
|
||||||
name = "Compilation Database";
|
name = "Compilation Database";
|
||||||
|
filter = "JSON Compilation Database (*.json)";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,6 +108,7 @@ void QtProjectWizzardContentBuildFile::refreshClicked()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QtProjectWizzardContentSelect::PROJECT_CDB:
|
case QtProjectWizzardContentSelect::PROJECT_CDB:
|
||||||
|
emit refreshCompilationDatabase(path.str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class QtProjectWizzardContentBuildFile
|
|||||||
|
|
||||||
signals:
|
signals:
|
||||||
void refreshVisualStudioSolution(const std::string&);
|
void refreshVisualStudioSolution(const std::string&);
|
||||||
|
void refreshCompilationDatabase(const std::string&);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QtProjectWizzardContentBuildFile(ProjectSettings* settings, QtProjectWizzardWindow* window);
|
QtProjectWizzardContentBuildFile(ProjectSettings* settings, QtProjectWizzardWindow* window);
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
#include "qt/element/QtDirectoryListBox.h"
|
#include "qt/element/QtDirectoryListBox.h"
|
||||||
#include "settings/ApplicationSettings.h"
|
#include "settings/ApplicationSettings.h"
|
||||||
|
#include "utility/file/FileSystem.h"
|
||||||
|
#include "utility/utility.h"
|
||||||
|
|
||||||
|
|
||||||
QtProjectWizzardContentPaths::QtProjectWizzardContentPaths(ProjectSettings* settings, QtProjectWizzardWindow* window)
|
QtProjectWizzardContentPaths::QtProjectWizzardContentPaths(ProjectSettings* settings, QtProjectWizzardWindow* window)
|
||||||
@@ -106,7 +108,12 @@ void QtProjectWizzardContentPaths::save()
|
|||||||
|
|
||||||
if (m_subPaths)
|
if (m_subPaths)
|
||||||
{
|
{
|
||||||
return m_subPaths->savePaths();
|
m_subPaths->savePaths();
|
||||||
|
|
||||||
|
if (dynamic_cast<QtProjectWizzardContentPathsCDBHeaders*>(m_subPaths))
|
||||||
|
{
|
||||||
|
loadPaths();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,6 +245,75 @@ QtProjectWizzardContentPathsSourceSimple::QtProjectWizzardContentPathsSourceSimp
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QtProjectWizzardContentPathsCDBSource::QtProjectWizzardContentPathsCDBSource(
|
||||||
|
ProjectSettings* settings, QtProjectWizzardWindow* window
|
||||||
|
)
|
||||||
|
: QtProjectWizzardContentPaths(settings, window)
|
||||||
|
{
|
||||||
|
m_addShowSourcesButton = true;
|
||||||
|
|
||||||
|
setInfo(
|
||||||
|
"Compilation Database Files",
|
||||||
|
"These files were found within the provided compilation database. You can add or remove files here.",
|
||||||
|
""
|
||||||
|
);
|
||||||
|
|
||||||
|
m_subPaths = new QtProjectWizzardContentPathsCDBHeaders(settings, window);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtProjectWizzardContentPathsCDBSource::loadPaths()
|
||||||
|
{
|
||||||
|
m_list->setList(m_settings->getSourcePaths());
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtProjectWizzardContentPathsCDBSource::savePaths()
|
||||||
|
{
|
||||||
|
m_settings->setSourcePaths(m_list->getList());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QtProjectWizzardContentPathsCDBSource::isScrollAble() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QtProjectWizzardContentPathsCDBHeaders::QtProjectWizzardContentPathsCDBHeaders(
|
||||||
|
ProjectSettings* settings, QtProjectWizzardWindow* window
|
||||||
|
)
|
||||||
|
: QtProjectWizzardContentPaths(settings, window)
|
||||||
|
{
|
||||||
|
setTitleString("Header Files");
|
||||||
|
setDescriptionString(
|
||||||
|
"Coati works best if you analyze both your source and header files, but the Compilation Database only contains "
|
||||||
|
"source files. Add the header files, or the directories containing them here. They will be added to the source "
|
||||||
|
"files above"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtProjectWizzardContentPathsCDBHeaders::loadPaths()
|
||||||
|
{
|
||||||
|
m_list->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtProjectWizzardContentPathsCDBHeaders::savePaths()
|
||||||
|
{
|
||||||
|
std::vector<FilePath> headerPaths = m_list->getList();
|
||||||
|
std::vector<std::string> extensions = m_settings->getHeaderExtensions();
|
||||||
|
std::vector<FileInfo> fileInfos = FileSystem::getFileInfosFromPaths(headerPaths, extensions);
|
||||||
|
|
||||||
|
headerPaths.clear();
|
||||||
|
for (const FileInfo& info : fileInfos)
|
||||||
|
{
|
||||||
|
headerPaths.push_back(info.path);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<FilePath> sourcePaths = m_settings->getSourcePaths();
|
||||||
|
utility::append(sourcePaths, headerPaths);
|
||||||
|
m_settings->setSourcePaths(sourcePaths);
|
||||||
|
|
||||||
|
m_list->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QtProjectWizzardContentPathsHeaderSearch::QtProjectWizzardContentPathsHeaderSearch(
|
QtProjectWizzardContentPathsHeaderSearch::QtProjectWizzardContentPathsHeaderSearch(
|
||||||
ProjectSettings* settings, QtProjectWizzardWindow* window
|
ProjectSettings* settings, QtProjectWizzardWindow* window
|
||||||
)
|
)
|
||||||
@@ -289,7 +365,7 @@ QtProjectWizzardContentPathsHeaderSearchGlobal::QtProjectWizzardContentPathsHead
|
|||||||
setInfo(
|
setInfo(
|
||||||
"Global Header Search Paths",
|
"Global Header Search Paths",
|
||||||
"These header search paths will be used in all your projects. Use it to add system header and Standard Library "
|
"These header search paths will be used in all your projects. Use it to add system header and Standard Library "
|
||||||
"header paths (See <a href=\"https://staging.coati.io/documentation/#FindingSystemHeaderLocations\">Finding "
|
"header paths (See <a href=\"https://coati.io/documentation/#FindingSystemHeaderLocations\">Finding "
|
||||||
"System Header Locations</a>).",
|
"System Header Locations</a>).",
|
||||||
"Header Search Paths define where additional headers, that your project depends on, are found. Usually they are "
|
"Header Search Paths define where additional headers, that your project depends on, are found. Usually they are "
|
||||||
"header files of frameworks or libraries that your project uses. These files won't be analyzed, but Coati needs "
|
"header files of frameworks or libraries that your project uses. These files won't be analyzed, but Coati needs "
|
||||||
@@ -347,7 +423,7 @@ QtProjectWizzardContentPathsFrameworkSearchGlobal::QtProjectWizzardContentPathsF
|
|||||||
setInfo(
|
setInfo(
|
||||||
"Global Framework Search Paths",
|
"Global Framework Search Paths",
|
||||||
"These framework search paths will be used in all your projects. Use it to add system frameworks "
|
"These framework search paths will be used in all your projects. Use it to add system frameworks "
|
||||||
"(See <a href=\"https://staging.coati.io/documentation/#FindingSystemHeaderLocations\">"
|
"(See <a href=\"https://coati.io/documentation/#FindingSystemHeaderLocations\">"
|
||||||
"Finding System Header Locations</a>).",
|
"Finding System Header Locations</a>).",
|
||||||
"Framework Search Paths define where MacOS framework containers (.framework), that your project depends on, are "
|
"Framework Search Paths define where MacOS framework containers (.framework), that your project depends on, are "
|
||||||
"found.\n\n"
|
"found.\n\n"
|
||||||
|
|||||||
@@ -80,6 +80,31 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class QtProjectWizzardContentPathsCDBSource
|
||||||
|
: public QtProjectWizzardContentPaths
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QtProjectWizzardContentPathsCDBSource(ProjectSettings* settings, QtProjectWizzardWindow* window);
|
||||||
|
|
||||||
|
// QtProjectWizzardContentPaths implementation
|
||||||
|
virtual void loadPaths() override;
|
||||||
|
virtual void savePaths() override;
|
||||||
|
|
||||||
|
virtual bool isScrollAble() const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class QtProjectWizzardContentPathsCDBHeaders
|
||||||
|
: public QtProjectWizzardContentPaths
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QtProjectWizzardContentPathsCDBHeaders(ProjectSettings* settings, QtProjectWizzardWindow* window);
|
||||||
|
|
||||||
|
// QtProjectWizzardContentPaths implementation
|
||||||
|
virtual void loadPaths() override;
|
||||||
|
virtual void savePaths() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class QtProjectWizzardContentPathsHeaderSearch
|
class QtProjectWizzardContentPathsHeaderSearch
|
||||||
: public QtProjectWizzardContentPaths
|
: public QtProjectWizzardContentPaths
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user