@@ -280,12 +280,12 @@ import transform.SymUtils._
280280 val (foundStr, expectedStr) = Formatting .typeDiff(found2, expected2)(using printCtx)
281281 s """ |Found: $foundStr
282282 |Required: $expectedStr""" .stripMargin
283- + whereSuffix + postScript
283+ + whereSuffix + postScript
284284
285- override def explain =
285+ override def explain =
286286 val treeStr = inTree.map(x => s " \n Tree: ${x.show}" ).getOrElse(" " )
287287 treeStr + " \n " + super .explain
288-
288+
289289
290290 end TypeMismatch
291291
@@ -298,16 +298,16 @@ import transform.SymUtils._
298298 val maxDist = 3 // maximal number of differences to be considered for a hint
299299 val missing = name.show
300300
301- // The names of all non-synthetic, non-private members of `site`
301+ // The symbols of all non-synthetic, non-private members of `site`
302302 // that are of the same type/term kind as the missing member.
303- def candidates : Set [String ] =
303+ def candidates : Set [Symbol ] =
304304 for
305305 bc <- site.widen.baseClasses.toSet
306306 sym <- bc.info.decls.filter(sym =>
307307 sym.isType == name.isTypeName
308308 && ! sym.isConstructor
309309 && ! sym.flagsUNSAFE.isOneOf(Synthetic | Private ))
310- yield sym.name.show
310+ yield sym
311311
312312 // Calculate Levenshtein distance
313313 def distance (s1 : String , s2 : String ): Int =
@@ -323,13 +323,13 @@ import transform.SymUtils._
323323 else (dist(j - 1 )(i) min dist(j)(i - 1 ) min dist(j - 1 )(i - 1 )) + 1
324324 dist(s2.length)(s1.length)
325325
326- // A list of possible candidate strings with their Levenstein distances
326+ // A list of possible candidate symbols with their Levenstein distances
327327 // to the name of the missing member
328- def closest : List [(Int , String )] = candidates
328+ def closest : List [(Int , Symbol )] = candidates
329329 .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
333333
334334 val enumClause =
335335 if ((name eq nme.values) || (name eq nme.valueOf)) && site.classSymbol.companionClass.isEnumClass then
@@ -348,11 +348,15 @@ import transform.SymUtils._
348348 val finalAddendum =
349349 if addendum.nonEmpty then prefixEnumClause(addendum)
350350 else closest match
351- case (d, n ) :: _ =>
351+ case (d, sym ) :: _ =>
352352 val siteName = site match
353353 case site : NamedType => site.name.show
354354 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"
356360 case Nil => prefixEnumClause(" " )
357361
358362 ex " $selected $name is not a member of ${site.widen}$finalAddendum"
0 commit comments