@@ -798,7 +798,8 @@ object Types {
798
798
*/
799
799
final def memberNames (keepOnly : NameFilter , pre : Type = this )(using Context ): Set [Name ] = this match {
800
800
case tp : ClassInfo =>
801
- tp.cls.classDenot.memberNames(keepOnly) filter (keepOnly(pre, _))
801
+ val names = tp.cls.classDenot.memberNames(keepOnly)
802
+ if keepOnly.isStable then names else names.filter(keepOnly(pre, _))
802
803
case tp : RefinedType =>
803
804
val ns = tp.parent.memberNames(keepOnly, pre)
804
805
if (keepOnly(pre, tp.refinedName)) ns + tp.refinedName else ns
@@ -5654,6 +5655,11 @@ object Types {
5654
5655
*/
5655
5656
abstract class NameFilter {
5656
5657
def apply (pre : Type , name : Name )(using Context ): Boolean
5658
+
5659
+ /** Filter does not need to be rechecked with full prefix, if it
5660
+ * has been already checked for the class denotation of the prefix
5661
+ */
5662
+ def isStable : Boolean
5657
5663
}
5658
5664
5659
5665
/** A filter for names of abstract types of a given type */
@@ -5663,6 +5669,7 @@ object Types {
5663
5669
val mbr = pre.nonPrivateMember(name)
5664
5670
mbr.symbol.is(Deferred ) && mbr.info.isInstanceOf [RealTypeBounds ]
5665
5671
}
5672
+ def isStable = false
5666
5673
}
5667
5674
5668
5675
/** A filter for names of abstract types of a given type */
@@ -5672,12 +5679,14 @@ object Types {
5672
5679
val mbr = pre.member(name)
5673
5680
mbr.symbol.isType && ! mbr.symbol.isClass
5674
5681
}
5682
+ def isStable = false
5675
5683
}
5676
5684
5677
5685
/** A filter for names of deferred term definitions of a given type */
5678
5686
object abstractTermNameFilter extends NameFilter {
5679
5687
def apply (pre : Type , name : Name )(using Context ): Boolean =
5680
5688
name.isTermName && pre.nonPrivateMember(name).hasAltWith(_.symbol.is(Deferred ))
5689
+ def isStable = false
5681
5690
}
5682
5691
5683
5692
/** A filter for names of type aliases of a given type */
@@ -5687,19 +5696,23 @@ object Types {
5687
5696
val mbr = pre.nonPrivateMember(name)
5688
5697
mbr.symbol.isAliasType
5689
5698
}
5699
+ def isStable = false
5690
5700
}
5691
5701
5692
5702
object typeNameFilter extends NameFilter {
5693
5703
def apply (pre : Type , name : Name )(using Context ): Boolean = name.isTypeName
5704
+ def isStable = true
5694
5705
}
5695
5706
5696
5707
object fieldFilter extends NameFilter {
5697
5708
def apply (pre : Type , name : Name )(using Context ): Boolean =
5698
5709
name.isTermName && (pre member name).hasAltWith(! _.symbol.is(Method ))
5710
+ def isStable = true
5699
5711
}
5700
5712
5701
5713
object takeAllFilter extends NameFilter {
5702
5714
def apply (pre : Type , name : Name )(using Context ): Boolean = true
5715
+ def isStable = true
5703
5716
}
5704
5717
5705
5718
object implicitFilter extends NameFilter {
@@ -5708,6 +5721,7 @@ object Types {
5708
5721
* no post-filtering is needed.
5709
5722
*/
5710
5723
def apply (pre : Type , name : Name )(using Context ): Boolean = true
5724
+ def isStable = true
5711
5725
}
5712
5726
5713
5727
// ----- Debug ---------------------------------------------------------
0 commit comments