@@ -280,12 +280,12 @@ import transform.SymUtils._
280
280
val (foundStr, expectedStr) = Formatting .typeDiff(found2, expected2)(using printCtx)
281
281
s """ |Found: $foundStr
282
282
|Required: $expectedStr""" .stripMargin
283
- + whereSuffix + postScript
283
+ + whereSuffix + postScript
284
284
285
- override def explain =
285
+ override def explain =
286
286
val treeStr = inTree.map(x => s " \n Tree: ${x.show}" ).getOrElse(" " )
287
287
treeStr + " \n " + super .explain
288
-
288
+
289
289
290
290
end TypeMismatch
291
291
@@ -298,16 +298,16 @@ import transform.SymUtils._
298
298
val maxDist = 3 // maximal number of differences to be considered for a hint
299
299
val missing = name.show
300
300
301
- // The names of all non-synthetic, non-private members of `site`
301
+ // The symbols of all non-synthetic, non-private members of `site`
302
302
// that are of the same type/term kind as the missing member.
303
- def candidates : Set [String ] =
303
+ def candidates : Set [Symbol ] =
304
304
for
305
305
bc <- site.widen.baseClasses.toSet
306
306
sym <- bc.info.decls.filter(sym =>
307
307
sym.isType == name.isTypeName
308
308
&& ! sym.isConstructor
309
309
&& ! sym.flagsUNSAFE.isOneOf(Synthetic | Private ))
310
- yield sym.name.show
310
+ yield sym
311
311
312
312
// Calculate Levenshtein distance
313
313
def distance (s1 : String , s2 : String ): Int =
@@ -323,13 +323,13 @@ import transform.SymUtils._
323
323
else (dist(j - 1 )(i) min dist(j)(i - 1 ) min dist(j - 1 )(i - 1 )) + 1
324
324
dist(s2.length)(s1.length)
325
325
326
- // A list of possible candidate strings with their Levenstein distances
326
+ // A list of possible candidate symbols with their Levenstein distances
327
327
// to the name of the missing member
328
- def closest : List [(Int , String )] = candidates
328
+ def closest : List [(Int , Symbol )] = candidates
329
329
.toList
330
- .map(n => (distance(n , missing), n ))
331
- .filter((d, n ) => d <= maxDist && d < missing.length && d < n .length)
332
- .sorted // sort by distance first, alphabetically second
330
+ .map(sym => (distance(sym.name.show , missing), sym ))
331
+ .filter((d, sym ) => d <= maxDist && d < missing.length && d < sym.name.show .length)
332
+ .sortBy((d, sym) => (d, sym.name.show)) // sort by distance first, alphabetically second
333
333
334
334
val enumClause =
335
335
if ((name eq nme.values) || (name eq nme.valueOf)) && site.classSymbol.companionClass.isEnumClass then
@@ -348,11 +348,15 @@ import transform.SymUtils._
348
348
val finalAddendum =
349
349
if addendum.nonEmpty then prefixEnumClause(addendum)
350
350
else closest match
351
- case (d, n ) :: _ =>
351
+ case (d, sym ) :: _ =>
352
352
val siteName = site match
353
353
case site : NamedType => site.name.show
354
354
case site => i " $site"
355
- s " - did you mean $siteName. $n? $enumClause"
355
+ val showName =
356
+ // Add .type to the name if it is a module
357
+ if sym.is(ModuleClass ) then s " ${sym.name.show}.type "
358
+ else sym.name.show
359
+ s " - did you mean $siteName. $showName? $enumClause"
356
360
case Nil => prefixEnumClause(" " )
357
361
358
362
ex " $selected $name is not a member of ${site.widen}$finalAddendum"
0 commit comments