diff options
33 files changed, 270 insertions, 64 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index d6d98b578..ef9e3e81b 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -1808,7 +1808,7 @@ struct Sci_TextToFind { <b id="SCI_GETSELECTIONNEND">SCI_GETSELECTIONNEND(int selection) → position</b><br /> <b id="SCI_GETSELECTIONNENDVIRTUALSPACE">SCI_GETSELECTIONNENDVIRTUALSPACE(int selection) → position</b><br /> Set or query the start and end position of each already existing selection. - Query the virtual space at start and end of each selection. + Query the virtual space at start and end of each selection. Mostly of use to query each range for its text. The selection parameter is zero-based. </p> <p> @@ -7143,7 +7143,7 @@ optimisation could be to remember where a setting first affects the document and <p><code>Version</code> returns an enumerated value specifying which version of the interface is implemented: <code>lvOriginal</code> for <code>ILexer</code>, <code>lvSubStyles</code> for <code>ILexerWithSubStyles</code>, -and <code>lvMetaData</code> for <code>ILexerWithMetaData</code>.</p> +<code>lvMetaData</code> for <code>ILexerWithMetaData</code>, and <code>lvIdentity</code> for <code>ILexerWithIdentity></code>.</p> <p><code>Release</code> is called to destroy the lexer object.</p> @@ -7205,6 +7205,27 @@ A set of common tags and conventions for combining them is <a class="jump" href <span class="S10">};</span><br /> </div> +<h4 class="provisional">ILexerWithIdentity</h4> + +<div class="highlighted"> +<span><span class="S5">class</span><span class="S0"> </span>ILexerWithIdentity<span class="S0"> </span><span class="S10">:</span><span class="S0"> </span><span class="S5">public</span><span class="S0"> </span>ILexer<span class="S0"> </span><span class="S10">{</span><br /> +<span class="S5">public</span><span class="S10">:</span><br /> +<span class="S0"> </span><span class="S5">virtual</span><span class="S0"> </span><span class="S5">const</span><span class="S0"> </span><span class="S5">char</span><span class="S0"> </span><span class="S10">*</span><span class="S0"> </span>SCI_METHOD<span class="S0"> </span>GetName<span class="S10">()</span><span class="S0"> </span><span class="S10">=</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br /> +<span class="S0"> </span><span class="S5">virtual</span><span class="S0"> </span><span class="S5">int</span><span class="S0"> </span>SCI_METHOD<span class="S0"> </span>GetIdentifier<span class="S10">()</span><span class="S0"> </span><span class="S10">=</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br /> +<span class="S0"> </span><span class="S5">virtual</span><span class="S0"> </span><span class="S5">const</span><span class="S0"> </span><span class="S5">char</span><span class="S0"> </span><span class="S10">*</span><span class="S0"> </span>SCI_METHOD<span class="S0"> </span>PropertyGet<span class="S10">(</span><span class="S5">const</span><span class="S0"> </span><span class="S5">char</span><span class="S0"> </span><span class="S10">*</span>key<span class="S10">)</span><span class="S0"> </span><span class="S10">=</span><span class="S0"> </span><span class="S4">0</span><span class="S10">;</span><br /> +<span class="S10">};</span><br /> +<span class="S0"></span></span> +</div> + +<p class="provisional"><code>GetName</code> and <code>GetIdentifier</code> may be called +to discover the identity of a lexer and be used to implement +<a class="message" href="#SCI_GETLEXERLANGUAGE">SCI_GETLEXERLANGUAGE</a> and +<a class="message" href="#SCI_GETLEXER">SCI_GETLEXER</a>.</p> + +<p class="provisional"><code>PropertyGet</code> may be called +to discover the value of a property stored by a lexer and be used to implement +<a class="message" href="#SCI_GETPROPERTY">SCI_GETPROPERTY</a>.</p> + <h4>IDocument</h4> <div class="highlighted"> diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 308c1d40c..fe08f84a4 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -561,6 +561,10 @@ Released 07 December 2019. </li> <li> + ILexerWithIdentity interface defined provisionally to support use of Lexilla. + The details of this interface may change before being stabilised in Scintilla 5.0. + </li> + <li> SCI_LOADLEXERLIBRARY implemented on Cocoa. </li> <li> diff --git a/include/ILexer.h b/include/ILexer.h index 42f980f89..f7f188972 100644 --- a/include/ILexer.h +++ b/include/ILexer.h @@ -46,7 +46,7 @@ public: virtual int SCI_METHOD GetCharacterAndWidth(Sci_Position position, Sci_Position *pWidth) const = 0; }; -enum { lvOriginal=0, lvSubStyles=1, lvMetaData=2 }; +enum { lvOriginal=0, lvSubStyles=1, lvMetaData=2, lvIdentity=3 }; class ILexer { public: @@ -85,6 +85,13 @@ public: virtual const char * SCI_METHOD DescriptionOfStyle(int style) = 0; }; +class ILexerWithIdentity : public ILexerWithMetaData { +public: + virtual const char * SCI_METHOD GetName() = 0; + virtual int SCI_METHOD GetIdentifier() = 0; + virtual const char * SCI_METHOD PropertyGet(const char *key) = 0; +}; + } #endif diff --git a/lexers/LexAsm.cxx b/lexers/LexAsm.cxx index bd82b1621..9bc775ceb 100644 --- a/lexers/LexAsm.cxx +++ b/lexers/LexAsm.cxx @@ -151,7 +151,7 @@ class LexerAsm : public DefaultLexer { OptionSetAsm osAsm; int commentChar; public: - LexerAsm(int commentChar_) { + LexerAsm(const char *languageName_, int language_, int commentChar_) : DefaultLexer(languageName_, language_) { commentChar = commentChar_; } virtual ~LexerAsm() { @@ -160,7 +160,7 @@ public: delete this; } int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } const char * SCI_METHOD PropertyNames() override { return osAsm.PropertyNames(); @@ -172,6 +172,9 @@ public: return osAsm.DescribeProperty(name); } Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char *key) override { + return osAsm.PropertyGet(key); + } const char * SCI_METHOD DescribeWordListSets() override { return osAsm.DescribeWordListSets(); } @@ -184,11 +187,11 @@ public: } static ILexer *LexerFactoryAsm() { - return new LexerAsm(';'); + return new LexerAsm("asm", SCLEX_ASM, ';'); } static ILexer *LexerFactoryAs() { - return new LexerAsm('#'); + return new LexerAsm("as", SCLEX_AS, '#'); } }; diff --git a/lexers/LexBaan.cxx b/lexers/LexBaan.cxx index fa8b46302..2fb1debd0 100644 --- a/lexers/LexBaan.cxx +++ b/lexers/LexBaan.cxx @@ -393,14 +393,14 @@ class LexerBaan : public DefaultLexer { OptionsBaan options; OptionSetBaan osBaan; public: - LexerBaan() { + LexerBaan() : DefaultLexer("baan", SCLEX_BAAN) { } virtual ~LexerBaan() { } int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } void SCI_METHOD Release() override { @@ -421,6 +421,10 @@ public: Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char *key) override { + return osBaan.PropertyGet(key); + } + const char * SCI_METHOD DescribeWordListSets() override { return osBaan.DescribeWordListSets(); } diff --git a/lexers/LexBash.cxx b/lexers/LexBash.cxx index 45832b77d..66bec3846 100644 --- a/lexers/LexBash.cxx +++ b/lexers/LexBash.cxx @@ -201,7 +201,7 @@ class LexerBash : public DefaultLexer { SubStyles subStyles; public: LexerBash() : - DefaultLexer(lexicalClasses, ELEMENTS(lexicalClasses)), + DefaultLexer("bash", SCLEX_BASH, lexicalClasses, ELEMENTS(lexicalClasses)), subStyles(styleSubable, 0x80, 0x40, 0) { } virtual ~LexerBash() { @@ -210,7 +210,7 @@ public: delete this; } int SCI_METHOD Version() const override { - return lvMetaData; + return lvIdentity; } const char * SCI_METHOD PropertyNames() override { return osBash.PropertyNames(); @@ -222,6 +222,9 @@ public: return osBash.DescribeProperty(name); } Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char* key) override { + return osBash.PropertyGet(key); + } const char * SCI_METHOD DescribeWordListSets() override { return osBash.DescribeWordListSets(); } diff --git a/lexers/LexBasic.cxx b/lexers/LexBasic.cxx index 4ec58dcdd..a288f9daa 100644 --- a/lexers/LexBasic.cxx +++ b/lexers/LexBasic.cxx @@ -232,7 +232,9 @@ class LexerBasic : public DefaultLexer { OptionsBasic options; OptionSetBasic osBasic; public: - LexerBasic(char comment_char_, int (*CheckFoldPoint_)(char const *, int &), const char * const wordListDescriptions[]) : + LexerBasic(const char *languageName_, int language_, char comment_char_, + int (*CheckFoldPoint_)(char const *, int &), const char * const wordListDescriptions[]) : + DefaultLexer(languageName_, language_), comment_char(comment_char_), CheckFoldPoint(CheckFoldPoint_), osBasic(wordListDescriptions) { @@ -243,7 +245,7 @@ public: delete this; } int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } const char * SCI_METHOD PropertyNames() override { return osBasic.PropertyNames(); @@ -255,6 +257,9 @@ public: return osBasic.DescribeProperty(name); } Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char *key) override { + return osBasic.PropertyGet(key); + } const char * SCI_METHOD DescribeWordListSets() override { return osBasic.DescribeWordListSets(); } @@ -266,13 +271,13 @@ public: return 0; } static ILexer *LexerFactoryBlitzBasic() { - return new LexerBasic(';', CheckBlitzFoldPoint, blitzbasicWordListDesc); + return new LexerBasic("blitzbasic", SCLEX_BLITZBASIC, ';', CheckBlitzFoldPoint, blitzbasicWordListDesc); } static ILexer *LexerFactoryPureBasic() { - return new LexerBasic(';', CheckPureFoldPoint, purebasicWordListDesc); + return new LexerBasic("purebasic", SCLEX_PUREBASIC, ';', CheckPureFoldPoint, purebasicWordListDesc); } static ILexer *LexerFactoryFreeBasic() { - return new LexerBasic('\'', CheckFreeFoldPoint, freebasicWordListDesc ); + return new LexerBasic("freebasic", SCLEX_FREEBASIC, '\'', CheckFreeFoldPoint, freebasicWordListDesc ); } }; diff --git a/lexers/LexCIL.cxx b/lexers/LexCIL.cxx index 2a572ad3e..f396acb72 100644 --- a/lexers/LexCIL.cxx +++ b/lexers/LexCIL.cxx @@ -114,7 +114,7 @@ class LexerCIL : public DefaultLexer { OptionSetCIL osCIL; public: - LexerCIL() : DefaultLexer(lexicalClasses, ELEMENTS(lexicalClasses)) { } + LexerCIL() : DefaultLexer("cil", SCLEX_CIL, lexicalClasses, ELEMENTS(lexicalClasses)) { } virtual ~LexerCIL() { } @@ -123,7 +123,7 @@ public: } int SCI_METHOD Version() const override { - return lvMetaData; + return lvIdentity; } const char * SCI_METHOD PropertyNames() override { @@ -140,6 +140,10 @@ public: Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char* key) override { + return osCIL.PropertyGet(key); + } + const char * SCI_METHOD DescribeWordListSets() override { return osCIL.DescribeWordListSets(); } diff --git a/lexers/LexCPP.cxx b/lexers/LexCPP.cxx index 06d4c0265..c6b52784e 100644 --- a/lexers/LexCPP.cxx +++ b/lexers/LexCPP.cxx @@ -499,7 +499,7 @@ LexicalClass lexicalClasses[] = { } -class LexerCPP : public ILexerWithMetaData { +class LexerCPP : public ILexerWithIdentity { bool caseSensitive; CharacterSet setWord; CharacterSet setNegationOp; @@ -562,7 +562,7 @@ public: delete this; } int SCI_METHOD Version() const noexcept override { - return lvMetaData; + return lvIdentity; } const char * SCI_METHOD PropertyNames() override { return osCPP.PropertyNames(); @@ -672,6 +672,15 @@ public: return ""; } + // ILexerWithIdentity methods + const char * SCI_METHOD GetName() override { + return caseSensitive ? "cpp" : "cppnocase"; + } + int SCI_METHOD GetIdentifier() override { + return caseSensitive ? SCLEX_CPP : SCLEX_CPPNOCASE; + } + const char * SCI_METHOD PropertyGet(const char *key) override; + static ILexer *LexerFactoryCPP() { return new LexerCPP(true); } @@ -699,6 +708,10 @@ Sci_Position SCI_METHOD LexerCPP::PropertySet(const char *key, const char *val) return -1; } +const char * SCI_METHOD LexerCPP::PropertyGet(const char *key) { + return osCPP.PropertyGet(key); +} + Sci_Position SCI_METHOD LexerCPP::WordListSet(int n, const char *wl) { WordList *wordListN = nullptr; switch (n) { diff --git a/lexers/LexD.cxx b/lexers/LexD.cxx index acbf462ed..a661b4f13 100644 --- a/lexers/LexD.cxx +++ b/lexers/LexD.cxx @@ -157,6 +157,7 @@ class LexerD : public DefaultLexer { OptionSetD osD; public: LexerD(bool caseSensitive_) : + DefaultLexer("D", SCLEX_D), caseSensitive(caseSensitive_) { } virtual ~LexerD() { @@ -165,7 +166,7 @@ public: delete this; } int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } const char * SCI_METHOD PropertyNames() override { return osD.PropertyNames(); @@ -177,6 +178,9 @@ public: return osD.DescribeProperty(name); } Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char *key) override { + return osD.PropertyGet(key); + } const char * SCI_METHOD DescribeWordListSets() override { return osD.DescribeWordListSets(); } diff --git a/lexers/LexDMIS.cxx b/lexers/LexDMIS.cxx index fa024e9e7..b4cd11c9d 100644 --- a/lexers/LexDMIS.cxx +++ b/lexers/LexDMIS.cxx @@ -56,7 +56,7 @@ class LexerDMIS : public DefaultLexer virtual ~LexerDMIS(void); int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } void SCI_METHOD Release() override { @@ -79,6 +79,10 @@ class LexerDMIS : public DefaultLexer return -1; } + const char * SCI_METHOD PropertyGet(const char *) override { + return NULL; + } + Sci_Position SCI_METHOD WordListSet(int n, const char *wl) override; void * SCI_METHOD PrivateCall(int, void *) override { @@ -129,7 +133,7 @@ void SCI_METHOD LexerDMIS::InitWordListSets(void) } -LexerDMIS::LexerDMIS(void) { +LexerDMIS::LexerDMIS(void) : DefaultLexer("DMIS", SCLEX_DMIS) { this->InitWordListSets(); this->m_majorWords.Clear(); diff --git a/lexers/LexEDIFACT.cxx b/lexers/LexEDIFACT.cxx index 9c1de5d77..efc9b5806 100644 --- a/lexers/LexEDIFACT.cxx +++ b/lexers/LexEDIFACT.cxx @@ -13,6 +13,8 @@ #include <cstring> #include <cctype> +#include <string> + #include "ILexer.h" #include "Scintilla.h" #include "SciLexer.h" @@ -35,7 +37,7 @@ public: int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } void SCI_METHOD Release() override { @@ -73,6 +75,21 @@ public: } return -1; } + + const char * SCI_METHOD PropertyGet(const char *key) override + { + m_lastPropertyValue = ""; + if (!strcmp(key, "fold")) + { + m_lastPropertyValue = m_bFold ? "1" : "0"; + } + if (!strcmp(key, "lexer.edifact.highlight.un.all")) // GetProperty + { + m_lastPropertyValue = m_bHighlightAllUN ? "1" : "0"; + } + return m_lastPropertyValue.c_str(); + } + const char * SCI_METHOD DescribeWordListSets() override { return NULL; @@ -105,6 +122,8 @@ protected: char m_chDecimal; char m_chRelease; char m_chSegment; + + std::string m_lastPropertyValue; }; LexerModule lmEDIFACT(SCLEX_EDIFACT, LexerEDIFACT::Factory, "edifact"); @@ -115,7 +134,7 @@ LexerModule lmEDIFACT(SCLEX_EDIFACT, LexerEDIFACT::Factory, "edifact"); /////////////////////////////////////////////////////////////////////////////// -LexerEDIFACT::LexerEDIFACT() +LexerEDIFACT::LexerEDIFACT() : DefaultLexer("edifact", SCLEX_EDIFACT) { m_bFold = false; m_bHighlightAllUN = false; diff --git a/lexers/LexHTML.cxx b/lexers/LexHTML.cxx index 6a769f67b..24e9215da 100644 --- a/lexers/LexHTML.cxx +++ b/lexers/LexHTML.cxx @@ -862,7 +862,10 @@ class LexerHTML : public DefaultLexer { std::set<std::string> nonFoldingTags; public: explicit LexerHTML(bool isXml_, bool isPHPScript_) : - DefaultLexer(isXml_ ? lexicalClassesHTML : lexicalClassesXML, + DefaultLexer( + isXml_ ? "xml" : (isPHPScript_ ? "phpscript" : "hypertext"), + isXml_ ? SCLEX_XML : (isPHPScript_ ? SCLEX_PHPSCRIPT : SCLEX_HTML), + isXml_ ? lexicalClassesHTML : lexicalClassesXML, isXml_ ? ELEMENTS(lexicalClassesHTML) : ELEMENTS(lexicalClassesXML)), isXml(isXml_), isPHPScript(isPHPScript_), @@ -884,6 +887,9 @@ public: return osHTML.DescribeProperty(name); } Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char *key) override { + return osHTML.PropertyGet(key); + } const char *SCI_METHOD DescribeWordListSets() override { return osHTML.DescribeWordListSets(); } diff --git a/lexers/LexHaskell.cxx b/lexers/LexHaskell.cxx index bf8199548..93c670a0c 100644 --- a/lexers/LexHaskell.cxx +++ b/lexers/LexHaskell.cxx @@ -390,7 +390,8 @@ class LexerHaskell : public DefaultLexer { public: LexerHaskell(bool literate_) - : literate(literate_) + : DefaultLexer(literate_ ? "literatehaskell" : "haskell", literate_ ? SCLEX_LITERATEHASKELL : SCLEX_HASKELL) + , literate(literate_) , firstImportLine(-1) , firstImportIndent(0) {} @@ -401,7 +402,7 @@ public: } int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } const char * SCI_METHOD PropertyNames() override { @@ -418,6 +419,10 @@ public: Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char *key) override { + return osHaskell.PropertyGet(key); + } + const char * SCI_METHOD DescribeWordListSets() override { return osHaskell.DescribeWordListSets(); } diff --git a/lexers/LexHollywood.cxx b/lexers/LexHollywood.cxx index e4d6edab9..90be36043 100644 --- a/lexers/LexHollywood.cxx +++ b/lexers/LexHollywood.cxx @@ -252,35 +252,39 @@ class LexerHollywood : public DefaultLexer { OptionSetHollywood osHollywood; public: LexerHollywood(int (*CheckFoldPoint_)(char const *), const char * const wordListDescriptions[]) : + DefaultLexer("hollywood", SCLEX_HOLLYWOOD), CheckFoldPoint(CheckFoldPoint_), osHollywood(wordListDescriptions) { } virtual ~LexerHollywood() { } - void SCI_METHOD Release() { + void SCI_METHOD Release() override { delete this; } - int SCI_METHOD Version() const { - return lvMetaData; + int SCI_METHOD Version() const override { + return lvIdentity; } - const char * SCI_METHOD PropertyNames() { + const char * SCI_METHOD PropertyNames() override { return osHollywood.PropertyNames(); } - int SCI_METHOD PropertyType(const char *name) { + int SCI_METHOD PropertyType(const char *name) override { return osHollywood.PropertyType(name); } - const char * SCI_METHOD DescribeProperty(const char *name) { + const char * SCI_METHOD DescribeProperty(const char *name) override { return osHollywood.DescribeProperty(name); } - Sci_Position SCI_METHOD PropertySet(const char *key, const char *val); - const char * SCI_METHOD DescribeWordListSets() { + Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char* key) override { + return osHollywood.PropertyGet(key); + } + const char * SCI_METHOD DescribeWordListSets() override { return osHollywood.DescribeWordListSets(); } - Sci_Position SCI_METHOD WordListSet(int n, const char *wl); - void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess); - void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess); + Sci_Position SCI_METHOD WordListSet(int n, const char *wl) override; + void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override; + void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override; - void * SCI_METHOD PrivateCall(int, void *) { + void * SCI_METHOD PrivateCall(int, void *) override { return 0; } static ILexer *LexerFactoryHollywood() { diff --git a/lexers/LexJSON.cxx b/lexers/LexJSON.cxx index 3c754f888..2f76a103b 100644 --- a/lexers/LexJSON.cxx +++ b/lexers/LexJSON.cxx @@ -201,6 +201,7 @@ class LexerJSON : public DefaultLexer { public: LexerJSON() : + DefaultLexer("json", SCLEX_JSON), setOperators(CharacterSet::setNone, "[{}]:,"), setURL(CharacterSet::setAlphaNum, "-._~:/?#[]@!$&'()*+,),="), setKeywordJSONLD(CharacterSet::setAlpha, ":@"), @@ -208,7 +209,7 @@ class LexerJSON : public DefaultLexer { } virtual ~LexerJSON() {} int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } void SCI_METHOD Release() override { delete this; @@ -228,6 +229,9 @@ class LexerJSON : public DefaultLexer { } return -1; } + const char * SCI_METHOD PropertyGet(const char *key) override { + return optSetJSON.PropertyGet(key); + } Sci_Position SCI_METHOD WordListSet(int n, const char *wl) override { WordList *wordListN = 0; switch (n) { diff --git a/lexers/LexLaTeX.cxx b/lexers/LexLaTeX.cxx index 391a36c5c..496d04177 100644 --- a/lexers/LexLaTeX.cxx +++ b/lexers/LexLaTeX.cxx @@ -26,6 +26,7 @@ #include "StyleContext.h" #include "CharacterSet.h" #include "LexerModule.h" +#include "DefaultLexer.h" #include "LexerBase.h" using namespace Scintilla; @@ -88,6 +89,14 @@ public: } void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override; void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override; + + // ILexerWithIdentity methods + const char * SCI_METHOD GetName() override { + return "latex"; + } + int SCI_METHOD GetIdentifier() override { + return SCLEX_LATEX; + } }; static bool latexIsSpecial(int ch) { diff --git a/lexers/LexNim.cxx b/lexers/LexNim.cxx index 2152e418c..4562b764c 100644 --- a/lexers/LexNim.cxx +++ b/lexers/LexNim.cxx @@ -225,7 +225,7 @@ class LexerNim : public DefaultLexer { public: LexerNim() : - DefaultLexer(lexicalClasses, ELEMENTS(lexicalClasses)), + DefaultLexer("nim", SCLEX_NIM, lexicalClasses, ELEMENTS(lexicalClasses)), setWord(CharacterSet::setAlphaNum, "_", 0x80, true) { } virtual ~LexerNim() { } @@ -235,7 +235,7 @@ public: } int SCI_METHOD Version() const noexcept override { - return lvMetaData; + return lvIdentity; } const char * SCI_METHOD PropertyNames() override { @@ -252,6 +252,10 @@ public: Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char* key) override { + return osNim.PropertyGet(key); + } + const char * SCI_METHOD DescribeWordListSets() override { return osNim.DescribeWordListSets(); } diff --git a/lexers/LexPerl.cxx b/lexers/LexPerl.cxx index a9c81ce51..75c61cb8c 100644 --- a/lexers/LexPerl.cxx +++ b/lexers/LexPerl.cxx @@ -423,6 +423,7 @@ class LexerPerl : public DefaultLexer { OptionSetPerl osPerl; public: LexerPerl() : + DefaultLexer("perl", SCLEX_PERL), setWordStart(CharacterSet::setAlpha, "_", 0x80, true), setWord(CharacterSet::setAlphaNum, "_", 0x80, true), setSpecialVar(CharacterSet::setNone, "\"$;<>&`'+,./\\%:=~!?@[]"), @@ -434,7 +435,7 @@ public: delete this; } int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } const char *SCI_METHOD PropertyNames() override { return osPerl.PropertyNames(); @@ -446,6 +447,9 @@ public: return osPerl.DescribeProperty(name); } Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char *key) override { + return osPerl.PropertyGet(key); + } const char *SCI_METHOD DescribeWordListSets() override { return osPerl.DescribeWordListSets(); } diff --git a/lexers/LexProgress.cxx b/lexers/LexProgress.cxx index 0d27fdcdb..b05b0ba77 100644 --- a/lexers/LexProgress.cxx +++ b/lexers/LexProgress.cxx @@ -136,6 +136,7 @@ class LexerABL : public DefaultLexer { OptionSetABL osABL; public: LexerABL() : + DefaultLexer("abl", SCLEX_PROGRESS), setWord(CharacterSet::setAlphaNum, "_", 0x80, true), setNegationOp(CharacterSet::setNone, "!"), setArithmethicOp(CharacterSet::setNone, "+-/*%"), @@ -148,7 +149,7 @@ public: delete this; } int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } const char * SCI_METHOD PropertyNames() override { return osABL.PropertyNames(); @@ -160,6 +161,9 @@ public: return osABL.DescribeProperty(name); } Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override ; + const char * SCI_METHOD PropertyGet(const char *key) override { + return osABL.PropertyGet(key); + } const char * SCI_METHOD DescribeWordListSets() override { return osABL.DescribeWordListSets(); diff --git a/lexers/LexPython.cxx b/lexers/LexPython.cxx index 6cfb03b5e..836f76155 100644 --- a/lexers/LexPython.cxx +++ b/lexers/LexPython.cxx @@ -344,7 +344,7 @@ class LexerPython : public DefaultLexer { std::map<Sci_Position, std::vector<SingleFStringExpState> > ftripleStateAtEol; public: explicit LexerPython() : - DefaultLexer(lexicalClasses, ELEMENTS(lexicalClasses)), + DefaultLexer("python", SCLEX_PYTHON, lexicalClasses, ELEMENTS(lexicalClasses)), subStyles(styleSubable, 0x80, 0x40, 0) { } ~LexerPython() override { @@ -353,7 +353,7 @@ public: delete this; } int SCI_METHOD Version() const override { - return lvSubStyles; + return lvIdentity; } const char *SCI_METHOD PropertyNames() override { return osPython.PropertyNames(); @@ -365,6 +365,9 @@ public: return osPython.DescribeProperty(name); } Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char *key) override { + return osPython.PropertyGet(key); + } const char *SCI_METHOD DescribeWordListSets() override { return osPython.DescribeWordListSets(); } diff --git a/lexers/LexRegistry.cxx b/lexers/LexRegistry.cxx index bd0ea18f4..71c3535e6 100644 --- a/lexers/LexRegistry.cxx +++ b/lexers/LexRegistry.cxx @@ -161,10 +161,10 @@ class LexerRegistry : public DefaultLexer { } public: - LexerRegistry() {} + LexerRegistry() : DefaultLexer("registry", SCLEX_REGISTRY) {} virtual ~LexerRegistry() {} int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } void SCI_METHOD Release() override { delete this; @@ -184,6 +184,10 @@ public: } return -1; } + const char * SCI_METHOD PropertyGet(const char *key) override { + return optSetRegistry.PropertyGet(key); + } + Sci_Position SCI_METHOD WordListSet(int, const char *) override { return -1; } diff --git a/lexers/LexRust.cxx b/lexers/LexRust.cxx index a866203db..f0360b605 100644 --- a/lexers/LexRust.cxx +++ b/lexers/LexRust.cxx @@ -120,13 +120,15 @@ class LexerRust : public DefaultLexer { OptionsRust options; OptionSetRust osRust; public: + LexerRust() : DefaultLexer("rust", SCLEX_RUST) { + } virtual ~LexerRust() { } void SCI_METHOD Release() override { delete this; } int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } const char * SCI_METHOD PropertyNames() override { return osRust.PropertyNames(); @@ -138,6 +140,9 @@ public: return osRust.DescribeProperty(name); } Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char *key) override { + return osRust.PropertyGet(key); + } const char * SCI_METHOD DescribeWordListSets() override { return osRust.DescribeWordListSets(); } diff --git a/lexers/LexSQL.cxx b/lexers/LexSQL.cxx index 196d07a40..87b852bfd 100644 --- a/lexers/LexSQL.cxx +++ b/lexers/LexSQL.cxx @@ -303,12 +303,12 @@ struct OptionSetSQL : public OptionSet<OptionsSQL> { class LexerSQL : public DefaultLexer { public : - LexerSQL() {} + LexerSQL() : DefaultLexer("sql", SCLEX_SQL) {} virtual ~LexerSQL() {} int SCI_METHOD Version () const override { - return lvOriginal; + return lvIdentity; } void SCI_METHOD Release() override { @@ -334,6 +334,10 @@ public : return -1; } + const char * SCI_METHOD PropertyGet(const char *key) override { + return osSQL.PropertyGet(key); + } + const char * SCI_METHOD DescribeWordListSets() override { return osSQL.DescribeWordListSets(); } diff --git a/lexers/LexVerilog.cxx b/lexers/LexVerilog.cxx index 3dc2ac1ef..d31425e3f 100644 --- a/lexers/LexVerilog.cxx +++ b/lexers/LexVerilog.cxx @@ -216,12 +216,13 @@ class LexerVerilog : public DefaultLexer { public: LexerVerilog() : + DefaultLexer("verilog", SCLEX_VERILOG), setWord(CharacterSet::setAlphaNum, "._", 0x80, true), subStyles(styleSubable, 0x80, 0x40, activeFlag) { } virtual ~LexerVerilog() {} int SCI_METHOD Version() const override { - return lvSubStyles; + return lvIdentity; } void SCI_METHOD Release() override { delete this; @@ -238,6 +239,9 @@ public: Sci_Position SCI_METHOD PropertySet(const char* key, const char* val) override { return osVerilog.PropertySet(&options, key, val); } + const char * SCI_METHOD PropertyGet(const char *key) override { + return osVerilog.PropertyGet(key); + } const char* SCI_METHOD DescribeWordListSets() override { return osVerilog.DescribeWordListSets(); } diff --git a/lexers/LexVisualProlog.cxx b/lexers/LexVisualProlog.cxx index 460ecfab8..4aae79332 100644 --- a/lexers/LexVisualProlog.cxx +++ b/lexers/LexVisualProlog.cxx @@ -71,7 +71,7 @@ class LexerVisualProlog : public DefaultLexer { OptionsVisualProlog options; OptionSetVisualProlog osVisualProlog; public: - LexerVisualProlog() { + LexerVisualProlog() : DefaultLexer("visualprolog", SCLEX_VISUALPROLOG) { } virtual ~LexerVisualProlog() { } @@ -79,7 +79,7 @@ public: delete this; } int SCI_METHOD Version() const override { - return lvOriginal; + return lvIdentity; } const char * SCI_METHOD PropertyNames() override { return osVisualProlog.PropertyNames(); @@ -91,6 +91,9 @@ public: return osVisualProlog.DescribeProperty(name); } Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char * SCI_METHOD PropertyGet(const char *key) override { + return osVisualProlog.PropertyGet(key); + } const char * SCI_METHOD DescribeWordListSets() override { return osVisualProlog.DescribeWordListSets(); } diff --git a/lexers/LexX12.cxx b/lexers/LexX12.cxx index 31ef32a96..1b2cdfd18 100644 --- a/lexers/LexX12.cxx +++ b/lexers/LexX12.cxx @@ -36,7 +36,7 @@ public: int SCI_METHOD Version() const override { - return lvMetaData; + return lvIdentity; } void SCI_METHOD Release() override { @@ -67,6 +67,9 @@ public: } return -1; } + const char * SCI_METHOD PropertyGet(const char *) override { + return ""; + } const char * SCI_METHOD DescribeWordListSets() override { return NULL; @@ -109,7 +112,7 @@ LexerModule lmX12(SCLEX_X12, LexerX12::Factory, "x12"); /////////////////////////////////////////////////////////////////////////////// -LexerX12::LexerX12() +LexerX12::LexerX12() : DefaultLexer("x12", SCLEX_X12) { m_bFold = false; m_chSegment[0] = m_chSegment[1] = m_chSegment[2] = m_chElement = m_chSubElement = 0; diff --git a/lexlib/DefaultLexer.cxx b/lexlib/DefaultLexer.cxx index 9ca39b44a..e0f61084e 100644 --- a/lexlib/DefaultLexer.cxx +++ b/lexlib/DefaultLexer.cxx @@ -24,8 +24,12 @@ using namespace Scintilla; static const char styleSubable[] = { 0 }; -DefaultLexer::DefaultLexer(const LexicalClass *lexClasses_, size_t nClasses_) : - lexClasses(lexClasses_), nClasses(nClasses_) { +DefaultLexer::DefaultLexer(const char *languageName_, int language_, + const LexicalClass *lexClasses_, size_t nClasses_) : + languageName(languageName_), + language(language_), + lexClasses(lexClasses_), + nClasses(nClasses_) { } DefaultLexer::~DefaultLexer() { @@ -36,7 +40,7 @@ void SCI_METHOD DefaultLexer::Release() { } int SCI_METHOD DefaultLexer::Version() const { - return lvMetaData; + return lvIdentity; } const char * SCI_METHOD DefaultLexer::PropertyNames() { @@ -123,3 +127,13 @@ const char * SCI_METHOD DefaultLexer::TagsOfStyle(int style) { const char * SCI_METHOD DefaultLexer::DescriptionOfStyle(int style) { return (style < NamedStyles()) ? lexClasses[style].description : ""; } + +// ILexerWithIdentity methods +const char * SCI_METHOD DefaultLexer::GetName() { + return languageName; +} + +int SCI_METHOD DefaultLexer::GetIdentifier() { + return language; +} + diff --git a/lexlib/DefaultLexer.h b/lexlib/DefaultLexer.h index 636bd0690..7856a1dd1 100644 --- a/lexlib/DefaultLexer.h +++ b/lexlib/DefaultLexer.h @@ -13,11 +13,14 @@ namespace Scintilla { // A simple lexer with no state -class DefaultLexer : public ILexerWithMetaData { +class DefaultLexer : public ILexerWithIdentity { + const char *languageName; + int language; const LexicalClass *lexClasses; size_t nClasses; public: - DefaultLexer(const LexicalClass *lexClasses_ = nullptr, size_t nClasses_ = 0); + DefaultLexer(const char *languageName_, int language_, + const LexicalClass *lexClasses_ = nullptr, size_t nClasses_ = 0); virtual ~DefaultLexer(); void SCI_METHOD Release() override; int SCI_METHOD Version() const override; @@ -44,6 +47,9 @@ public: const char * SCI_METHOD NameOfStyle(int style) override; const char * SCI_METHOD TagsOfStyle(int style) override; const char * SCI_METHOD DescriptionOfStyle(int style) override; + // ILexerWithIdentity methods + const char * SCI_METHOD GetName() override; + int SCI_METHOD GetIdentifier() override; }; } diff --git a/lexlib/LexerBase.cxx b/lexlib/LexerBase.cxx index 655f96be6..97edc621c 100644 --- a/lexlib/LexerBase.cxx +++ b/lexlib/LexerBase.cxx @@ -44,7 +44,7 @@ void SCI_METHOD LexerBase::Release() { } int SCI_METHOD LexerBase::Version() const { - return lvMetaData; + return lvIdentity; } const char * SCI_METHOD LexerBase::PropertyNames() { @@ -69,6 +69,10 @@ Sci_Position SCI_METHOD LexerBase::PropertySet(const char *key, const char *val) } } +const char *SCI_METHOD LexerBase::PropertyGet(const char *key) { + return props.Get(key); +} + const char * SCI_METHOD LexerBase::DescribeWordListSets() { return ""; } @@ -139,3 +143,13 @@ const char * SCI_METHOD LexerBase::TagsOfStyle(int style) { const char * SCI_METHOD LexerBase::DescriptionOfStyle(int style) { return (style < NamedStyles()) ? lexClasses[style].description : ""; } + +// ILexerWithIdentity methods + +const char *SCI_METHOD LexerBase::GetName() { + return ""; +} + +int SCI_METHOD LexerBase::GetIdentifier() { + return SCLEX_AUTOMATIC; +} diff --git a/lexlib/LexerBase.h b/lexlib/LexerBase.h index afeaa8038..a023d0fe1 100644 --- a/lexlib/LexerBase.h +++ b/lexlib/LexerBase.h @@ -11,7 +11,7 @@ namespace Scintilla { // A simple lexer with no state -class LexerBase : public ILexerWithMetaData { +class LexerBase : public ILexerWithIdentity { protected: const LexicalClass *lexClasses; size_t nClasses; @@ -46,6 +46,10 @@ public: const char * SCI_METHOD NameOfStyle(int style) override; const char * SCI_METHOD TagsOfStyle(int style) override; const char * SCI_METHOD DescriptionOfStyle(int style) override; + // ILexerWithIdentity methods + const char * SCI_METHOD GetName() override; + int SCI_METHOD GetIdentifier() override; + const char *SCI_METHOD PropertyGet(const char *key) override; }; } diff --git a/lexlib/LexerSimple.cxx b/lexlib/LexerSimple.cxx index 0be7d97ca..e69c44ad6 100644 --- a/lexlib/LexerSimple.cxx +++ b/lexlib/LexerSimple.cxx @@ -51,3 +51,11 @@ void SCI_METHOD LexerSimple::Fold(Sci_PositionU startPos, Sci_Position lengthDoc astyler.Flush(); } } + +const char * SCI_METHOD LexerSimple::GetName() { + return module->languageName; +} + +int SCI_METHOD LexerSimple::GetIdentifier() { + return module->GetLanguage(); +} diff --git a/lexlib/LexerSimple.h b/lexlib/LexerSimple.h index 87882eaeb..a2589cf44 100644 --- a/lexlib/LexerSimple.h +++ b/lexlib/LexerSimple.h @@ -19,6 +19,9 @@ public: const char * SCI_METHOD DescribeWordListSets() override; void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position lengthDoc, int initStyle, IDocument *pAccess) override; void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position lengthDoc, int initStyle, IDocument *pAccess) override; + // ILexerWithIdentity methods + const char * SCI_METHOD GetName() override; + int SCI_METHOD GetIdentifier() override; }; } |
