aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/Document.cxx19
-rw-r--r--test/unit/testDocument.cxx23
2 files changed, 34 insertions, 8 deletions
diff --git a/src/Document.cxx b/src/Document.cxx
index 96bee868e..3a3627fdc 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -1907,6 +1907,15 @@ Sci::Position Document::NextWordEnd(Sci::Position pos, int delta) const {
return pos;
}
+namespace {
+
+constexpr bool IsWordEdge(CharacterClass cc, CharacterClass ccNext) noexcept {
+ return (cc != ccNext) &&
+ (cc == CharacterClass::word || cc == CharacterClass::punctuation);
+}
+
+}
+
/**
* Check that the character at the given position is a word or punctuation character and that
* the previous character is of a different character class.
@@ -1916,11 +1925,8 @@ bool Document::IsWordStartAt(Sci::Position pos) const {
return false;
if (pos > 0) {
const CharacterExtracted cePos = CharacterAfter(pos);
- const CharacterClass ccPos = WordCharacterClass(cePos.character);
const CharacterExtracted cePrev = CharacterBefore(pos);
- const CharacterClass ccPrev = WordCharacterClass(cePrev.character);
- return (ccPos == CharacterClass::word || ccPos == CharacterClass::punctuation) &&
- (ccPos != ccPrev);
+ return IsWordEdge(WordCharacterClass(cePos.character), WordCharacterClass(cePrev.character));
}
return true;
}
@@ -1934,11 +1940,8 @@ bool Document::IsWordEndAt(Sci::Position pos) const {
return false;
if (pos < LengthNoExcept()) {
const CharacterExtracted cePos = CharacterAfter(pos);
- const CharacterClass ccPos = WordCharacterClass(cePos.character);
const CharacterExtracted cePrev = CharacterBefore(pos);
- const CharacterClass ccPrev = WordCharacterClass(cePrev.character);
- return (ccPrev == CharacterClass::word || ccPrev == CharacterClass::punctuation) &&
- (ccPrev != ccPos);
+ return IsWordEdge(WordCharacterClass(cePrev.character), WordCharacterClass(cePos.character));
}
return true;
}
diff --git a/test/unit/testDocument.cxx b/test/unit/testDocument.cxx
index 97db6d9a2..0f8e399fa 100644
--- a/test/unit/testDocument.cxx
+++ b/test/unit/testDocument.cxx
@@ -455,3 +455,26 @@ TEST_CASE("Document") {
}
}
+
+TEST_CASE("Words") {
+
+ SECTION("WordsInText") {
+ const DocPlus doc(" abc ", 0);
+ REQUIRE(doc.document.IsWordAt(1, 4));
+ REQUIRE(!doc.document.IsWordAt(0, 1));
+ REQUIRE(!doc.document.IsWordAt(1, 2));
+ const DocPlus docPunct(" [!] ", 0);
+ REQUIRE(docPunct.document.IsWordAt(1, 4));
+ REQUIRE(!docPunct.document.IsWordAt(0, 1));
+ REQUIRE(!docPunct.document.IsWordAt(1, 2));
+ const DocPlus docMixed(" -ab ", 0); // '-' is punctuation, 'ab' is word
+ REQUIRE(docMixed.document.IsWordAt(2, 4));
+ REQUIRE(docMixed.document.IsWordAt(1, 4));
+ REQUIRE(docMixed.document.IsWordAt(1, 2));
+ REQUIRE(!docMixed.document.IsWordAt(1, 3)); // 3 is between a and b so not word edge
+ // Scintilla's word definition just examines the ends
+ const DocPlus docOverSpace(" a b ", 0);
+ REQUIRE(docOverSpace.document.IsWordAt(1, 4));
+ }
+
+}