diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 0e1667d78f208ac27b2f1f1b6ae91ad0aa090cef..606d970f5a00c9cf32afcf840f43e12830827684 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -175,9 +175,15 @@ void CMakeProject::parseCMakeLists() //qDebug()<<"Building Tree"; + QList<ProjectExplorer::FileNode *> fileList = cbpparser.fileList(); - // Manually add the CMakeLists.txt file - fileList.append(new ProjectExplorer::FileNode(sourceDirectory() + "/CMakeLists.txt", ProjectExplorer::ProjectFileType, false)); + + if (cbpparser.hasCMakeFiles()) { + fileList.append(cbpparser.cmakeFileList()); + } else { + // Manually add the CMakeLists.txt file + fileList.append(new ProjectExplorer::FileNode(sourceDirectory() + "/CMakeLists.txt", ProjectExplorer::ProjectFileType, false)); + } m_files.clear(); foreach (ProjectExplorer::FileNode *fn, fileList) @@ -941,18 +947,43 @@ void CMakeCbpParser::parseUnit() { //qDebug()<<stream.attributes().value("filename"); QString fileName = attributes().value("filename").toString(); - if (!fileName.endsWith(".rule")) - m_fileList.append( new ProjectExplorer::FileNode(fileName, ProjectExplorer::SourceType, false)); + m_parsingCmakeUnit = false; while (!atEnd()) { readNext(); if (isEndElement()) { + if (!fileName.endsWith(".rule") && !m_processedUnits.contains(fileName)) { + // Now check whether we found a virtual element beneath + if (m_parsingCmakeUnit) + m_fileList.append( new ProjectExplorer::FileNode(fileName, ProjectExplorer::SourceType, false)); + else + m_cmakeFileList.append( new ProjectExplorer::FileNode(fileName, ProjectExplorer::ProjectFileType, false)); + m_processedUnits.insert(fileName); + } return; + } else if (name() == "Option") { + parseUnitOption(); } else if (isStartElement()) { parseUnknownElement(); } } } +void CMakeCbpParser::parseUnitOption() +{ + if (attributes().hasAttribute("virtualFolder")) + m_parsingCmakeUnit = true; + + while (!atEnd()) { + readNext(); + + if (isEndElement()) + break; + + if (isStartElement()) + parseUnknownElement(); + } +} + void CMakeCbpParser::parseUnknownElement() { Q_ASSERT(isStartElement()); @@ -973,6 +1004,16 @@ QList<ProjectExplorer::FileNode *> CMakeCbpParser::fileList() return m_fileList; } +QList<ProjectExplorer::FileNode *> CMakeCbpParser::cmakeFileList() +{ + return m_cmakeFileList; +} + +bool CMakeCbpParser::hasCMakeFiles() +{ + return !m_cmakeFileList.isEmpty(); +} + QStringList CMakeCbpParser::includeFiles() { return m_includeFiles; diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index 603d4e85553efeffa5a70f13a924f6dd63d5d4ac..6f17e3fa3ecfb85a3946f6a33dd2c0dfa3ea39f5 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -145,10 +145,12 @@ class CMakeCbpParser : public QXmlStreamReader public: bool parseCbpFile(const QString &fileName); QList<ProjectExplorer::FileNode *> fileList(); + QList<ProjectExplorer::FileNode *> cmakeFileList(); QStringList includeFiles(); QList<CMakeTarget> targets(); QString projectName() const; QString compilerName() const; + bool hasCMakeFiles(); private: void parseCodeBlocks_project_file(); void parseProject(); @@ -162,9 +164,13 @@ private: void parseCompiler(); void parseAdd(); void parseUnit(); + void parseUnitOption(); void parseUnknownElement(); QList<ProjectExplorer::FileNode *> m_fileList; + QList<ProjectExplorer::FileNode *> m_cmakeFileList; + QSet<QString> m_processedUnits; + bool m_parsingCmakeUnit; QStringList m_includeFiles; CMakeTarget m_target;