Skip to content

Commit e5be62d

Browse files
authored
Merge pull request scala#5887 from retronym/faster/extension-methods
Optimize implicit search for extension methods
2 parents 11edada + feb200c commit e5be62d

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

src/reflect/scala/reflect/internal/Types.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,9 @@ trait Types
628628
*/
629629
def nonPrivateMember(name: Name): Symbol =
630630
memberBasedOnName(name, BridgeAndPrivateFlags)
631+
def hasNonPrivateMember(name: Name): Boolean = {
632+
new HasMember(this, name, BridgeAndPrivateFlags, 0L).apply()
633+
}
631634

632635
def packageObject: Symbol = member(nme.PACKAGE)
633636

@@ -4225,10 +4228,11 @@ trait Types
42254228
else if (member.isOverloaded) member.alternatives exists directlySpecializedBy
42264229
else directlySpecializedBy(member)
42274230
)
4231+
val isHasMember = sym.info == WildcardType // OPT avoid full findMember during search for extension methods, e.g pt = `?{ def extension: ? }`.
42284232

42294233
( (tp.typeSymbol isBottomSubClass sym.owner)
4230-
|| specializedBy(tp nonPrivateMember sym.name)
4231-
)
4234+
|| (if (isHasMember) tp.hasNonPrivateMember(sym.name) else specializedBy(tp nonPrivateMember sym.name))
4235+
)
42324236
}
42334237

42344238
/** Does member `symLo` of `tpLo` have a stronger type

0 commit comments

Comments
 (0)