xref: /MusicPlayer2/scintilla/lexlib/LexerModule.h (revision 8af74909132ed5e696cb05b6689ae4baf14c1c96)
1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang /** @file LexerModule.h
3*8af74909SZhong Yang  ** Colourise for particular languages.
4*8af74909SZhong Yang  **/
5*8af74909SZhong Yang // Copyright 1998-2001 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 #ifndef LEXERMODULE_H
9*8af74909SZhong Yang #define LEXERMODULE_H
10*8af74909SZhong Yang 
11*8af74909SZhong Yang namespace Scintilla {
12*8af74909SZhong Yang 
13*8af74909SZhong Yang class Accessor;
14*8af74909SZhong Yang class WordList;
15*8af74909SZhong Yang struct LexicalClass;
16*8af74909SZhong Yang 
17*8af74909SZhong Yang typedef void (*LexerFunction)(Sci_PositionU startPos, Sci_Position lengthDoc, int initStyle,
18*8af74909SZhong Yang                   WordList *keywordlists[], Accessor &styler);
19*8af74909SZhong Yang typedef ILexer5 *(*LexerFactoryFunction)();
20*8af74909SZhong Yang 
21*8af74909SZhong Yang /**
22*8af74909SZhong Yang  * A LexerModule is responsible for lexing and folding a particular language.
23*8af74909SZhong Yang  * The Catalogue class maintains a list of LexerModules which can be searched to find a
24*8af74909SZhong Yang  * module appropriate to a particular language.
25*8af74909SZhong Yang  * The ExternalLexerModule subclass holds lexers loaded from DLLs or shared libraries.
26*8af74909SZhong Yang  */
27*8af74909SZhong Yang class LexerModule {
28*8af74909SZhong Yang protected:
29*8af74909SZhong Yang 	int language;
30*8af74909SZhong Yang 	LexerFunction fnLexer;
31*8af74909SZhong Yang 	LexerFunction fnFolder;
32*8af74909SZhong Yang 	LexerFactoryFunction fnFactory;
33*8af74909SZhong Yang 	const char * const * wordListDescriptions;
34*8af74909SZhong Yang 	const LexicalClass *lexClasses;
35*8af74909SZhong Yang 	size_t nClasses;
36*8af74909SZhong Yang 
37*8af74909SZhong Yang public:
38*8af74909SZhong Yang 	const char *languageName;
39*8af74909SZhong Yang 	LexerModule(
40*8af74909SZhong Yang 		int language_,
41*8af74909SZhong Yang 		LexerFunction fnLexer_,
42*8af74909SZhong Yang 		const char *languageName_=nullptr,
43*8af74909SZhong Yang 		LexerFunction fnFolder_= nullptr,
44*8af74909SZhong Yang 		const char * const wordListDescriptions_[]=nullptr,
45*8af74909SZhong Yang 		const LexicalClass *lexClasses_=nullptr,
46*8af74909SZhong Yang 		size_t nClasses_=0) noexcept;
47*8af74909SZhong Yang 	LexerModule(
48*8af74909SZhong Yang 		int language_,
49*8af74909SZhong Yang 		LexerFactoryFunction fnFactory_,
50*8af74909SZhong Yang 		const char *languageName_,
51*8af74909SZhong Yang 		const char * const wordListDescriptions_[]=nullptr) noexcept;
52*8af74909SZhong Yang 	int GetLanguage() const noexcept;
53*8af74909SZhong Yang 
54*8af74909SZhong Yang 	// -1 is returned if no WordList information is available
55*8af74909SZhong Yang 	int GetNumWordLists() const noexcept;
56*8af74909SZhong Yang 	const char *GetWordListDescription(int index) const noexcept;
57*8af74909SZhong Yang 	const LexicalClass *LexClasses() const noexcept;
58*8af74909SZhong Yang 	size_t NamedStyles() const noexcept;
59*8af74909SZhong Yang 
60*8af74909SZhong Yang 	ILexer5 *Create() const;
61*8af74909SZhong Yang 
62*8af74909SZhong Yang 	void Lex(Sci_PositionU startPos, Sci_Position lengthDoc, int initStyle,
63*8af74909SZhong Yang                   WordList *keywordlists[], Accessor &styler) const;
64*8af74909SZhong Yang 	void Fold(Sci_PositionU startPos, Sci_Position lengthDoc, int initStyle,
65*8af74909SZhong Yang                   WordList *keywordlists[], Accessor &styler) const;
66*8af74909SZhong Yang 
67*8af74909SZhong Yang 	friend class CatalogueModules;
68*8af74909SZhong Yang };
69*8af74909SZhong Yang 
Maximum(int a,int b)70*8af74909SZhong Yang inline int Maximum(int a, int b) noexcept {
71*8af74909SZhong Yang 	return (a > b) ? a : b;
72*8af74909SZhong Yang }
73*8af74909SZhong Yang 
74*8af74909SZhong Yang // Shut up annoying Visual C++ warnings:
75*8af74909SZhong Yang #ifdef _MSC_VER
76*8af74909SZhong Yang #pragma warning(disable: 4244 4456 4457)
77*8af74909SZhong Yang #endif
78*8af74909SZhong Yang 
79*8af74909SZhong Yang // Turn off shadow warnings for lexers as may be maintained by others
80*8af74909SZhong Yang #if defined(__GNUC__)
81*8af74909SZhong Yang #pragma GCC diagnostic ignored "-Wshadow"
82*8af74909SZhong Yang #endif
83*8af74909SZhong Yang 
84*8af74909SZhong Yang // Clang doesn't like omitting braces in array initialization but they just add
85*8af74909SZhong Yang // noise to LexicalClass arrays in lexers
86*8af74909SZhong Yang #if defined(__clang__)
87*8af74909SZhong Yang #pragma clang diagnostic ignored "-Wmissing-braces"
88*8af74909SZhong Yang #endif
89*8af74909SZhong Yang 
90*8af74909SZhong Yang }
91*8af74909SZhong Yang 
92*8af74909SZhong Yang #endif
93