diff options
| -rw-r--r-- | src/Document.cxx | 19 | ||||
| -rw-r--r-- | test/unit/testDocument.cxx | 23 | 
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)); +	} + +}  | 
