xref: /MusicPlayer2/scintilla/lexlib/LexerModule.cxx (revision 8af74909132ed5e696cb05b6689ae4baf14c1c96)
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