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