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