aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2017-06-22 18:04:29 +1000
committerNeil <nyamatongwe@gmail.com>2017-06-22 18:04:29 +1000
commit35eed469ff0228dcfd205939d2b98b52da36a5b5 (patch)
tree3de7172292e6bc74822fd4833aa283ada04547dd
parentcac2f69f221ca31545681968fc746dc590f060bd (diff)
downloadscintilla-mirror-35eed469ff0228dcfd205939d2b98b52da36a5b5.tar.gz
Basic implementation helpers for style metadata.
-rw-r--r--lexlib/DefaultLexer.cxx17
-rw-r--r--lexlib/DefaultLexer.h4
-rw-r--r--lexlib/LexAccessor.h7
-rw-r--r--lexlib/LexerBase.cxx17
-rw-r--r--lexlib/LexerBase.h4
-rw-r--r--lexlib/LexerModule.cxx16
-rw-r--r--lexlib/LexerModule.h9
-rw-r--r--lexlib/LexerSimple.cxx4
8 files changed, 57 insertions, 21 deletions
diff --git a/lexlib/DefaultLexer.cxx b/lexlib/DefaultLexer.cxx
index 19221cc53..656c3d13d 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 372294e1a..9d2a0567d 100644
--- a/lexlib/DefaultLexer.h
+++ b/lexlib/DefaultLexer.h
@@ -16,8 +16,10 @@ namespace Scintilla {
// A simple lexer with no state
class DefaultLexer : public ILexer4 {
+ 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 0cf6e8ce0..9f786132b 100644
--- a/lexlib/LexAccessor.h
+++ b/lexlib/LexAccessor.h
@@ -184,6 +184,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 fdf8878a2..4e1c03991 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 66e7560e1..b0c50813c 100644
--- a/lexlib/LexerBase.h
+++ b/lexlib/LexerBase.h
@@ -15,11 +15,13 @@ namespace Scintilla {
// A simple lexer with no state
class LexerBase : public ILexer4 {
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 c7dec38e2..690c59157 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;
+}
+
ILexer4 *LexerModule::Create() const {
if (fnFactory)
return fnFactory();
diff --git a/lexlib/LexerModule.h b/lexlib/LexerModule.h
index d05993d96..db17f96e2 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;
ILexer4 *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";