@@ -15,6 +15,7 @@ import dotty.tools.dotc.ast.untpd
1515import dotty .tools .dotc .core .Comments .Comment
1616import dotty .tools .dotc .core .Constants .Constant
1717import dotty .tools .dotc .core .Contexts .*
18+ import dotty .tools .dotc .core .Decorators .toTermName
1819import dotty .tools .dotc .core .Denotations .SingleDenotation
1920import dotty .tools .dotc .core .Flags
2021import dotty .tools .dotc .core .Flags .*
@@ -765,6 +766,13 @@ class Completions(
765766 ).flatMap(_.alternatives.map(_.symbol)).toSet
766767 )
767768
769+ private lazy val EqualsClass : ClassSymbol = requiredClass(" scala.Equals" )
770+ private lazy val ArrowAssocClass : ClassSymbol = requiredClass(" scala.Predef.ArrowAssoc" )
771+ private lazy val EnsuringClass : ClassSymbol = requiredClass(" scala.Predef.Ensuring" )
772+ private lazy val StringFormatClass : ClassSymbol = requiredClass(" scala.Predef.StringFormat" )
773+ private lazy val nnMethod : Symbol = defn.ScalaPredefModule .info.member(" nn" .toTermName).symbol
774+ private lazy val runtimeCheckedMethod : Symbol = defn.ScalaPredefModule .info.member(" runtimeChecked" .toTermName).symbol
775+
768776 private def isNotLocalForwardReference (sym : Symbol )(using Context ): Boolean =
769777 ! sym.isLocalToBlock ||
770778 ! sym.srcPos.isAfter(completionPos.originalCursorPosition) ||
@@ -783,6 +791,17 @@ class Completions(
783791 (sym.isField && ! isJavaClass && ! isModuleOrClass) || sym.getter != NoSymbol
784792 catch case _ => false
785793
794+ def isInheritedFromScalaLibrary (sym : Symbol ) =
795+ sym.owner == defn.AnyClass ||
796+ sym.owner == defn.ObjectClass ||
797+ sym.owner == defn.ProductClass ||
798+ sym.owner == EqualsClass ||
799+ sym.owner == ArrowAssocClass ||
800+ sym.owner == EnsuringClass ||
801+ sym.owner == StringFormatClass ||
802+ sym == nnMethod ||
803+ sym == runtimeCheckedMethod
804+
786805 def symbolRelevance (sym : Symbol ): Int =
787806 var relevance = 0
788807 // symbols defined in this file are more relevant
@@ -800,7 +819,7 @@ class Completions(
800819 case _ =>
801820
802821 // symbols whose owner is a base class are less relevant
803- if sym.owner == defn. AnyClass || sym.owner == defn. ObjectClass
822+ if isInheritedFromScalaLibrary( sym)
804823 then relevance |= IsInheritedBaseMethod
805824 // symbols not provided via an implicit are more relevant
806825 if sym.is(Implicit ) ||
@@ -812,7 +831,7 @@ class Completions(
812831 // accessors of case class members are more relevant
813832 if ! sym.is(CaseAccessor ) then relevance |= IsNotCaseAccessor
814833 // public symbols are more relevant
815- if ! sym.isPublic then relevance |= IsNotCaseAccessor
834+ if ! sym.isPublic then relevance |= IsNotPublic
816835 // synthetic symbols are less relevant (e.g. `copy` on case classes)
817836 if sym.is(Synthetic ) && ! sym.isAllOf(EnumCase ) then
818837 relevance |= IsSynthetic
0 commit comments