diff options
-rw-r--r-- | doc/ScintillaHistory.html | 8 | ||||
-rw-r--r-- | src/AutoComplete.cxx | 5 | ||||
-rw-r--r-- | test/simpleTests.py | 40 |
3 files changed, 51 insertions, 2 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 0cb250da5..ca0fbfff1 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -588,8 +588,12 @@ The wParam (length) argument to SCI_GETTEXT and SCI_GETCURLINE also omits the NUL. This is more consistent with other APIs. </li> - <ul> - <h2>Releases</h2> + <li> + Fix assertion failure with autocompletion list when order is SC_ORDER_CUSTOM + or SC_ORDER_PERFORMSORT and the list is empty. + <a href="https://sourceforge.net/p/scintilla/bugs/2294/">Bug #2294</a>. + </li> + </ul> <h3> <a href="https://www.scintilla.org/scintilla514.zip">Release 5.1.4</a> </h3> diff --git a/src/AutoComplete.cxx b/src/AutoComplete.cxx index 47e942561..2bf88aa23 100644 --- a/src/AutoComplete.cxx +++ b/src/AutoComplete.cxx @@ -115,6 +115,11 @@ struct Sorter { Sorter(AutoComplete *ac_, const char *list_) : ac(ac_), list(list_) { int i = 0; + if (!list[i]) { + // Empty list has a single empty member + indices.push_back(i); // word start + indices.push_back(i); // word end + } while (list[i]) { indices.push_back(i); // word start while (list[i] != ac->GetTypesep() && list[i] != ac->GetSeparator() && list[i]) diff --git a/test/simpleTests.py b/test/simpleTests.py index 98ae2a3af..49b6061a4 100644 --- a/test/simpleTests.py +++ b/test/simpleTests.py @@ -2734,6 +2734,46 @@ class TestAutoComplete(unittest.TestCase): self.assertEquals(self.ed.AutoCActive(), 0) + def testAutoCustomSort(self): + # Checks bug #2294 where SC_ORDER_CUSTOM with an empty list asserts + # https://sourceforge.net/p/scintilla/bugs/2294/ + self.assertEquals(self.ed.AutoCGetOrder(), self.ed.SC_ORDER_PRESORTED) + + self.ed.AutoCSetOrder(self.ed.SC_ORDER_CUSTOM) + self.assertEquals(self.ed.AutoCGetOrder(), self.ed.SC_ORDER_CUSTOM) + + #~ self.ed.AutoCShow(0, b"") + #~ self.ed.AutoCComplete() + #~ self.assertEquals(self.ed.Contents(), b"xxx\n") + + self.ed.AutoCShow(0, b"a") + self.ed.AutoCComplete() + self.assertEquals(self.ed.Contents(), b"xxx\na") + + self.ed.AutoCSetOrder(self.ed.SC_ORDER_PERFORMSORT) + self.assertEquals(self.ed.AutoCGetOrder(), self.ed.SC_ORDER_PERFORMSORT) + + self.ed.AutoCShow(0, b"") + self.ed.AutoCComplete() + self.assertEquals(self.ed.Contents(), b"xxx\na") + + self.ed.AutoCShow(0, b"b a") + self.ed.AutoCComplete() + self.assertEquals(self.ed.Contents(), b"xxx\naa") + + self.ed.AutoCSetOrder(self.ed.SC_ORDER_PRESORTED) + self.assertEquals(self.ed.AutoCGetOrder(), self.ed.SC_ORDER_PRESORTED) + + self.ed.AutoCShow(0, b"") + self.ed.AutoCComplete() + self.assertEquals(self.ed.Contents(), b"xxx\naa") + + self.ed.AutoCShow(0, b"a b") + self.ed.AutoCComplete() + self.assertEquals(self.ed.Contents(), b"xxx\naaa") + + self.assertEquals(self.ed.AutoCActive(), 0) + def testWriteOnly(self): """ Checks that setting attributes doesn't crash or change tested behaviour but does not check that the changed attributes are effective. """ |