diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseconstants.h b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseconstants.h index 1cb47d5dfd2..4fab0e49807 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseconstants.h +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseconstants.h @@ -30,6 +30,7 @@ namespace Constants { const char COMPILATIONDATABASEMIMETYPE[] = "text/x-compilation-database-project"; const char COMPILATIONDATABASEPROJECT_ID[] = "CompilationDatabase.CompilationDatabaseEditor"; +const char COMPILATIONDATABASEPROJECT_FILES_SUFFIX[] = ".files"; } // Constants } // CompilationDatabaseProjectManager diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp index a4750070504..3f4ac7d8be6 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp @@ -405,12 +405,38 @@ std::vector readJsonObjects(const QString &filePath) return result; } +QStringList readExtraFiles(const QString &filePath) +{ + QStringList result; + + QFile file(filePath); + if (file.open(QFile::ReadOnly)) { + QTextStream stream(&file); + + while (!stream.atEnd()) { + QString line = stream.readLine(); + line = line.trimmed(); + + if (line.isEmpty() || line.startsWith('#')) + continue; + + result.push_back(line); + } + } + + return result; +} + } // anonymous namespace void CompilationDatabaseProject::buildTreeAndProjectParts(const Utils::FileName &projectFile) { std::vector array = readJsonObjects(projectFilePath().toString()); - if (array.empty()) { + const QString jsonExtraFilename = projectFilePath().toString() + + Constants::COMPILATIONDATABASEPROJECT_FILES_SUFFIX; + const QStringList &extras = readExtraFiles(jsonExtraFilename); + + if (array.empty() && extras.empty()) { emitParsingFinished(false); return; } @@ -448,6 +474,21 @@ void CompilationDatabaseProject::buildTreeAndProjectParts(const Utils::FileName rpps.append(rpp); } + if (!extras.empty()) { + const QString baseDir = projectFile.parentDir().toString(); + + QStringList extraFiles; + for (const QString &extra : extras) { + auto extraFile = Utils::FileName::fromString(baseDir); + extraFile.appendPath(extra); + extraFiles.append(extraFile.toString()); + } + + CppTools::RawProjectPart rppExtra; + rppExtra.setFiles(extraFiles); + rpps.append(rppExtra); + } + m_treeScanner.future().waitForFinished(); QCoreApplication::processEvents(); @@ -458,6 +499,10 @@ void CompilationDatabaseProject::buildTreeAndProjectParts(const Utils::FileName root->addNode(std::make_unique(projectFile, FileType::Project)); + if (QFile::exists(jsonExtraFilename)) + root->addNode(std::make_unique(Utils::FileName::fromString(jsonExtraFilename), + FileType::Project)); + setRootProjectNode(std::move(root)); m_cppCodeModelUpdater->update({this, kitInfo, rpps}); @@ -511,6 +556,8 @@ CompilationDatabaseProject::CompilationDatabaseProject(const Utils::FileName &pr &CompilationDatabaseProject::reparseProject); m_fileSystemWatcher.addFile(projectFile.toString(), Utils::FileSystemWatcher::WatchModifiedDate); + m_fileSystemWatcher.addFile(projectFile.toString() + Constants::COMPILATIONDATABASEPROJECT_FILES_SUFFIX, + Utils::FileSystemWatcher::WatchModifiedDate); connect(&m_fileSystemWatcher, &Utils::FileSystemWatcher::fileChanged, this, diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.cpp index 6ba1d6e4258..031c98c03d0 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.cpp @@ -43,13 +43,18 @@ namespace CompilationDatabaseProjectManager { namespace Internal { const char CHANGEROOTDIR[] = "CompilationDatabaseProjectManager.ChangeRootDirectory"; +const char COMPILE_COMMANDS_JSON[] = "compile_commands.json"; bool CompilationDatabaseProjectManagerPlugin::initialize(const QStringList &arguments, QString *errorMessage) { Q_UNUSED(arguments); Q_UNUSED(errorMessage); - Core::FileIconProvider::registerIconOverlayForFilename(Utils::Icons::PROJECT.imageFileName(), - "compile_commands.json"); + Core::FileIconProvider::registerIconOverlayForFilename( + Utils::Icons::PROJECT.imageFileName(), + COMPILE_COMMANDS_JSON); + Core::FileIconProvider::registerIconOverlayForFilename( + Utils::Icons::PROJECT.imageFileName(), + QString(COMPILE_COMMANDS_JSON) + Constants::COMPILATIONDATABASEPROJECT_FILES_SUFFIX); ProjectExplorer::ProjectManager::registerProjectType( Constants::COMPILATIONDATABASEMIMETYPE);