aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/syntax-highlighting/src/lib/context_p.h
blob: 8cf0f1bfaba05d9a5db99ad5cf3b082e81b4de9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
    SPDX-FileCopyrightText: 2016 Volker Krause <vkrause@kde.org>

    SPDX-License-Identifier: MIT
*/

#ifndef KSYNTAXHIGHLIGHTING_CONTEXT_P_H
#define KSYNTAXHIGHLIGHTING_CONTEXT_P_H

#include "contextswitch_p.h"
#include "format.h"
#include "highlightingdata_p.hpp"
#include "rule_p.h"

#include <QString>

#include <vector>

namespace KSyntaxHighlighting
{
class DefinitionData;

class Context
{
public:
    Q_DISABLE_COPY(Context)

    Context(Context &&) = default;
    Context &operator=(Context &&) = default;

    Context(const DefinitionData &def, const HighlightingContextData &data);
    ~Context() = default;

    const QString &name() const
    {
        return m_name;
    }

    const ContextSwitch &lineEndContext() const
    {
        return m_lineEndContext;
    }

    const ContextSwitch &lineEmptyContext() const
    {
        return m_lineEmptyContext;
    }

    bool fallthrough() const
    {
        return !m_fallthroughContext.isStay();
    }

    bool hasDynamicRule() const
    {
        return m_hasDynamicRule;
    }

    bool stopEmptyLineContextSwitchLoop() const
    {
        return m_stopEmptyLineContextSwitchLoop;
    }

    const ContextSwitch &fallthroughContext() const
    {
        return m_fallthroughContext;
    }

    const Format &attributeFormat() const
    {
        return m_attributeFormat;
    }

    const std::vector<Rule::Ptr> &rules() const
    {
        return m_rules;
    }

    /**
     * Returns @c true, when indentationBasedFolding is enabled for the
     * associated Definition and when "noIndentationBasedFolding" is NOT set.
     */
    bool indentationBasedFoldingEnabled() const;

    void resolveContexts(DefinitionData &def, const HighlightingContextData &data);
    void resolveIncludes(DefinitionData &def);

private:
    enum ResolveState : quint8 { Unresolved, Resolving, Resolved };

    std::vector<Rule::Ptr> m_rules;

    QString m_name;

    ContextSwitch m_lineEndContext;
    ContextSwitch m_lineEmptyContext;
    ContextSwitch m_fallthroughContext;

    /**
     * resolved format for our attribute, done in constructor and resolveIncludes
     */
    Format m_attributeFormat;

    ResolveState m_resolveState = Unresolved;
    bool m_hasDynamicRule = false;
    bool m_stopEmptyLineContextSwitchLoop = true;
    bool m_indentationBasedFolding;
};
}

#endif // KSYNTAXHIGHLIGHTING_CONTEXT_P_H