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