fix: itta-then-delete crash

This commit is contained in:
ensan-hcl
2025-07-15 14:05:44 -07:00
parent 1757546802
commit 48c267f47e
3 changed files with 31 additions and 5 deletions

View File

@ -58,12 +58,12 @@ extension Kana2Kanji {
} else {
// (2)
let rawNodes = latticeIndices.map { index in
let inputRange: (startIndex: Int, endIndexRange: Range<Int>?)? = if let iIndex = index.inputIndex {
let inputRange: (startIndex: Int, endIndexRange: Range<Int>?)? = if let iIndex = index.inputIndex, max(commonInputCount, iIndex) < inputCount {
(iIndex, max(commonInputCount, iIndex) ..< inputCount)
} else {
nil
}
let surfaceRange: (startIndex: Int, endIndexRange: Range<Int>?)? = if let sIndex = index.surfaceIndex {
let surfaceRange: (startIndex: Int, endIndexRange: Range<Int>?)? = if let sIndex = index.surfaceIndex, max(commonSurfaceCount, sIndex) < surfaceCount {
(sIndex, max(commonSurfaceCount, sIndex) ..< surfaceCount)
} else {
nil
@ -92,7 +92,9 @@ extension Kana2Kanji {
}
//
let nextIndex = indexMap.dualIndex(for: node.range.endIndex)
self.updateNextNodes(with: node, nextNodes: addedNodes[index: nextIndex], nBest: N_best)
if nextIndex != .bothIndex(inputIndex: inputCount, surfaceIndex: surfaceCount) {
self.updateNextNodes(with: node, nextNodes: addedNodes[index: nextIndex], nBest: N_best)
}
}
}
lattice.merge(addedNodes)

View File

@ -488,7 +488,7 @@ public final class DicdataStore {
inputRange.startIndex + self.maxlength
)
if inputRange.startIndex > toInputIndexLeft || toInputIndexLeft >= toInputIndexRight {
debug(#function, "index is wrong")
debug(#function, "index is wrong", inputRange)
return []
}
inputProcessRange = .init(leftIndex: inputRange.startIndex, rightIndexRange: toInputIndexLeft ..< toInputIndexRight)
@ -504,7 +504,7 @@ public final class DicdataStore {
surfaceRange.startIndex + self.maxlength
)
if surfaceRange.startIndex > toSurfaceIndexLeft || toSurfaceIndexLeft >= toSurfaceIndexRight {
debug(#function, "index is wrong")
debug(#function, "index is wrong", surfaceRange)
return []
}
surfaceProcessRange = .init(leftIndex: surfaceRange.startIndex, rightIndexRange: toSurfaceIndexLeft ..< toSurfaceIndexRight)

View File

@ -132,6 +132,30 @@ final class ConverterTests: XCTestCase {
}
}
// memo: fatalError
func testIttaAndThenDelete() async throws {
let converter = await KanaKanjiConverter()
var c = ComposingText()
let text = "itta"
//
let possibles = [
"いった",
"行った",
"言った"
]
for char in text {
c.insertAtCursorPosition(String(char), inputStyle: .roman2kana)
let results = await converter.requestCandidates(c, options: requestOptions())
if c.input.count == text.count {
XCTAssertTrue(possibles.contains(results.mainResults.first!.text))
}
}
// 1
c.deleteBackwardFromCursorPosition(count: 1)
let results = await converter.requestCandidates(c, options: requestOptions())
XCTAssertTrue(results.mainResults.contains { $0.text == "言っ" })
}
// 1
// memo: deleted_last_n
func testGradualConversionWithDelete() async throws {