9#include "definition_p.h"
11#include "ksyntaxhighlighting_logging.h"
12#include "repository.h"
17#include <QXmlStreamReader>
23 , m_attributeFormat(data.attribute.isEmpty() ?
Format() : def.formatByName(data.attribute))
24 , m_indentationBasedFolding(!data.noIndentationBasedFolding && def.indentationBasedFolding)
27 qCWarning(
Log) <<
"Context: Unknown format" << data.
attribute <<
"in context" << m_name <<
"of definition" << def.name;
31bool Context::indentationBasedFoldingEnabled()
const
33 return m_indentationBasedFolding;
38 m_lineEndContext.resolve(def, data.lineEndContext);
39 m_lineEmptyContext.resolve(def, data.lineEmptyContext);
40 m_fallthroughContext.resolve(def, data.fallthroughContext);
41 m_stopEmptyLineContextSwitchLoop = data.stopEmptyLineContextSwitchLoop;
47 if (m_lineEmptyContext.isStay()) {
48 m_lineEmptyContext = m_lineEndContext;
51 m_rules.reserve(data.rules.size());
52 for (
const auto &ruleData : data.rules) {
53 m_rules.push_back(Rule::create(def, ruleData, m_name));
54 if (!m_rules.back()) {
60void Context::resolveIncludes(DefinitionData &def)
62 if (m_resolveState == Resolved) {
65 if (m_resolveState == Resolving) {
66 qCWarning(
Log) <<
"Cyclic dependency!";
70 Q_ASSERT(m_resolveState == Unresolved);
71 m_resolveState = Resolving;
73 for (
auto it = m_rules.begin(); it != m_rules.end();) {
74 const IncludeRules *includeRules = it->get()->castToIncludeRules();
76 m_hasDynamicRule = m_hasDynamicRule || it->get()->isDynamic();
81 Context *context =
nullptr;
82 DefinitionData *defData = &def;
84 const auto &contextName = includeRules->contextName();
88 context = def.contextByName(contextName);
90 auto definitionName = contextName.mid(idx + 2);
91 auto includedDef = def.repo->definitionForName(definitionName);
92 if (!includedDef.isValid()) {
93 qCWarning(
Log) <<
"Unable to resolve external include rule for definition" << definitionName <<
"in" << def.name;
97 defData = DefinitionData::get(includedDef);
98 def.addImmediateIncludedDefinition(includedDef);
101 context = defData->initialContext();
108 qCWarning(
Log) <<
"Unable to resolve include rule for definition" << contextName <<
"in" << def.name;
113 if (context ==
this) {
114 qCWarning(
Log) <<
"Unable to resolve self include rule for definition" << contextName <<
"in" << def.name;
119 if (context->m_resolveState != Resolved) {
120 context->resolveIncludes(*defData);
123 m_hasDynamicRule = m_hasDynamicRule || context->m_hasDynamicRule;
129 if (includeRules->includeAttribute()) {
130 m_attributeFormat = context->m_attributeFormat;
133 it = m_rules.erase(it);
134 it = m_rules.insert(it, context->rules().begin(), context->rules().end());
135 it += context->rules().size();
138 m_resolveState = Resolved;
Represents the raw xml data of a context and its rules.
QString attribute
attribute name, to lookup our format
QString name(StandardShortcut id)
Syntax highlighting engine for Kate syntax definitions.
bool isEmpty() const const
QTextStream & left(QTextStream &stream)