qmake: QmakePriFile is no longer a ProjectNode

Change-Id: Ife3ca88e0d4e0a9de290b2b991ac8d10e3c55674
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Tobias Hunger
2017-02-10 09:56:33 +01:00
committed by Tim Jenssen
parent 80aad7bdd4
commit aa4c7dc07c
2 changed files with 51 additions and 131 deletions

View File

@@ -247,17 +247,13 @@ public:
} // namespace Internal } // namespace Internal
QmakePriFile::QmakePriFile(QmakeProject *project, QmakeProFile *qmakeProFile, QmakePriFile::QmakePriFile(QmakeProject *project, QmakeProFile *qmakeProFile,
const FileName &filePath) const FileName &filePath) :
: ProjectNode(filePath), m_project(project),
m_project(project), m_qmakeProFile(qmakeProFile)
m_qmakeProFile(qmakeProFile)
{ {
Q_ASSERT(project); Q_ASSERT(project);
m_priFileDocument = std::make_unique<QmakePriFileDocument>(this, filePath); m_priFileDocument = std::make_unique<QmakePriFileDocument>(this, filePath);
Core::DocumentManager::addDocument(m_priFileDocument.get()); Core::DocumentManager::addDocument(m_priFileDocument.get());
setDisplayName(filePath.toFileInfo().completeBaseName());
setIcon(qmakeStaticData()->projectIcon);
} }
FileName QmakePriFile::filePath() const FileName QmakePriFile::filePath() const
@@ -280,6 +276,12 @@ QVector<QmakePriFile *> QmakePriFile::children() const
return m_children; return m_children;
} }
void QmakePriFile::makeEmpty()
{
qDeleteAll(m_children);
m_children.clear();
}
QmakePriFile::~QmakePriFile() QmakePriFile::~QmakePriFile()
{ {
watchFolders(QSet<QString>()); watchFolders(QSet<QString>());
@@ -492,20 +494,24 @@ bool QmakePriFile::deploysFolder(const QString &folder) const
QList<RunConfiguration *> QmakePriFile::runConfigurations() const QList<RunConfiguration *> QmakePriFile::runConfigurations() const
{ {
#if 0
QmakeRunConfigurationFactory *factory = QmakeRunConfigurationFactory::find(m_project->activeTarget()); QmakeRunConfigurationFactory *factory = QmakeRunConfigurationFactory::find(m_project->activeTarget());
if (factory) if (factory)
return factory->runConfigurationsForNode(m_project->activeTarget(), this); return factory->runConfigurationsForNode(m_project->activeTarget(), this);
#endif
return QList<RunConfiguration *>(); return QList<RunConfiguration *>();
} }
QList<QmakePriFile *> QmakePriFile::subPriFilesExact() const QList<QmakePriFile *> QmakePriFile::subPriFilesExact() const
{ {
QList<QmakePriFile *> nodes; QList<QmakePriFile *> nodes;
#if 0
foreach (ProjectNode *node, projectNodes()) { foreach (ProjectNode *node, projectNodes()) {
QmakePriFile *n = dynamic_cast<QmakePriFile *>(node); QmakePriFile *n = dynamic_cast<QmakePriFile *>(node);
if (n && n->includedInExactParse()) if (n && n->includedInExactParse())
nodes << n; nodes << n;
} }
#endif
return nodes; return nodes;
} }
@@ -524,74 +530,6 @@ void QmakePriFile::setIncludedInExactParse(bool b)
m_includedInExactParse = b; m_includedInExactParse = b;
} }
QList<ProjectAction> QmakePriFile::supportedActions(Node *node) const
{
QList<ProjectAction> actions;
const FolderNode *folderNode = this;
const QmakeProFile *proFile;
while (!(proFile = dynamic_cast<const QmakeProFile*>(folderNode)))
folderNode = folderNode->parentFolderNode();
Q_ASSERT(proFile);
switch (proFile->projectType()) {
case ProjectType::ApplicationTemplate:
case ProjectType::StaticLibraryTemplate:
case ProjectType::SharedLibraryTemplate:
case ProjectType::AuxTemplate: {
// TODO: Some of the file types don't make much sense for aux
// projects (e.g. cpp). It'd be nice if the "add" action could
// work on a subset of the file types according to project type.
actions << AddNewFile;
if (m_recursiveEnumerateFiles.contains(node->filePath()))
actions << EraseFile;
else
actions << RemoveFile;
bool addExistingFiles = true;
if (node->nodeType() == NodeType::VirtualFolder) {
// A virtual folder, we do what the projectexplorer does
FolderNode *folder = node->asFolderNode();
if (folder) {
QStringList list;
foreach (FolderNode *f, folder->folderNodes())
list << f->filePath().toString() + QLatin1Char('/');
if (deploysFolder(Utils::commonPath(list)))
addExistingFiles = false;
}
}
addExistingFiles = addExistingFiles && !deploysFolder(node->filePath().toString());
if (addExistingFiles)
actions << AddExistingFile << AddExistingDirectory;
break;
}
case ProjectType::SubDirsTemplate:
actions << AddSubProject << RemoveSubProject;
break;
default:
break;
}
FileNode *fileNode = node->asFileNode();
if ((fileNode && fileNode->fileType() != FileType::Project)
|| dynamic_cast<ResourceEditor::ResourceTopLevelNode *>(node)) {
actions << Rename;
actions << DuplicateFile;
}
Target *target = m_project->activeTarget();
QmakeRunConfigurationFactory *factory = QmakeRunConfigurationFactory::find(target);
if (factory && !factory->runConfigurationsForNode(target, node).isEmpty())
actions << HasSubProjectRunConfigurations;
return actions;
}
bool QmakePriFile::canAddSubProject(const QString &proFilePath) const bool QmakePriFile::canAddSubProject(const QString &proFilePath) const
{ {
QFileInfo fi(proFilePath); QFileInfo fi(proFilePath);
@@ -615,14 +553,11 @@ static QString simplifyProFilePath(const QString &proFilePath)
bool QmakePriFile::addSubProjects(const QStringList &proFilePaths) bool QmakePriFile::addSubProjects(const QStringList &proFilePaths)
{ {
FindAllFilesVisitor visitor;
accept(&visitor);
const FileNameList &allFiles = visitor.filePaths();
QStringList uniqueProFilePaths; QStringList uniqueProFilePaths;
foreach (const QString &proFile, proFilePaths) foreach (const QString &proFile, proFilePaths) {
if (!allFiles.contains(FileName::fromString(proFile))) if (!m_recursiveEnumerateFiles.contains(FileName::fromString(proFile)))
uniqueProFilePaths.append(simplifyProFilePath(proFile)); uniqueProFilePaths.append(simplifyProFilePath(proFile));
}
QStringList failedFiles; QStringList failedFiles;
changeFiles(QLatin1String(Constants::PROFILE_MIMETYPE), uniqueProFilePaths, &failedFiles, AddToProFile); changeFiles(QLatin1String(Constants::PROFILE_MIMETYPE), uniqueProFilePaths, &failedFiles, AddToProFile);
@@ -650,10 +585,6 @@ bool QmakePriFile::addFiles(const QStringList &filePaths, QStringList *notAdded)
// So it's obviously a bit limited, but in those cases you need to edit the // So it's obviously a bit limited, but in those cases you need to edit the
// project files manually anyway. // project files manually anyway.
FindAllFilesVisitor visitor;
accept(&visitor);
const FileNameList &allFiles = visitor.filePaths();
typedef QMap<QString, QStringList> TypeFileMap; typedef QMap<QString, QStringList> TypeFileMap;
// Split into lists by file type and bulk-add them. // Split into lists by file type and bulk-add them.
TypeFileMap typeFileMap; TypeFileMap typeFileMap;
@@ -678,13 +609,13 @@ bool QmakePriFile::addFiles(const QStringList &filePaths, QStringList *notAdded)
QStringList uniqueQrcFiles; QStringList uniqueQrcFiles;
foreach (const QString &file, qrcFiles) { foreach (const QString &file, qrcFiles) {
if (!allFiles.contains(FileName::fromString(file))) if (!m_recursiveEnumerateFiles.contains(FileName::fromString(file)))
uniqueQrcFiles.append(file); uniqueQrcFiles.append(file);
} }
QStringList uniqueFilePaths; QStringList uniqueFilePaths;
foreach (const QString &file, typeFiles) { foreach (const QString &file, typeFiles) {
if (!allFiles.contains(FileName::fromString(file))) if (!m_recursiveEnumerateFiles.contains(FileName::fromString(file)))
uniqueFilePaths.append(file); uniqueFilePaths.append(file);
} }
@@ -753,12 +684,6 @@ bool QmakePriFile::renameFile(const QString &filePath, const QString &newFilePat
return changeProFileOptional; return changeProFileOptional;
} }
FolderNode::AddNewInformation QmakePriFile::addNewInformation(const QStringList &files, Node *context) const
{
Q_UNUSED(files)
return FolderNode::AddNewInformation(filePath().fileName(), context && context->parentProjectNode() == this ? 120 : 90);
}
bool QmakePriFile::priFileWritable(const QString &path) bool QmakePriFile::priFileWritable(const QString &path)
{ {
ReadOnlyFilesDialog roDialog(path, ICore::mainWindow()); ReadOnlyFilesDialog roDialog(path, ICore::mainWindow());
@@ -1201,8 +1126,8 @@ QmakeProFile *QmakeProFile::findProFileFor(const FileName &fileName) const
{ {
if (fileName == filePath()) if (fileName == filePath())
return const_cast<QmakeProFile *>(this); return const_cast<QmakeProFile *>(this);
foreach (ProjectNode *pn, projectNodes()) foreach (const QmakePriFile *n, children())
if (QmakeProFile *qmakeProFileNode = dynamic_cast<QmakeProFile *>(pn)) if (auto qmakeProFileNode = dynamic_cast<const QmakeProFile *>(n))
if (QmakeProFile *result = qmakeProFileNode->findProFileFor(fileName)) if (QmakeProFile *result = qmakeProFileNode->findProFileFor(fileName))
return result; return result;
return nullptr; return nullptr;
@@ -1276,17 +1201,16 @@ QmakeProFile::~QmakeProFile()
bool QmakeProFile::isParent(QmakeProFile *node) bool QmakeProFile::isParent(QmakeProFile *node)
{ {
while ((node = dynamic_cast<QmakeProFile *>(node->parentFolderNode()))) { while ((node = dynamic_cast<QmakeProFile *>(node->parent()))) {
if (node == this) if (node == this)
return true; return true;
} }
return false; return false;
} }
FolderNode::AddNewInformation QmakeProFile::addNewInformation(const QStringList &files, Node *context) const QString QmakeProFile::displayName() const
{ {
Q_UNUSED(files) return m_displayName;
return AddNewInformation(filePath().fileName(), context && context->parentProjectNode() == this ? 120 : 100);
} }
bool QmakeProFile::isDebugAndRelease() const bool QmakeProFile::isDebugAndRelease() const
@@ -1320,8 +1244,8 @@ QString QmakeProFile::singleVariableValue(const Variable var) const
void QmakeProFile::setParseInProgressRecursive(bool b) void QmakeProFile::setParseInProgressRecursive(bool b)
{ {
setParseInProgress(b); setParseInProgress(b);
foreach (ProjectNode *subNode, projectNodes()) { foreach (QmakePriFile *c, children()) {
if (QmakeProFile *node = dynamic_cast<QmakeProFile *>(subNode)) if (auto node = dynamic_cast<QmakeProFile *>(c))
node->setParseInProgressRecursive(b); node->setParseInProgressRecursive(b);
} }
} }
@@ -1341,8 +1265,8 @@ void QmakeProFile::setParseInProgress(bool b)
void QmakeProFile::setValidParseRecursive(bool b) void QmakeProFile::setValidParseRecursive(bool b)
{ {
m_validParse = b; m_validParse = b;
foreach (ProjectNode *subNode, projectNodes()) { foreach (QmakePriFile *c, children()) {
if (QmakeProFile *node = dynamic_cast<QmakeProFile *>(subNode)) if (QmakeProFile *node = dynamic_cast<QmakeProFile *>(c))
node->setValidParseRecursive(b); node->setValidParseRecursive(b);
} }
} }
@@ -1701,6 +1625,7 @@ void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult)
// delete files && folders && projects // delete files && folders && projects
makeEmpty(); makeEmpty();
m_projectType = ProjectType::Invalid; m_projectType = ProjectType::Invalid;
} }
return; return;
@@ -1711,10 +1636,10 @@ void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult)
if (result->projectType != m_projectType) { if (result->projectType != m_projectType) {
// probably all subfiles/projects have changed anyway // probably all subfiles/projects have changed anyway
// delete files && folders && projects // delete files && folders && projects
foreach (ProjectNode *projectNode, projectNodes()) { foreach (QmakePriFile *c, children()) {
if (QmakeProFile *qmakeProFileNode = dynamic_cast<QmakeProFile *>(projectNode)) { if (auto qmakeProFile = dynamic_cast<QmakeProFile *>(c)) {
qmakeProFileNode->setValidParseRecursive(false); qmakeProFile->setValidParseRecursive(false);
qmakeProFileNode->setParseInProgressRecursive(false); qmakeProFile->setParseInProgressRecursive(false);
} }
} }
@@ -1786,10 +1711,8 @@ void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult)
m_varValues = result->newVarValues; m_varValues = result->newVarValues;
const QString projectName = singleVariableValue(Variable::QmakeProjectName); const QString projectName = singleVariableValue(Variable::QmakeProjectName);
if (projectName.isEmpty()) m_displayName = projectName.isEmpty() ? filePath().toFileInfo().completeBaseName()
setDisplayName(filePath().toFileInfo().completeBaseName()); : projectName;
else
setDisplayName(projectName);
} // result == EvalOk } // result == EvalOk
setParseInProgress(false); setParseInProgress(false);
@@ -1797,7 +1720,6 @@ void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult)
updateGeneratedFiles(buildDirectory); updateGeneratedFiles(buildDirectory);
cleanupProFileReaders(); cleanupProFileReaders();
ProjectNode::emitTreeChanged();
} }
void QmakeProFile::cleanupProFileReaders() void QmakeProFile::cleanupProFileReaders()
@@ -2091,6 +2013,7 @@ void QmakeProFile::updateGeneratedFiles(const QString &buildDir)
QList<ExtraCompilerFactory *> factories = QList<ExtraCompilerFactory *> factories =
ProjectExplorer::ExtraCompilerFactory::extraCompilerFactories(); ProjectExplorer::ExtraCompilerFactory::extraCompilerFactories();
#if 0
FindGeneratorSourcesVisitor filesVisitor(factories, [&]( FindGeneratorSourcesVisitor filesVisitor(factories, [&](
FileNode *file, ExtraCompilerFactory *factory) { FileNode *file, ExtraCompilerFactory *factory) {
QStringList generated = generatedFiles(buildDir, file); QStringList generated = generatedFiles(buildDir, file);
@@ -2104,4 +2027,5 @@ void QmakeProFile::updateGeneratedFiles(const QString &buildDir)
// Find all generated files // Find all generated files
accept(&filesVisitor); accept(&filesVisitor);
#endif
} }

View File

@@ -106,36 +106,32 @@ class QmakePriFileEvalResult;
class InstallsParserList; class InstallsParserList;
// Implements ProjectNode for qmake .pri files // Implements ProjectNode for qmake .pri files
class QMAKEPROJECTMANAGER_EXPORT QmakePriFile : public ProjectExplorer::ProjectNode class QMAKEPROJECTMANAGER_EXPORT QmakePriFile
{ {
public: public:
QmakePriFile(QmakeProject *project, QmakeProFile *qmakeProFile, const Utils::FileName &filePath); QmakePriFile(QmakeProject *project, QmakeProFile *qmakeProFile, const Utils::FileName &filePath);
~QmakePriFile() override; virtual ~QmakePriFile();
Utils::FileName filePath() const; Utils::FileName filePath() const;
Utils::FileName directoryPath() const; Utils::FileName directoryPath() const;
QmakePriFile *parent() const; QmakePriFile *parent() const;
QVector<QmakePriFile *> children() const; QVector<QmakePriFile *> children() const;
void makeEmpty();
void update(const Internal::QmakePriFileEvalResult &result); void update(const Internal::QmakePriFileEvalResult &result);
// ProjectNode interface // ProjectNode interface
QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override; virtual bool canAddSubProject(const QString &proFilePath) const;
bool showInSimpleTree() const override { return false; } virtual bool addSubProjects(const QStringList &proFilePaths);
virtual bool removeSubProjects(const QStringList &proFilePaths);
bool canAddSubProject(const QString &proFilePath) const override; virtual bool addFiles(const QStringList &filePaths, QStringList *notAdded = nullptr);
virtual bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = nullptr);
bool addSubProjects(const QStringList &proFilePaths) override; virtual bool deleteFiles(const QStringList &filePaths);
bool removeSubProjects(const QStringList &proFilePaths) override; virtual bool canRenameFile(const QString &filePath, const QString &newFilePath);
virtual bool renameFile(const QString &filePath, const QString &newFilePath);
bool addFiles(const QStringList &filePaths, QStringList *notAdded = nullptr) override;
bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = nullptr) override;
bool deleteFiles(const QStringList &filePaths) override;
bool canRenameFile(const QString &filePath, const QString &newFilePath) override;
bool renameFile(const QString &filePath, const QString &newFilePath) override;
AddNewInformation addNewInformation(const QStringList &files, Node *context) const override;
bool setProVariable(const QString &var, const QStringList &values, bool setProVariable(const QString &var, const QStringList &values,
const QString &scope = QString(), const QString &scope = QString(),
@@ -143,8 +139,8 @@ public:
bool folderChanged(const QString &changedFolder, const QSet<Utils::FileName> &newFiles); bool folderChanged(const QString &changedFolder, const QSet<Utils::FileName> &newFiles);
bool deploysFolder(const QString &folder) const override; virtual bool deploysFolder(const QString &folder) const;
QList<ProjectExplorer::RunConfiguration *> runConfigurations() const override; virtual QList<ProjectExplorer::RunConfiguration *> runConfigurations() const;
QmakeProFile *proFile() const; QmakeProFile *proFile() const;
QList<QmakePriFile*> subPriFilesExact() const; QList<QmakePriFile*> subPriFilesExact() const;
@@ -273,8 +269,7 @@ public:
~QmakeProFile() override; ~QmakeProFile() override;
bool isParent(QmakeProFile *node); bool isParent(QmakeProFile *node);
QString displayName() const;
AddNewInformation addNewInformation(const QStringList &files, Node *context) const override;
ProjectType projectType() const; ProjectType projectType() const;
@@ -348,6 +343,7 @@ private:
bool m_validParse = false; bool m_validParse = false;
bool m_parseInProgress = false; bool m_parseInProgress = false;
QString m_displayName;
ProjectType m_projectType = ProjectType::Invalid; ProjectType m_projectType = ProjectType::Invalid;
VariablesHash m_varValues; VariablesHash m_varValues;
QList<ProjectExplorer::ExtraCompiler *> m_extraCompilers; QList<ProjectExplorer::ExtraCompiler *> m_extraCompilers;