Fix a bug of the conversion of the correction algorithm
Bug: 5414829
+1 25
-1 17
+2 0
-2 0
+3 0
-3 0
+4 15
-4 9
+5 2
-5 9
+6 13
-6 4
+7 3
-7 19
Change-Id: Ie99db961051320ee31d31476ea7c25b1d837c484
diff --git a/native/src/correction.cpp b/native/src/correction.cpp
index d1e866d..a08a21b 100644
--- a/native/src/correction.cpp
+++ b/native/src/correction.cpp
@@ -299,23 +299,41 @@
// TODO: Change the limit if we'll allow two or more proximity chars with corrections
const bool checkProximityChars = noCorrectionsHappenedSoFar || mProximityCount == 0;
- const ProximityInfo::ProximityType matchedProximityCharId = secondTransposing
+ ProximityInfo::ProximityType matchedProximityCharId = secondTransposing
? ProximityInfo::EQUIVALENT_CHAR
: mProximityInfo->getMatchedProximityId(mInputIndex, c, checkProximityChars);
if (ProximityInfo::UNRELATED_CHAR == matchedProximityCharId) {
+ if (canTryCorrection && mOutputIndex > 0
+ && mCorrectionStates[mOutputIndex].mProximityMatching
+ && mCorrectionStates[mOutputIndex].mExceeding
+ && isEquivalentChar(mProximityInfo->getMatchedProximityId(
+ mInputIndex, mWord[mOutputIndex - 1], false))) {
+ if (DEBUG_CORRECTION) {
+ LOGI("CONVERSION p->e %c", mWord[mOutputIndex - 1]);
+ }
+ // Conversion p->e
+ // Example:
+ // wearth -> earth
+ // px -> (E)mmmmm
+ ++mExcessiveCount;
+ --mProximityCount;
+ mExcessivePos = mOutputIndex - 1;
+ ++mInputIndex;
+ // Here, we are doing something equivalent to matchedProximityCharId,
+ // but we already know that "excessive char correction" just happened
+ // so that we just need to check "mProximityCount == 0".
+ matchedProximityCharId =
+ mProximityInfo->getMatchedProximityId(mInputIndex, c, mProximityCount == 0);
+ }
+ }
+
+ if (ProximityInfo::UNRELATED_CHAR == matchedProximityCharId) {
// TODO: Optimize
// As the current char turned out to be an unrelated char,
// we will try other correction-types. Please note that mCorrectionStates[mOutputIndex]
// here refers to the previous state.
- if (canTryCorrection && mCorrectionStates[mOutputIndex].mProximityMatching
- && mCorrectionStates[mOutputIndex].mExceeding
- && isEquivalentChar(mProximityInfo->getMatchedProximityId(
- mInputIndex, mWord[mOutputIndex], false))) {
- // Conversion p->e
- ++mExcessiveCount;
- --mProximityCount;
- } else if (mInputIndex < mInputLength - 1 && mOutputIndex > 0 && mTransposedCount > 0
+ if (mInputIndex < mInputLength - 1 && mOutputIndex > 0 && mTransposedCount > 0
&& !mCorrectionStates[mOutputIndex].mTransposing
&& mCorrectionStates[mOutputIndex - 1].mTransposing
&& isEquivalentChar(mProximityInfo->getMatchedProximityId(
@@ -425,6 +443,11 @@
|| isSameAsUserTypedLength) && isTerminal) {
mTerminalInputIndex = mInputIndex - 1;
mTerminalOutputIndex = mOutputIndex - 1;
+ if (DEBUG_CORRECTION) {
+ DUMP_WORD(mWord, mOutputIndex);
+ LOGI("ONTERMINAL(1): %d, %d, %d, %d, %c", mProximityCount, mSkippedCount,
+ mTransposedCount, mExcessiveCount, c);
+ }
return ON_TERMINAL;
} else {
return NOT_ON_TERMINAL;