1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang /** @file LexerModule.cxx
3*8af74909SZhong Yang ** Colourise for particular languages.
4*8af74909SZhong Yang **/
5*8af74909SZhong Yang // Copyright 1998-2010 by Neil Hodgson <[email protected]>
6*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed.
7*8af74909SZhong Yang
8*8af74909SZhong Yang #include <cstdlib>
9*8af74909SZhong Yang #include <cassert>
10*8af74909SZhong Yang
11*8af74909SZhong Yang #include <string>
12*8af74909SZhong Yang
13*8af74909SZhong Yang #include "ILexer.h"
14*8af74909SZhong Yang #include "Scintilla.h"
15*8af74909SZhong Yang #include "SciLexer.h"
16*8af74909SZhong Yang
17*8af74909SZhong Yang #include "PropSetSimple.h"
18*8af74909SZhong Yang #include "WordList.h"
19*8af74909SZhong Yang #include "LexAccessor.h"
20*8af74909SZhong Yang #include "Accessor.h"
21*8af74909SZhong Yang #include "LexerModule.h"
22*8af74909SZhong Yang #include "LexerBase.h"
23*8af74909SZhong Yang #include "LexerSimple.h"
24*8af74909SZhong Yang
25*8af74909SZhong Yang using namespace Scintilla;
26*8af74909SZhong Yang
LexerModule(int language_,LexerFunction fnLexer_,const char * languageName_,LexerFunction fnFolder_,const char * const wordListDescriptions_[],const LexicalClass * lexClasses_,size_t nClasses_)27*8af74909SZhong Yang LexerModule::LexerModule(int language_,
28*8af74909SZhong Yang LexerFunction fnLexer_,
29*8af74909SZhong Yang const char *languageName_,
30*8af74909SZhong Yang LexerFunction fnFolder_,
31*8af74909SZhong Yang const char *const wordListDescriptions_[],
32*8af74909SZhong Yang const LexicalClass *lexClasses_,
33*8af74909SZhong Yang size_t nClasses_) noexcept :
34*8af74909SZhong Yang language(language_),
35*8af74909SZhong Yang fnLexer(fnLexer_),
36*8af74909SZhong Yang fnFolder(fnFolder_),
37*8af74909SZhong Yang fnFactory(nullptr),
38*8af74909SZhong Yang wordListDescriptions(wordListDescriptions_),
39*8af74909SZhong Yang lexClasses(lexClasses_),
40*8af74909SZhong Yang nClasses(nClasses_),
41*8af74909SZhong Yang languageName(languageName_) {
42*8af74909SZhong Yang }
43*8af74909SZhong Yang
LexerModule(int language_,LexerFactoryFunction fnFactory_,const char * languageName_,const char * const wordListDescriptions_[])44*8af74909SZhong Yang LexerModule::LexerModule(int language_,
45*8af74909SZhong Yang LexerFactoryFunction fnFactory_,
46*8af74909SZhong Yang const char *languageName_,
47*8af74909SZhong Yang const char * const wordListDescriptions_[]) noexcept :
48*8af74909SZhong Yang language(language_),
49*8af74909SZhong Yang fnLexer(nullptr),
50*8af74909SZhong Yang fnFolder(nullptr),
51*8af74909SZhong Yang fnFactory(fnFactory_),
52*8af74909SZhong Yang wordListDescriptions(wordListDescriptions_),
53*8af74909SZhong Yang lexClasses(nullptr),
54*8af74909SZhong Yang nClasses(0),
55*8af74909SZhong Yang languageName(languageName_) {
56*8af74909SZhong Yang }
57*8af74909SZhong Yang
GetLanguage() const58*8af74909SZhong Yang int LexerModule::GetLanguage() const noexcept {
59*8af74909SZhong Yang return language;
60*8af74909SZhong Yang }
61*8af74909SZhong Yang
GetNumWordLists() const62*8af74909SZhong Yang int LexerModule::GetNumWordLists() const noexcept {
63*8af74909SZhong Yang if (!wordListDescriptions) {
64*8af74909SZhong Yang return -1;
65*8af74909SZhong Yang } else {
66*8af74909SZhong Yang int numWordLists = 0;
67*8af74909SZhong Yang
68*8af74909SZhong Yang while (wordListDescriptions[numWordLists]) {
69*8af74909SZhong Yang ++numWordLists;
70*8af74909SZhong Yang }
71*8af74909SZhong Yang
72*8af74909SZhong Yang return numWordLists;
73*8af74909SZhong Yang }
74*8af74909SZhong Yang }
75*8af74909SZhong Yang
GetWordListDescription(int index) const76*8af74909SZhong Yang const char *LexerModule::GetWordListDescription(int index) const noexcept {
77*8af74909SZhong Yang assert(index < GetNumWordLists());
78*8af74909SZhong Yang if (!wordListDescriptions || (index >= GetNumWordLists())) {
79*8af74909SZhong Yang return "";
80*8af74909SZhong Yang } else {
81*8af74909SZhong Yang return wordListDescriptions[index];
82*8af74909SZhong Yang }
83*8af74909SZhong Yang }
84*8af74909SZhong Yang
LexClasses() const85*8af74909SZhong Yang const LexicalClass *LexerModule::LexClasses() const noexcept {
86*8af74909SZhong Yang return lexClasses;
87*8af74909SZhong Yang }
88*8af74909SZhong Yang
NamedStyles() const89*8af74909SZhong Yang size_t LexerModule::NamedStyles() const noexcept {
90*8af74909SZhong Yang return nClasses;
91*8af74909SZhong Yang }
92*8af74909SZhong Yang
Create() const93*8af74909SZhong Yang ILexer5 *LexerModule::Create() const {
94*8af74909SZhong Yang if (fnFactory)
95*8af74909SZhong Yang return fnFactory();
96*8af74909SZhong Yang else
97*8af74909SZhong Yang return new LexerSimple(this);
98*8af74909SZhong Yang }
99*8af74909SZhong Yang
Lex(Sci_PositionU startPos,Sci_Position lengthDoc,int initStyle,WordList * keywordlists[],Accessor & styler) const100*8af74909SZhong Yang void LexerModule::Lex(Sci_PositionU startPos, Sci_Position lengthDoc, int initStyle,
101*8af74909SZhong Yang WordList *keywordlists[], Accessor &styler) const {
102*8af74909SZhong Yang if (fnLexer)
103*8af74909SZhong Yang fnLexer(startPos, lengthDoc, initStyle, keywordlists, styler);
104*8af74909SZhong Yang }
105*8af74909SZhong Yang
Fold(Sci_PositionU startPos,Sci_Position lengthDoc,int initStyle,WordList * keywordlists[],Accessor & styler) const106*8af74909SZhong Yang void LexerModule::Fold(Sci_PositionU startPos, Sci_Position lengthDoc, int initStyle,
107*8af74909SZhong Yang WordList *keywordlists[], Accessor &styler) const {
108*8af74909SZhong Yang if (fnFolder) {
109*8af74909SZhong Yang Sci_Position lineCurrent = styler.GetLine(startPos);
110*8af74909SZhong Yang // Move back one line in case deletion wrecked current line fold state
111*8af74909SZhong Yang if (lineCurrent > 0) {
112*8af74909SZhong Yang lineCurrent--;
113*8af74909SZhong Yang const Sci_Position newStartPos = styler.LineStart(lineCurrent);
114*8af74909SZhong Yang lengthDoc += startPos - newStartPos;
115*8af74909SZhong Yang startPos = newStartPos;
116*8af74909SZhong Yang initStyle = 0;
117*8af74909SZhong Yang if (startPos > 0) {
118*8af74909SZhong Yang initStyle = styler.StyleAt(startPos - 1);
119*8af74909SZhong Yang }
120*8af74909SZhong Yang }
121*8af74909SZhong Yang fnFolder(startPos, lengthDoc, initStyle, keywordlists, styler);
122*8af74909SZhong Yang }
123*8af74909SZhong Yang }
124