summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2021-03-18 05:26:45 -0700
committerGitHub <noreply@github.com>2021-03-18 13:26:45 +0100
commit9d4d27a3ce6f7291be57554e059a03a746be7296 (patch)
tree2f1dc08a735f6543a03d322d79254a8f68f9a1d2
parent2356d0603f70cad90f76fa57999054bf5c0a9157 (diff)
downloadNim-9d4d27a3ce6f7291be57554e059a03a746be7296.tar.gz
adjust spellSuggestSecretSauce logic to avoid too many matches for small symbols (#17410)
-rw-r--r--compiler/lookups.nim10
-rw-r--r--tests/misc/tspellsuggest.nim2
-rw-r--r--tests/misc/tspellsuggest2.nim2
3 files changed, 10 insertions, 4 deletions
diff --git a/compiler/lookups.nim b/compiler/lookups.nim
index e928f707e..15a22c778 100644
--- a/compiler/lookups.nim
+++ b/compiler/lookups.nim
@@ -408,10 +408,16 @@ proc fixSpelling(c: PContext, n: PNode, ident: PIdent, result: var string) =
     if list.len == 0: break
     let e = list.pop()
     if c.config.spellSuggestMax == spellSuggestSecretSauce:
-      if e.dist > e0.dist: break
+      const
+        smallThres = 2
+        maxCountForSmall = 4
+        # avoids ton of operator matches when mis-matching short symbols such as `i`
+        # other heuristics could be devised, such as only suggesting operators if `name0`
+        # is an operator (likewise with non-operators).
+      if e.dist > e0.dist or (name0.len <= smallThres and count >= maxCountForSmall): break
     elif count >= c.config.spellSuggestMax: break
     if count == 0:
-      result.add "\ncandidate misspellings (edit distance, lexical scope distance): "
+      result.add "\ncandidates (edit distance, scope distance); see '--spellSuggest': "
     result.add e.msg
     count.inc
 
diff --git a/tests/misc/tspellsuggest.nim b/tests/misc/tspellsuggest.nim
index 938be3460..033ed0afc 100644
--- a/tests/misc/tspellsuggest.nim
+++ b/tests/misc/tspellsuggest.nim
@@ -4,7 +4,7 @@ discard """
   action: "reject"
   nimout: '''
 tspellsuggest.nim(45, 13) Error: undeclared identifier: 'fooBar'
-candidate misspellings (edit distance, lexical scope distance):
+candidates (edit distance, scope distance); see '--spellSuggest':
  (1, 0): 'fooBar8' [var declared in tspellsuggest.nim(43, 9)]
  (1, 1): 'fooBar7' [var declared in tspellsuggest.nim(41, 7)]
  (1, 3): 'fooBar1' [var declared in tspellsuggest.nim(33, 5)]
diff --git a/tests/misc/tspellsuggest2.nim b/tests/misc/tspellsuggest2.nim
index fc3d9668a..78504c513 100644
--- a/tests/misc/tspellsuggest2.nim
+++ b/tests/misc/tspellsuggest2.nim
@@ -4,7 +4,7 @@ discard """
   action: "reject"
   nimout: '''
 tspellsuggest2.nim(45, 13) Error: undeclared identifier: 'fooBar'
-candidate misspellings (edit distance, lexical scope distance):
+candidates (edit distance, scope distance); see '--spellSuggest':
  (1, 0): 'fooBar8' [var declared in tspellsuggest2.nim(43, 9)]
  (1, 1): 'fooBar7' [var declared in tspellsuggest2.nim(41, 7)]
  (1, 3): 'fooBar1' [var declared in tspellsuggest2.nim(33, 5)]