diff options
Diffstat (limited to 'src/plugins/cpptools/cpptoolsjsextension.cpp')
-rw-r--r-- | src/plugins/cpptools/cpptoolsjsextension.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/plugins/cpptools/cpptoolsjsextension.cpp b/src/plugins/cpptools/cpptoolsjsextension.cpp index 4c283fc644..03a0d3df99 100644 --- a/src/plugins/cpptools/cpptoolsjsextension.cpp +++ b/src/plugins/cpptools/cpptoolsjsextension.cpp @@ -29,10 +29,15 @@ #include <coreplugin/icore.h> +#include <projectexplorer/project.h> +#include <projectexplorer/projectnodes.h> +#include <projectexplorer/session.h> + #include <utils/codegeneration.h> #include <utils/fileutils.h> #include <QFileInfo> +#include <QStringList> #include <QTextStream> namespace CppTools { @@ -113,5 +118,69 @@ QString CppToolsJsExtension::closeNamespaces(const QString &klass) const return result; } +QString CppToolsJsExtension::includeStatement( + const QString &fullyQualifiedClassName, + const QString &suffix, + const QString &specialClasses, + const QString &pathOfIncludingFile + ) +{ + if (fullyQualifiedClassName.isEmpty()) + return {}; + const QString className = parts(fullyQualifiedClassName).last(); + if (className.isEmpty() || specialClasses.contains(className)) + return {}; + if (className.startsWith('Q') && className.length() > 2 && className.at(1).isUpper()) + return "#include <" + className + ">\n"; + const auto withUnderScores = [&className] { + QString baseName = className; + baseName[0] = baseName[0].toLower(); + for (int i = 1; i < baseName.length(); ++i) { + if (baseName[i].isUpper()) { + baseName.insert(i, '_'); + baseName[i + 1] = baseName[i + 1].toLower(); + ++i; + } + } + return baseName; + }; + QStringList candidates{className + '.' + suffix}; + bool hasUpperCase = false; + bool hasLowerCase = false; + for (int i = 0; i < className.length() && (!hasUpperCase || !hasLowerCase); ++i) { + if (className.at(i).isUpper()) + hasUpperCase = true; + if (className.at(i).isLower()) + hasLowerCase = true; + } + if (hasUpperCase) + candidates << className.toLower() + '.' + suffix; + if (hasUpperCase && hasLowerCase) + candidates << withUnderScores() + '.' + suffix; + candidates.removeDuplicates(); + using namespace ProjectExplorer; + const auto nodeMatchesFileName = [&candidates](Node *n) { + if (const FileNode * const fileNode = n->asFileNode()) { + if (fileNode->fileType() == FileType::Header + && candidates.contains(fileNode->filePath().fileName())) { + return true; + } + } + return false; + }; + for (const Project * const p : SessionManager::projects()) { + const Node *theNode = p->rootProjectNode()->findNode(nodeMatchesFileName); + if (theNode) { + const bool sameDir = pathOfIncludingFile == theNode->filePath().toFileInfo().path(); + return QString("#include ") + .append(sameDir ? '"' : '<') + .append(theNode->filePath().fileName()) + .append(sameDir ? '"' : '>') + .append('\n'); + } + } + return {}; +} + } // namespace Internal } // namespace CppTools |