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
commitfd8ab2d18eb5ce51f3ebfdfd97b9d1f7a0c5d873 (patch)
treef323f9d912411c44a4b3bc513a49b69e49c7438a
parent3a993f0a5e97435874e06d5496085c4cb7a0d4cb (diff)
downloadscintilla-mirror-fd8ab2d18eb5ce51f3ebfdfd97b9d1f7a0c5d873.tar.gz
Backport: Basic implementation helpers for style metadata.
Backport of changeset 6347:69b7471ad62f.
-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 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";