diff options
author | Neil <nyamatongwe@gmail.com> | 2017-06-22 18:04:29 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2017-06-22 18:04:29 +1000 |
commit | fd8ab2d18eb5ce51f3ebfdfd97b9d1f7a0c5d873 (patch) | |
tree | f323f9d912411c44a4b3bc513a49b69e49c7438a | |
parent | 3a993f0a5e97435874e06d5496085c4cb7a0d4cb (diff) | |
download | scintilla-mirror-fd8ab2d18eb5ce51f3ebfdfd97b9d1f7a0c5d873.tar.gz |
Backport: Basic implementation helpers for style metadata.
Backport of changeset 6347:69b7471ad62f.
-rw-r--r-- | lexlib/DefaultLexer.cxx | 17 | ||||
-rw-r--r-- | lexlib/DefaultLexer.h | 4 | ||||
-rw-r--r-- | lexlib/LexAccessor.h | 7 | ||||
-rw-r--r-- | lexlib/LexerBase.cxx | 17 | ||||
-rw-r--r-- | lexlib/LexerBase.h | 4 | ||||
-rw-r--r-- | lexlib/LexerModule.cxx | 16 | ||||
-rw-r--r-- | lexlib/LexerModule.h | 9 | ||||
-rw-r--r-- | lexlib/LexerSimple.cxx | 4 |
8 files changed, 57 insertions, 21 deletions
diff --git a/lexlib/DefaultLexer.cxx b/lexlib/DefaultLexer.cxx index 4089273f7..181533564 100644 --- a/lexlib/DefaultLexer.cxx +++ b/lexlib/DefaultLexer.cxx @@ -26,7 +26,8 @@ using namespace Scintilla; static const char styleSubable[] = { 0 }; -DefaultLexer::DefaultLexer() { +DefaultLexer::DefaultLexer(const LexicalClass *lexClasses_, size_t nClasses_) : + lexClasses(lexClasses_), nClasses(nClasses_) { } DefaultLexer::~DefaultLexer() { @@ -110,17 +111,17 @@ const char * SCI_METHOD DefaultLexer::GetSubStyleBases() { } int SCI_METHOD DefaultLexer::NamedStyles() { - return 0; + return static_cast<int>(nClasses); } -const char * SCI_METHOD DefaultLexer::NameOfStyle(int) { - return ""; +const char * SCI_METHOD DefaultLexer::NameOfStyle(int style) { + return (style < NamedStyles()) ? lexClasses[style].name : ""; } -const char * SCI_METHOD DefaultLexer::TagsOfStyle(int) { - return ""; +const char * SCI_METHOD DefaultLexer::TagsOfStyle(int style) { + return (style < NamedStyles()) ? lexClasses[style].tags : ""; } -const char * SCI_METHOD DefaultLexer::DescriptionOfStyle(int) { - return ""; +const char * SCI_METHOD DefaultLexer::DescriptionOfStyle(int style) { + return (style < NamedStyles()) ? lexClasses[style].description : ""; } diff --git a/lexlib/DefaultLexer.h b/lexlib/DefaultLexer.h index 0e62a6320..80086b693 100644 --- a/lexlib/DefaultLexer.h +++ b/lexlib/DefaultLexer.h @@ -16,8 +16,10 @@ namespace Scintilla { // A simple lexer with no state class DefaultLexer : public ILexerWithMetaData { + const LexicalClass *lexClasses; + size_t nClasses; public: - DefaultLexer(); + DefaultLexer(const LexicalClass *lexClasses_ = nullptr, size_t nClasses_ = 0); virtual ~DefaultLexer(); void SCI_METHOD Release() override; int SCI_METHOD Version() const override; diff --git a/lexlib/LexAccessor.h b/lexlib/LexAccessor.h index 064a17581..5e5c9bfe4 100644 --- a/lexlib/LexAccessor.h +++ b/lexlib/LexAccessor.h @@ -197,6 +197,13 @@ public: } }; +struct LexicalClass { + int value; + const char *name; + const char *tags; + const char *description; +}; + #ifdef SCI_NAMESPACE } #endif diff --git a/lexlib/LexerBase.cxx b/lexlib/LexerBase.cxx index 5ebbe0958..13d3fa4e0 100644 --- a/lexlib/LexerBase.cxx +++ b/lexlib/LexerBase.cxx @@ -26,7 +26,8 @@ using namespace Scintilla; static const char styleSubable[] = { 0 }; -LexerBase::LexerBase() { +LexerBase::LexerBase(const LexicalClass *lexClasses_, size_t nClasses_) : + lexClasses(lexClasses_), nClasses(nClasses_) { for (int wl = 0; wl < numWordLists; wl++) keyWordLists[wl] = new WordList; keyWordLists[numWordLists] = 0; @@ -129,17 +130,17 @@ const char * SCI_METHOD LexerBase::GetSubStyleBases() { } int SCI_METHOD LexerBase::NamedStyles() { - return 0; + return static_cast<int>(nClasses); } -const char * SCI_METHOD LexerBase::NameOfStyle(int) { - return ""; +const char * SCI_METHOD LexerBase::NameOfStyle(int style) { + return (style < NamedStyles()) ? lexClasses[style].name : ""; } -const char * SCI_METHOD LexerBase::TagsOfStyle(int) { - return ""; +const char * SCI_METHOD LexerBase::TagsOfStyle(int style) { + return (style < NamedStyles()) ? lexClasses[style].tags : ""; } -const char * SCI_METHOD LexerBase::DescriptionOfStyle(int) { - return ""; +const char * SCI_METHOD LexerBase::DescriptionOfStyle(int style) { + return (style < NamedStyles()) ? lexClasses[style].description : ""; } diff --git a/lexlib/LexerBase.h b/lexlib/LexerBase.h index f320633ef..c9f447c96 100644 --- a/lexlib/LexerBase.h +++ b/lexlib/LexerBase.h @@ -15,11 +15,13 @@ namespace Scintilla { // A simple lexer with no state class LexerBase : public ILexerWithMetaData { protected: + const LexicalClass *lexClasses; + size_t nClasses; PropSetSimple props; enum {numWordLists=KEYWORDSET_MAX+1}; WordList *keyWordLists[numWordLists+1]; public: - LexerBase(); + LexerBase(const LexicalClass *lexClasses_=nullptr, size_t nClasses_=0); virtual ~LexerBase(); void SCI_METHOD Release() override; int SCI_METHOD Version() const override; diff --git a/lexlib/LexerModule.cxx b/lexlib/LexerModule.cxx index a9fc4f522..a7f01b303 100644 --- a/lexlib/LexerModule.cxx +++ b/lexlib/LexerModule.cxx @@ -30,12 +30,16 @@ LexerModule::LexerModule(int language_, LexerFunction fnLexer_, const char *languageName_, LexerFunction fnFolder_, - const char *const wordListDescriptions_[]) : + const char *const wordListDescriptions_[], + const LexicalClass *lexClasses_, + size_t nClasses_) : language(language_), fnLexer(fnLexer_), fnFolder(fnFolder_), fnFactory(0), wordListDescriptions(wordListDescriptions_), + lexClasses(lexClasses_), + nClasses(nClasses_), languageName(languageName_) { } @@ -48,6 +52,8 @@ LexerModule::LexerModule(int language_, fnFolder(0), fnFactory(fnFactory_), wordListDescriptions(wordListDescriptions_), + lexClasses(nullptr), + nClasses(0), languageName(languageName_) { } @@ -74,6 +80,14 @@ const char *LexerModule::GetWordListDescription(int index) const { } } +const LexicalClass *LexerModule::LexClasses() const { + return lexClasses; +} + +size_t LexerModule::NamedStyles() const { + return nClasses; +} + ILexer *LexerModule::Create() const { if (fnFactory) return fnFactory(); diff --git a/lexlib/LexerModule.h b/lexlib/LexerModule.h index ca1d86ce5..f9248eca7 100644 --- a/lexlib/LexerModule.h +++ b/lexlib/LexerModule.h @@ -14,6 +14,7 @@ namespace Scintilla { class Accessor; class WordList; +struct LexicalClass; typedef void (*LexerFunction)(Sci_PositionU startPos, Sci_Position lengthDoc, int initStyle, WordList *keywordlists[], Accessor &styler); @@ -31,6 +32,8 @@ protected: LexerFunction fnFolder; LexerFactoryFunction fnFactory; const char * const * wordListDescriptions; + const LexicalClass *lexClasses; + size_t nClasses; public: const char *languageName; @@ -38,7 +41,9 @@ public: LexerFunction fnLexer_, const char *languageName_=0, LexerFunction fnFolder_=0, - const char * const wordListDescriptions_[] = NULL); + const char * const wordListDescriptions_[] = NULL, + const LexicalClass *lexClasses_=nullptr, + size_t nClasses_=0); LexerModule(int language_, LexerFactoryFunction fnFactory_, const char *languageName_, @@ -50,6 +55,8 @@ public: // -1 is returned if no WordList information is available int GetNumWordLists() const; const char *GetWordListDescription(int index) const; + const LexicalClass *LexClasses() const; + size_t NamedStyles() const; ILexer *Create() const; diff --git a/lexlib/LexerSimple.cxx b/lexlib/LexerSimple.cxx index f741e0fef..3df15d32d 100644 --- a/lexlib/LexerSimple.cxx +++ b/lexlib/LexerSimple.cxx @@ -26,7 +26,9 @@ using namespace Scintilla; #endif -LexerSimple::LexerSimple(const LexerModule *module_) : module(module_) { +LexerSimple::LexerSimple(const LexerModule *module_) : + LexerBase(module_->LexClasses(), module_->NamedStyles()), + module(module_) { for (int wl = 0; wl < module->GetNumWordLists(); wl++) { if (!wordLists.empty()) wordLists += "\n"; |