diff options
Diffstat (limited to 'src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp')
-rw-r--r-- | src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp index fe5f77586a..f042baac27 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp @@ -22,6 +22,9 @@ */ #include "keywordlist_p.h" +#include "repository.h" +#include "definition_p.h" +#include "ksyntaxhighlighting_logging.h" #include <QDebug> #include <QXmlStreamReader> @@ -58,6 +61,11 @@ void KeywordList::load(QXmlStreamReader& reader) reader.readNextStartElement(); break; } + else if (reader.name() == QLatin1String("include")) { + m_includes.append(reader.readElementText().trimmed()); + reader.readNextStartElement(); + break; + } reader.readNext(); break; case QXmlStreamReader::EndElement: @@ -102,3 +110,40 @@ void KeywordList::initLookupForCaseSensitivity(Qt::CaseSensitivity caseSensitive */ std::sort(vectorToSort.begin(), vectorToSort.end(), [caseSensitive] (const QStringRef &a, const QStringRef &b) { return a.compare(b, caseSensitive) < 0; }); } + +void KeywordList::resolveIncludeKeywords(DefinitionData &def) +{ + while (!m_includes.isEmpty()) { + const auto kw_include = std::move(m_includes.back()); + m_includes.pop_back(); + + const auto idx = kw_include.indexOf(QLatin1String("##")); + KeywordList *keywords = nullptr; + + if (idx >= 0) { + auto listName = kw_include.left(idx); + auto defName = kw_include.mid(idx + 2); + auto includeDef = def.repo->definitionForName(defName); + if (includeDef.isValid()) { + auto defData = DefinitionData::get(includeDef); + defData->load(DefinitionData::OnlyKeywords(true)); + keywords = defData->keywordList(listName); + } + else { + qCWarning(Log) << "Unable to resolve external include keyword for definition" << defName << "in" << def.name; + } + } else { + keywords = def.keywordList(kw_include); + } + + if (keywords) { + if (this != keywords) { + keywords->resolveIncludeKeywords(def); + } + m_keywords += keywords->m_keywords; + } + else { + qCWarning(Log) << "Unresolved include keyword" << kw_include << "in" << def.name; + } + } +} |