File: ada_colorizer.cpp

package info (click to toggle)
kdevelop3 4%3A3.2.0-1
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 58,220 kB
  • ctags: 33,997
  • sloc: cpp: 278,404; ansic: 48,238; sh: 23,721; tcl: 19,882; perl: 5,498; makefile: 4,717; ruby: 1,610; python: 1,549; awk: 1,484; xml: 563; java: 359; php: 20; asm: 14; ada: 5; pascal: 4; fortran: 4; haskell: 2; sql: 1
file content (149 lines) | stat: -rw-r--r-- 3,558 bytes parent folder | download | duplicates (2)
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
 * Copyright (C) 2003 Oliver Kellogg
 * okellogg@users.sourceforge.net
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */
#include "ada_colorizer.h"
#include "qeditor.h"
#include "paragdata.h"

#include <qfont.h>
#include <qapplication.h>
#include <qsettings.h>
#include <private/qrichtext_p.h>
#include <kdebug.h>

static const char *ada_keywords[] = {
    "abort",
    "abs",
    "accept",
    "access",
    "all",
    "and",
    "array",
    "at",
    "begin",
    "body",
    "case",
    "constant",
    "declare",
    "delay",
    "delta",
    "digits",
    "do",
    "else",
    "elsif",
    "end",
    "entry",
    "exception",
    "exit",
    "for",
    "function",
    "generic",
    "goto",
    "if",
    "in",
    "is",
    "limited",
    "loop",
    "mod",
    "new",
    "not",
    "null",
    "of",
    "or",
    "others",
    "out",
    "package",
    "pragma",
    "private",
    "procedure",
    "raise",
    "range",
    "record",
    "rem",
    "renames",
    "return",
    "reverse",
    "select",
    "separate",
    "subtype",
    "task",
    "terminate",
    "then",
    "type",
    "use",
    "when",
    "while",
    "with",
    "xor",
    0
};

AdaColorizer::AdaColorizer (QEditor * editor)
    : QSourceColorizer (editor)
{
    //default context
    HLItemCollection* context0 = new HLItemCollection (0);
    context0->appendChild (new StartsWithHLItem ("--", Comment, 0));
    context0->appendChild (new KeywordsHLItem (ada_keywords, Keyword, Normal, 0));
    context0->appendChild (new WhiteSpacesHLItem (Normal, 0));
    context0->appendChild (new StringHLItem ("\"", String, 1));
    context0->appendChild (new NumberHLItem (Constant, 0));
    context0->appendChild (new RegExpHLItem ("[0-9][0-9]*#[A-Fa-f0-9]*#", Constant, 0));

    HLItemCollection* context1 = new HLItemCollection (String);
    context1->appendChild (new StringHLItem ("\"", String, 0));

    m_items.append (context0);
    m_items.append (context1);
}

AdaColorizer::~AdaColorizer ()
{
}

int AdaColorizer::computeLevel (QTextParagraph* parag, int startLevel)
{
    int level = startLevel;

    QString s = editor ()->text (parag->paragId ());
    ParagData* data = (ParagData*) parag->extraData ();
    if (!data || s.isEmpty ()) {
        kdDebug() << "AdaColorizer::computeLevel: early return" << endl;
        return startLevel;
    }

    data->setBlockStart (false);

    // Level starters for Ada:  begin, case, do, if, loop, select, while
    QRegExp startRx ("^\\s*(begin|case|if|loop|select|while)\\b", false);
    
    // We need another regexp for loops such as "for I in 1 .. 2 loop" because
    // the keyword does not appear at the start of the line.
    // We do not use the keyword "for" here because its meaning is overloaded.
    // We must also guard against matching the statement "end loop".
    QRegExp startLoopRx ("\\bloop\\s*(--.*)?$", false);

    // Level terminators for Ada: end
    QRegExp endRx ("^\\s*end\\b", false);

    if (startRx.search (s) != -1 || startLoopRx.search (s) != -1)
        ++level;
    else if (endRx.search (s) != -1)
        --level;

    if (level > startLevel) {
        data->setBlockStart (true);
    }

    kdDebug() << "AdaColorizer::computeLevel called, startLevel="
              << startLevel << ", text: '" << s
              << "', level=" << level << endl;
    return level;
}