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