GenericProject: Support forwarding flags to clang code model

...in order to specify e.g. the language version to use.

Create the additional files project.cxxflags and project.cflags. These
are expected to contain command line flags for the clang code model on
one single line.

For example, "-std=c++11" can be provided to set the language version
for parsing.

Fixes: QTCREATORBUG-19668
Change-Id: I7712f546ba1fae536c32adfa5bd449c5b3484521
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Nikolai Kosjar
2019-01-11 14:10:09 +01:00
parent a1ae5820af
commit 62c8aecb5f
6 changed files with 79 additions and 0 deletions

View File

@@ -45,6 +45,18 @@
\" <glob pattern=\'*.config\'/>\",
\" </mime-type>\",
\" <mime-type type=\'application/vnd.qtcreator.generic.cxxflags\'>\",
\" <sub-class-of type=\'text/plain\'/>\",
\" <comment>Generic Project CXXFLAGS File</comment>\",
\" <glob pattern=\'*.cxxflags\'/>\",
\" </mime-type>\",
\" <mime-type type=\'application/vnd.qtcreator.generic.cflags\'>\",
\" <sub-class-of type=\'text/plain\'/>\",
\" <comment>Generic Project CFLAGS File</comment>\",
\" <glob pattern=\'*.cflags\'/>\",
\" </mime-type>\",
\"</mime-info>\"
]
}

View File

@@ -58,6 +58,7 @@
#include <utils/filesystemwatcher.h>
#include <utils/fileutils.h>
#include <utils/qtcassert.h>
#include <utils/qtcprocess.h>
#include <QDir>
#include <QFileInfo>
@@ -165,6 +166,12 @@ private:
//
////////////////////////////////////////////////////////////////////////////////////
static bool writeFile(const QString &filePath, const QString &contents)
{
Utils::FileSaver saver(filePath, QIODevice::Text | QIODevice::WriteOnly);
return saver.write(contents.toUtf8()) && saver.finalize();
}
GenericProject::GenericProject(const Utils::FileName &fileName) :
Project(Constants::GENERICMIMETYPE, fileName, [this]() { refresh(Everything); }),
m_cppCodeModelUpdater(new CppTools::CppProjectUpdater),
@@ -183,6 +190,18 @@ GenericProject::GenericProject(const Utils::FileName &fileName) :
m_includesFileName = QFileInfo(dir, projectName + ".includes").absoluteFilePath();
m_configFileName = QFileInfo(dir, projectName + ".config").absoluteFilePath();
const QFileInfo cxxflagsFileInfo(dir, projectName + ".cxxflags");
m_cxxflagsFileName = cxxflagsFileInfo.absoluteFilePath();
if (!cxxflagsFileInfo.exists()) {
QTC_CHECK(writeFile(m_cxxflagsFileName, Constants::GENERICPROJECT_CXXFLAGS_FILE_TEMPLATE));
}
const QFileInfo cflagsFileInfo(dir, projectName + ".cflags");
m_cflagsFileName = cflagsFileInfo.absoluteFilePath();
if (!cflagsFileInfo.exists()) {
QTC_CHECK(writeFile(m_cflagsFileName, Constants::GENERICPROJECT_CFLAGS_FILE_TEMPLATE));
}
m_filesIDocument
= new ProjectDocument(Constants::GENERICMIMETYPE, FileName::fromString(m_filesFileName),
[this]() { refresh(Files); });
@@ -192,6 +211,13 @@ GenericProject::GenericProject(const Utils::FileName &fileName) :
m_configIDocument
= new ProjectDocument(Constants::GENERICMIMETYPE, FileName::fromString(m_configFileName),
[this]() { refresh(Configuration); });
m_cxxFlagsIDocument
= new ProjectDocument(Constants::GENERICMIMETYPE, FileName::fromString(m_cxxflagsFileName),
[this]() { refresh(Configuration); });
m_cFlagsIDocument
= new ProjectDocument(Constants::GENERICMIMETYPE, FileName::fromString(m_cflagsFileName),
[this]() { refresh(Configuration); });
connect(m_deployFileWatcher, &FileSystemWatcher::fileChanged,
this, &GenericProject::updateDeploymentData);
}
@@ -326,6 +352,14 @@ bool GenericProject::renameFile(const QString &filePath, const QString &newFileP
return saveRawFileList(newList);
}
static QStringList readFlags(const QString &filePath)
{
const QStringList lines = readLines(filePath);
if (lines.isEmpty())
return QStringList();
return QtcProcess::splitArgs(lines.first());
}
void GenericProject::parseProject(RefreshOptions options)
{
if (options & Files) {
@@ -337,6 +371,8 @@ void GenericProject::parseProject(RefreshOptions options)
if (options & Configuration) {
m_rawProjectIncludePaths = readLines(m_includesFileName);
m_projectIncludePaths = processEntries(m_rawProjectIncludePaths);
m_cxxflags = readFlags(m_cxxflagsFileName);
m_cflags = readFlags(m_cflagsFileName);
// TODO: Possibly load some configuration from the project file
//QSettings projectInfo(m_fileName, QSettings::IniFormat);
@@ -368,6 +404,12 @@ void GenericProject::refresh(RefreshOptions options)
newRoot->addNestedNode(std::make_unique<FileNode>(FileName::fromString(m_configFileName),
FileType::Project,
/* generated = */ false));
newRoot->addNestedNode(std::make_unique<FileNode>(FileName::fromString(m_cxxflagsFileName),
FileType::Project,
/* generated = */ false));
newRoot->addNestedNode(std::make_unique<FileNode>(FileName::fromString(m_cflagsFileName),
FileType::Project,
/* generated = */ false));
setRootProjectNode(std::move(newRoot));
}
@@ -436,6 +478,8 @@ void GenericProject::refreshCppCodeModel()
rpp.setQtVersion(kitInfo.projectPartQtVersion);
rpp.setIncludePaths(m_projectIncludePaths);
rpp.setConfigFileName(m_configFileName);
rpp.setFlagsForCxx({nullptr, m_cxxflags});
rpp.setFlagsForC({nullptr, m_cflags});
rpp.setFiles(m_files);
m_cppCodeModelUpdater->update({this, kitInfo, {rpp}});

View File

@@ -72,14 +72,20 @@ private:
QString m_filesFileName;
QString m_includesFileName;
QString m_configFileName;
QString m_cxxflagsFileName;
QString m_cflagsFileName;
ProjectExplorer::ProjectDocument *m_filesIDocument;
ProjectExplorer::ProjectDocument *m_includesIDocument;
ProjectExplorer::ProjectDocument *m_configIDocument;
ProjectExplorer::ProjectDocument *m_cxxFlagsIDocument;
ProjectExplorer::ProjectDocument *m_cFlagsIDocument;
QStringList m_rawFileList;
QStringList m_files;
QHash<QString, QString> m_rawListEntries;
QStringList m_rawProjectIncludePaths;
QStringList m_projectIncludePaths;
QStringList m_cxxflags;
QStringList m_cflags;
CppTools::CppProjectUpdater *m_cppCodeModelUpdater = nullptr;

View File

@@ -36,5 +36,9 @@ const char FILES_EDITOR_ID[] = "QT4.FilesEditor";
// Project
const char GENERICPROJECT_ID[] = "GenericProjectManager.GenericProject";
// File Templates
const char GENERICPROJECT_CXXFLAGS_FILE_TEMPLATE[] = "-std=c++17";
const char GENERICPROJECT_CFLAGS_FILE_TEMPLATE[] = "-std=c17";
} // namespace Constants
} // namespace GenericProjectManager

