室内设计师网名,深圳谷歌seo培训班,网站 反链,文字代码生成器背景
本来想解析VS的项目配置文件(*.vcxproj)#xff0c;配合cppclean来发现多余的#incldue。
结果发现低估了难度#xff0c;VS会间接引入许多目录。
略有不甘#xff0c;暂且作为一个解析XML文件的示例。
代码
VSProjectParser.h
#include QVector
#include…背景
本来想解析VS的项目配置文件(*.vcxproj)配合cppclean来发现多余的#incldue。
结果发现低估了难度VS会间接引入许多目录。
略有不甘暂且作为一个解析XML文件的示例。
代码
VSProjectParser.h
#include QVector
#include memoryclass VSProjectParser {
public:VSProjectParser (const QString vsProjectFilePath);QVectorQString getIncludeDirectoriesRealPath ();QVectorQString getCppFilesRealPath ();QVectorQString getHeadFilesRealPath ();private:class Impl;std::shared_ptrImpl m_impl nullptr;
};VSProjectParser.cpp
#include VSProjectParser.h#include QDebug
#include QDir
#include QDomDocument
#include QDomElement
#include QDomNode
#include QFile
#include QFileInfo
#include QHash
#include memoryclass Document {
public:Document (const QString projFilePath);QVectorQString extractCppFiles ();QVectorQString extractHeadFiles ();private:void extractTasgInfo ();QHashQString, QVectorQString m_tagsInfo {};QString m_projFilePath ;
};class VSProjectParser::Impl {
public:Impl (const QString vsProjectFilePath) : m_vsProjectFileInfo (vsProjectFilePath), m_document (vsProjectFilePath){}QFileInfo m_vsProjectFileInfo ;Document m_document;
};Document::Document (const QString projFilePath) : m_projFilePath (projFilePath)
{extractTasgInfo();
}QVectorQString
Document::extractCppFiles()
{QVectorQString cppTags {ClCompile};QVectorQString ret;for (QString tag : cppTags) {if (m_tagsInfo.contains (tag))ret.append (m_tagsInfo.value (tag));}return ret;
}QVectorQString
Document::extractHeadFiles()
{QVectorQString headTags {ClInclude, QtMoc};QVectorQString ret;for (QString tag : headTags) {if (m_tagsInfo.contains (tag))ret.append (m_tagsInfo.value (tag));}return ret;
}void
Document::extractTasgInfo()
{QFile file (m_projFilePath);if (!file.open (QIODevice::ReadOnly)) {qDebug() Failed to open the file.;return;}QDomDocument doc;if (!doc.setContent (file)) {qDebug() Failed to parse the file into a DOM tree.;return;}file.close();QDomElement root doc.documentElement();QHashQString, QVectorQString tags_with_include_attribute;constexpr auto ATTR_INCLUDE Include;QDomNodeList itemGroups root.elementsByTagName (ItemGroup);for (int i 0; i itemGroups.count(); i) {QDomNode itemGroup itemGroups.at (i);QDomNodeList children itemGroup.childNodes();for (int j 0; j children.count(); j) {QDomNode child children.at (j);if (child.isElement()) {QDomElement element child.toElement();QString tagName element.tagName();tags_with_include_attribute[tagName].push_back (element.attribute (ATTR_INCLUDE));}}}QVectorQString keys;m_tagsInfo tags_with_include_attribute;
}VSProjectParser::VSProjectParser (const QString vsProjectFilePath) : m_impl (new Impl (vsProjectFilePath))
{
}QVectorQString
VSProjectParser::getIncludeDirectoriesRealPath()
{QVectorQString headers getHeadFilesRealPath();QVectorQString ret;for (QString file : headers) {QFileInfo fileInfo (file);if (!fileInfo.exists()) {qDebug() __FUNCTION__ File not found: file;continue;}ret.append (fileInfo.dir().absolutePath());}return ret;
}QVectorQString
VSProjectParser::getCppFilesRealPath()
{QVectorQString includes m_impl-m_document.extractCppFiles();QVectorQString ret;for (QString file : includes) {file m_impl-m_vsProjectFileInfo.dir().absolutePath() / file;QFileInfo fileInfo (file);if (fileInfo.exists())ret.append (fileInfo.absoluteFilePath());elseqDebug() __FUNCTION__ File not found: file;}return ret;
}QVectorQString
VSProjectParser::getHeadFilesRealPath()
{QVectorQString includes m_impl-m_document.extractHeadFiles();QVectorQString ret;for (QString file : includes) {file m_impl-m_vsProjectFileInfo.dir().absolutePath() / file;QFileInfo fileInfo (file);if (fileInfo.exists())ret.append (fileInfo.absoluteFilePath());elseqDebug() __FUNCTION__ File not found: file;}return ret;
}