summaryrefslogtreecommitdiffstats
path: root/examples/uml/duse-mt/src/plugins/gccxmlarchitecturerecoverybackend/gccxmlarchitecturerecoverybackendplugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/uml/duse-mt/src/plugins/gccxmlarchitecturerecoverybackend/gccxmlarchitecturerecoverybackendplugin.cpp')
-rw-r--r--examples/uml/duse-mt/src/plugins/gccxmlarchitecturerecoverybackend/gccxmlarchitecturerecoverybackendplugin.cpp351
1 files changed, 178 insertions, 173 deletions
diff --git a/examples/uml/duse-mt/src/plugins/gccxmlarchitecturerecoverybackend/gccxmlarchitecturerecoverybackendplugin.cpp b/examples/uml/duse-mt/src/plugins/gccxmlarchitecturerecoverybackend/gccxmlarchitecturerecoverybackendplugin.cpp
index e161b412..220bf417 100644
--- a/examples/uml/duse-mt/src/plugins/gccxmlarchitecturerecoverybackend/gccxmlarchitecturerecoverybackendplugin.cpp
+++ b/examples/uml/duse-mt/src/plugins/gccxmlarchitecturerecoverybackend/gccxmlarchitecturerecoverybackendplugin.cpp
@@ -42,7 +42,9 @@
#include <QtWidgets/QAction>
#include <QtWidgets/QFileDialog>
+#include <QtWidgets/QMessageBox>
+#include <QtCore/QDebug>
#include <QtCore/QProcess>
#include <QtCore/QXmlStreamReader>
@@ -54,244 +56,247 @@ namespace DuSE
GccXmlArchitectureRecoveryBackendPlugin::GccXmlArchitectureRecoveryBackendPlugin(QObject *parent) :
IPlugin(parent)
{
+ _name = "C++ (GCC-XML)";
+ qRegisterMetaType<DependencyRelations>("DependencyRelations");
}
bool GccXmlArchitectureRecoveryBackendPlugin::initialize()
{
- QAction *newArchitectureRecoveryProcessAction = new QAction(QIcon(), tr("New architecture recovery process"), this);
- connect(newArchitectureRecoveryProcessAction, SIGNAL(triggered()), this, SLOT(newArchitectureRecoveryProcess()));
- ICore::self()->uiController()->addAction(newArchitectureRecoveryProcessAction, tr("menu_File"));
- qRegisterMetaType<ClassFunctions>("ClassFunctions");
return true;
}
-void GccXmlArchitectureRecoveryBackendPlugin::setRootProjectDir(const QDir &rootProjectDir)
-{
- _rootProjectDir = rootProjectDir;
-}
-
-void GccXmlArchitectureRecoveryBackendPlugin::newArchitectureRecoveryProcess()
-{
- QString directory = QFileDialog::getExistingDirectory(0, tr("Open code tree"), QDir::currentPath());
- _rootProjectDir = QDir(directory);
- components();
-}
QObjectList GccXmlArchitectureRecoveryBackendPlugin::components()
{
QObjectList components;
- QStringList headers = _rootProjectDir.entryList(QStringList("*.h"), QDir::Files | QDir::NoSymLinks);
- QStringList xmlFiles = generateXmlFiles(headers);
- int xmlFilesSize = xmlFiles.size();
- for (int i = 0; i < xmlFilesSize; ++i) {
- _xmlFileName = xmlFiles.at(i).toLocal8Bit().constData();
-
- QObject *component = extractComponent();
- components.append(component);
- }
+ QObject *componentsDependencyRelations = new QObject;
+ componentsDependencyRelations->setProperty("components", QVariant::fromValue(_dependencyRelations));
+ componentsDependencyRelations->setProperty("systemDirectory", QVariant::fromValue(_rootProjectDirectoryString));
+ components.append(componentsDependencyRelations);
return components;
}
QObjectList GccXmlArchitectureRecoveryBackendPlugin::connectors()
{
- return QObjectList();
+ QObjectList connectors;
+
+ return connectors;
}
-QStringList GccXmlArchitectureRecoveryBackendPlugin::generateXmlFiles(const QStringList &codeFiles) const
+void GccXmlArchitectureRecoveryBackendPlugin::run()
{
- int codeFilesSize = codeFiles.size();
-
- for (int i = 0; i < codeFilesSize; ++i) {
- QString file = codeFiles.at(i).toLocal8Bit().constData();
- QString fileDir = _rootProjectDir.absolutePath() + "/" + file;
- QString xmlFileDir = _rootProjectDir.absolutePath() + "/" + file.replace(".h", ".xml");
-
- QProcess process;
- process.start("gccxml " + fileDir + " -fxml=" + xmlFileDir);
- process.waitForFinished();
- }
-
- return _rootProjectDir.entryList(QStringList("*.xml"), QDir::Files | QDir::NoSymLinks);
+ runGccXml();
+ recoverDependencyRelations();
}
-bool GccXmlArchitectureRecoveryBackendPlugin::openXmlFile(const QString &filePath)
+void GccXmlArchitectureRecoveryBackendPlugin::runGccXml()
{
- _xmlFile.setFileName(filePath);
- _xmlReader = new QXmlStreamReader(&_xmlFile);
+ _rootProjectDirectoryString = QFileDialog::getExistingDirectory(0, "Escolha o diretório raíz do projeto", QDir::currentPath());
- if (!_xmlFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
- return false;
+ if (_rootProjectDirectoryString.isEmpty()) {
+ QMessageBox errorMessage;
+ errorMessage.setInformativeText("Diretório inválido.");
+ errorMessage.show();
+ } else {
+ _rootProjectDirectory = QDir(_rootProjectDirectoryString);
+ _xmlFilesList = _xmlFileManager->generateXmlFiles(_rootProjectDirectory);
+ _xmlCount = _xmlFilesList.count();
}
-
- return true;
}
-QStringList GccXmlArchitectureRecoveryBackendPlugin::findConstructorsFromXml()
+void GccXmlArchitectureRecoveryBackendPlugin::recoverDependencyRelations()
{
- QStringList constructors;
+ QString fileName;
- openXmlFile(_rootProjectDir.absolutePath() + "/" + _xmlFileName);
- QString className = _xmlFileName;
- className.replace(".xml", "");
- while (!_xmlReader->atEnd() && !_xmlReader->hasError()) {
- QXmlStreamReader::TokenType token = _xmlReader->readNext();
+ for (int i = 0; i < _xmlCount; ++i) {
+ fileName = _xmlFilesList.at(i).toLocal8Bit().constData();
- if (token == QXmlStreamReader::StartElement) {
- if (_xmlReader->name() == "Constructor") {
- QXmlStreamAttributes attributes = _xmlReader->attributes();
+ _reader = new XmlFileReader(_rootProjectDirectory.absolutePath(), fileName);
- QString attribute = attributes.value("demangled").toString();
- if (attribute.contains(className + "::", Qt::CaseInsensitive)) {
- constructors.append(attribute);
- }
- }
- }
- }
- if (_xmlFile.isOpen()) {
- _xmlFile.close();
- }
-
- return constructors;
-}
+ _reader->fillTagContainers();
-QObject *GccXmlArchitectureRecoveryBackendPlugin::extractComponent()
-{
- QObject *component = new QObject;
- QString className;
- QStringList constructors = findConstructorsFromXml();
+ _fileClasses.insert(fileName, _reader->fileClasses());
+ _fileFields.insert(fileName, _reader->fileFields());
+ _filePointers.insert(fileName, _reader->filePointers());
+ _fileBases.insert(fileName, _reader->fileBases());
+ _fileArguments.insert(fileName, _reader->fileArguments());
- if (!constructors.isEmpty()) {
- QString expression = constructors.last();
- QStringList elements = expression.split("::");
- className = elements.at(0) + "::" + elements.at(1);
+ fieldAdjacencies();
+ baseAdjacencies();
+ argumentsAdjacencies();
- component->setObjectName(className);
- } else {
- className = _xmlFileName;
- className.replace(".xml", "");
- component->setObjectName(className);
+ qDebug() << "Tamanho de dependencyRelations: " << _dependencyRelations.count();
}
-
- findFunctionsFromXml(component);
-
- return component;
}
-void GccXmlArchitectureRecoveryBackendPlugin::findFunctionsFromXml(QObject *component)
+void GccXmlArchitectureRecoveryBackendPlugin::fieldAdjacencies()
{
- QHash<QString, QMultiHash<QString, QString> > classFunctions;
-
- openXmlFile(_rootProjectDir.absolutePath() + "/" + _xmlFileName);
-
- QStringList expression = component->objectName().split("::");
- QString classNamespace = expression.first();
-
- while (!_xmlReader->atEnd() && !_xmlReader->hasError()) {
- QXmlStreamReader::TokenType token = _xmlReader->readNext();
-
- if (token == QXmlStreamReader::StartElement) {
- if ((_xmlReader->name() == "Method") ||
- (_xmlReader->name() == "Constructor") ||
- (_xmlReader->name() == "Destructor")) {
- QString attribute = _xmlReader->attributes().value("demangled").toString();
+ QString fileName;
+
+ for (int i = 0; i < _xmlCount; ++i) {
+
+ fileName = _xmlFilesList.at(i).toLocal8Bit().constData();
+
+ QMap<QString, QString> classes = _fileClasses.value(fileName);
+ QList<QPair<QString, QString> > fields = _fileFields.value(fileName);
+ QMap<QString, QString> pointers = _filePointers.value(fileName);
+
+ QString dependent;
+ QString dependency;
+
+ QStringList classIds = classes.keys();
+ foreach (QString classId, classIds) {
+ dependent = classes.value(classId);
+ for (int i = 0; i < fields.size(); ++i) {
+ QPair<QString, QString> field = fields.at(i);
+ if (classId == field.first) {
+ if (classes.value(field.second).isEmpty()) {
+ QStringList pointersId = pointers.keys();
+ foreach (QString pointerId, pointersId) {
+ if (field.second == pointerId) {
+ if (!classes.value(pointers.value(pointerId)).isEmpty()) {
+ dependency = classes.value(pointers.value(pointerId));
+ }
+ }
+ }
+ } else {
+ dependency = classes.value(field.second);
+ }
+ }
- if (attribute.contains(classNamespace + "::", Qt::CaseInsensitive)) {
- classFunctions = classFunctionsContainer(attribute, classFunctions);
+ if (!_dependencyRelations.keys().contains(dependent)) {
+ if (!dependent.isEmpty() && !dependency.isEmpty()) {
+ _dependencyRelations.insert(dependent, dependency);
+ }
+ } else {
+ bool isNewDependencie = false;
+ QStringList dependencies = _dependencyRelations.values(dependent);
+ foreach (QString d, dependencies) {
+ if (dependency == d) {
+ isNewDependencie = true;
+ }
+ }
+ if (isNewDependencie == false) {
+ if (!dependent.isEmpty() && !dependency.isEmpty()) {
+ _dependencyRelations.insert(dependent, dependency);
+ }
+ }
}
+
+ dependency = "";
}
}
}
- if (_xmlFile.isOpen()) {
- _xmlFile.close();
- }
-
- component->setProperty("Functions", QVariant::fromValue(classFunctions));
}
-QHash<QString, QMultiHash<QString, QString> > GccXmlArchitectureRecoveryBackendPlugin::classFunctionsContainer(QString xmlAttribute, QHash<QString, QMultiHash<QString, QString> > &classFunctions)
+void GccXmlArchitectureRecoveryBackendPlugin::baseAdjacencies()
{
- QMultiHash<QString, QString> function;
+ QString fileName;
- QStringList signature = xmlAttribute.split("::");
- QString className = signature.at(0) + "::" + signature.at(1);
- QString functionName = signature.at(2).left(signature.at(2).indexOf("("));
+ for (int i = 0; i < _xmlCount; ++i) {
- findFunctionParameters(functionName, function);
- classFunctions.insert(className, function);
+ fileName = _xmlFilesList.at(i).toLocal8Bit().constData();
- return classFunctions;
-}
+ QMap<QString, QString> classes = _fileClasses.value(fileName);
+ QList<QPair<QString, QString> > bases = _fileBases.value(fileName);
-void GccXmlArchitectureRecoveryBackendPlugin::findFunctionParameters(const QString &functionName, QMultiHash<QString, QString> &function)
-{
- while (_xmlReader->readNextStartElement()) {
- if (!_xmlReader->attributes().value("name").toString().isEmpty()) {
- QString parameterName = _xmlReader->attributes().value("name").toString();
- QString typeID = _xmlReader->attributes().value("type").toString();
-
- QString parameterTypeNumber = findTypeNumber(typeID);
- QString parameterType = findType(parameterTypeNumber);
- if (parameterType == "") {
- parameterType = findType(typeID);
- }
+ QString dependent;
+ QString dependency;
- function.insert(functionName, parameterName + " " + parameterType);
- }
- }
-}
-
-QString GccXmlArchitectureRecoveryBackendPlugin::findTypeNumber(const QString &typeID)
-{
- QFile file(_rootProjectDir.absolutePath() + "/" + _xmlFileName);
- QXmlStreamReader *typeNumberCollector = new QXmlStreamReader(&file);
- file.open(QIODevice::ReadOnly | QIODevice::Text);
-
- while (!typeNumberCollector->atEnd() && !typeNumberCollector->hasError()) {
- QXmlStreamReader::TokenType token = typeNumberCollector->readNext();
+ QStringList classIds = classes.keys();
+ foreach (QString classId, classIds) {
+ dependent = classes.value(classId);
+ for (int i = 0; i < bases.size(); ++i) {
+ QPair<QString, QString> base = bases.at(i);
+ if (classId == base.first) {
+ dependency = classes.value(base.second);
+ }
+ }
- if (token == QXmlStreamReader::StartElement) {
- if (typeNumberCollector->name() == "PointerType") {
- if (typeNumberCollector->attributes().value("id").toString() == typeID) {
- break;
+ if (!_dependencyRelations.keys().contains(dependent)) {
+ if (!dependent.isEmpty() && !dependency.isEmpty()) {
+ _dependencyRelations.insert(dependent, dependency);
+ }
+ } else {
+ bool isNewDependencie = false;
+ QStringList dependencies = _dependencyRelations.values(dependent);
+ foreach (QString d, dependencies) {
+ if (dependency == d) {
+ isNewDependencie = true;
+ }
+ }
+ if (isNewDependencie == false) {
+ if (!dependent.isEmpty() && !dependency.isEmpty()) {
+ _dependencyRelations.insert(dependent, dependency);
+ }
}
}
+
+ dependency = "";
}
}
-
- QString typeNumber = typeNumberCollector->attributes().value("type").toString();
-
- file.close();
- delete typeNumberCollector;
-
- return typeNumber;
}
-QString GccXmlArchitectureRecoveryBackendPlugin::findType(const QString &typeNumber)
+void GccXmlArchitectureRecoveryBackendPlugin::argumentsAdjacencies()
{
- QFile file(_rootProjectDir.absolutePath() + "/" + _xmlFileName);
- QXmlStreamReader *typeCollector = new QXmlStreamReader(&file);
- file.open(QIODevice::ReadOnly | QIODevice::Text);
-
- while (!typeCollector->atEnd() && !typeCollector->hasError()) {
- QXmlStreamReader::TokenType token = typeCollector->readNext();
+ QString fileName;
+
+ for (int i = 0; i < _xmlCount; ++i) {
+
+ fileName = _xmlFilesList.at(i).toLocal8Bit().constData();
+
+ QMap<QString, QString> classes = _fileClasses.value(fileName);
+ QList<QPair<QString, QString> > arguments = _fileArguments.value(fileName);
+ QMap<QString, QString> pointers = _filePointers.value(fileName);
+
+ QString dependent;
+ QString dependency;
+
+ QStringList classIds = classes.keys();
+ foreach (QString classId, classIds) {
+ dependent = classes.value(classId);
+ for (int i = 0; i < arguments.size(); ++i) {
+ QPair<QString, QString> argument = arguments.at(i);
+ if (classId == argument.first) {
+ if (classes.value(argument.second).isEmpty()) {
+ QStringList pointersId = pointers.keys();
+ foreach (QString pointerId, pointersId) {
+ if (argument.second == pointerId) {
+ if (!classes.value(pointers.value(pointerId)).isEmpty()) {
+ dependency = classes.value(pointers.value(pointerId));
+ }
+ }
+ }
+ } else {
+ dependency = classes.value(argument.second);
+ }
+ }
+ }
- if (token == QXmlStreamReader::StartElement) {
- if (typeCollector->name() == "Class") {
- if (typeCollector->attributes().value("id").toString() == typeNumber) {
- break;
+ if (!_dependencyRelations.keys().contains(dependent)) {
+ if (!dependent.isEmpty() && !dependency.isEmpty()) {
+ _dependencyRelations.insert(dependent, dependency);
+ }
+ } else {
+ bool isNewDependencie = false;
+ QStringList dependencies = _dependencyRelations.values(dependent);
+ foreach (QString d, dependencies) {
+ if (dependency == d) {
+ isNewDependencie = true;
+ }
+ }
+ if (isNewDependencie == false) {
+ if (!dependent.isEmpty() && !dependency.isEmpty()) {
+ _dependencyRelations.insert(dependent, dependency);
+ }
}
}
+
+ dependency = "";
}
}
-
- QString type = typeCollector->attributes().value("name").toString();
-
- file.close();
- delete typeCollector;
-
- return type;
}
}