aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKein-Hong Man <devnull@localhost>2016-01-05 23:58:17 +1100
committerKein-Hong Man <devnull@localhost>2016-01-05 23:58:17 +1100
commitaf33a5f8053adeddf868910b981e48acc35625a7 (patch)
tree3254cd4c9e923489d2843bfce1e5f2790805d08f
parentbfa0332ce324c0ffc998d39e8f903711ad6e1532 (diff)
downloadscintilla-mirror-af33a5f8053adeddf868910b981e48acc35625a7.tar.gz
Fix module ::-syntax when special characters such as 'x' are used.
Added ' and " detection as prefix chars for x repetition operator.
-rw-r--r--doc/ScintillaHistory.html5
-rw-r--r--lexers/LexPerl.cxx11
-rw-r--r--test/examples/perl-test-5220delta.pl.styled2
3 files changed, 12 insertions, 6 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html
index c7f71d5d9..40a768a62 100644
--- a/doc/ScintillaHistory.html
+++ b/doc/ScintillaHistory.html
@@ -535,7 +535,10 @@
Repetition in list assignment.
<a href="http://sourceforge.net/p/scintilla/bugs/1793/">Bug #1793</a>.<br />
Highlight changed subroutine prototype syntax for Perl 5.20.
- <a href="http://sourceforge.net/p/scintilla/bugs/1797/">Bug #1797</a>.
+ <a href="http://sourceforge.net/p/scintilla/bugs/1797/">Bug #1797</a>.<br />
+ Fix module ::-syntax when special characters such as 'x' are used.<br />
+ Added ' and " detection as prefix chars for x repetition operator.
+ <a href="http://sourceforge.net/p/scintilla/bugs/1800/">Bug #1800</a>.
</li>
<li>
Send SCN_UPDATEUI with SC_UPDATE_SELECTION when the application changes multiple
diff --git a/lexers/LexPerl.cxx b/lexers/LexPerl.cxx
index dccad1542..3b10b47e6 100644
--- a/lexers/LexPerl.cxx
+++ b/lexers/LexPerl.cxx
@@ -111,9 +111,11 @@ static int disambiguateBareword(LexAccessor &styler, Sci_PositionU bk, Sci_Posit
// &bareword: subroutine call
|| styler.Match(bk - 1, "->")
// ->bareword: part of variable spec
+ || styler.Match(bk - 1, "::")
+ // ::bareword: part of module spec
|| styler.Match(bk - 2, "sub")) {
- // sub bareword: subroutine declaration
- // (implied BACK_KEYWORD, no keywords end in 'sub'!)
+ // sub bareword: subroutine declaration
+ // (implied BACK_KEYWORD, no keywords end in 'sub'!)
result |= 1;
}
// next, scan forward after word past tab/spaces only;
@@ -127,7 +129,7 @@ static int disambiguateBareword(LexAccessor &styler, Sci_PositionU bk, Sci_Posit
if ((ch == '}' && brace)
// {bareword}: variable spec
|| styler.Match(fw, "=>")) {
- // [{(, bareword=>: hash literal
+ // [{(, bareword=>: hash literal
result |= 2;
}
}
@@ -599,6 +601,7 @@ void SCI_METHOD LexerPerl::Lex(Sci_PositionU startPos, Sci_Position length, int
CharacterSet setNonHereDoc(CharacterSet::setDigits, "=$@");
CharacterSet setHereDocDelim(CharacterSet::setAlphaNum, "_");
CharacterSet setSubPrototype(CharacterSet::setNone, "\\[$@%&*+];_ \t");
+ CharacterSet setRepetition(CharacterSet::setDigits, ")\"'");
// for format identifiers
CharacterSet setFormatStart(CharacterSet::setAlpha, "_=");
CharacterSet &setFormat = setHereDocDelim;
@@ -1339,7 +1342,7 @@ void SCI_METHOD LexerPerl::Lex(Sci_PositionU startPos, Sci_Position length, int
fw++;
} else if (sc.ch == 'x' && (sc.chNext == '=' || // repetition
!setWord.Contains(sc.chNext) ||
- ((IsADigit(sc.chPrev) || sc.chPrev == ')') && IsADigit(sc.chNext)))) {
+ (setRepetition.Contains(sc.chPrev) && IsADigit(sc.chNext)))) {
sc.ChangeState(SCE_PL_OPERATOR);
}
// if potentially a keyword, scan forward and grab word, then check
diff --git a/test/examples/perl-test-5220delta.pl.styled b/test/examples/perl-test-5220delta.pl.styled
index c01757999..3754c8929 100644
--- a/test/examples/perl-test-5220delta.pl.styled
+++ b/test/examples/perl-test-5220delta.pl.styled
@@ -105,7 +105,7 @@
{5}sub{0} {11}foo{0} {10}:{0} {11}lvalue{0} {10};{0}
{5}package{0} {11}X{10};{0}
-{5}sub{0} {11}Y{10}::x{0} {10}:{0} {11}lvalue{0} {10}{{0} {4}1{0} {10}}{0}
+{5}sub{0} {11}Y{10}::{11}x{0} {10}:{0} {11}lvalue{0} {10}{{0} {4}1{0} {10}}{0}
{5}package{0} {11}X{10};{0}
{5}sub{0} {11}foo{0} {10}{{0} {4}1{0} {10}}{0}