View File

@@ -48,6 +48,8 @@ ProjectFilesFactory::ProjectFilesFactory()
addMimeType("application/vnd.qtcreator.generic.files");
addMimeType("application/vnd.qtcreator.generic.includes");
addMimeType("application/vnd.qtcreator.generic.config");
addMimeType("application/vnd.qtcreator.generic.cxxflags");
addMimeType("application/vnd.qtcreator.generic.cflags");
setDocumentCreator([]() { return new TextDocument(Constants::FILES_EDITOR_ID); });
setEditorActionHandlers(TextEditorActionHandler::None);

View File

@@ -149,6 +149,8 @@ Core::GeneratedFiles GenericProjectWizard::generateFiles(const QWizard *w,
const QString filesFileName = QFileInfo(dir, projectName + QLatin1String(".files")).absoluteFilePath();
const QString includesFileName = QFileInfo(dir, projectName + QLatin1String(".includes")).absoluteFilePath();
const QString configFileName = QFileInfo(dir, projectName + QLatin1String(".config")).absoluteFilePath();
const QString cxxflagsFileName = QFileInfo(dir, projectName + QLatin1String(".cxxflags")).absoluteFilePath();
const QString cflagsFileName = QFileInfo(dir, projectName + QLatin1String(".cflags")).absoluteFilePath();
const QStringList paths = Utils::transform(wizard->selectedPaths(), &Utils::FileName::toString);
Utils::MimeType headerTy = Utils::mimeTypeForName(QLatin1String("text/x-chdr"));
@@ -188,11 +190,20 @@ Core::GeneratedFiles GenericProjectWizard::generateFiles(const QWizard *w,
Core::GeneratedFile generatedConfigFile(configFileName);
generatedConfigFile.setContents(QLatin1String(ConfigFileTemplate));
Core::GeneratedFile generatedCxxFlagsFile(cxxflagsFileName);
generatedCxxFlagsFile.setContents(
QLatin1String(Constants::GENERICPROJECT_CXXFLAGS_FILE_TEMPLATE));
Core::GeneratedFile generatedCFlagsFile(cflagsFileName);
generatedCFlagsFile.setContents(QLatin1String(Constants::GENERICPROJECT_CFLAGS_FILE_TEMPLATE));
Core::GeneratedFiles files;
files.append(generatedFilesFile);
files.append(generatedIncludesFile);
files.append(generatedConfigFile);
files.append(generatedCreatorFile);
files.append(generatedCxxFlagsFile);
files.append(generatedCFlagsFile);
return files;
}