@@ -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
@@ -5665,6 +5666,11 @@ object Types {
5665
5666
*/
5666
5667
abstract class NameFilter {
5667
5668
def apply (pre : Type , name : Name )(using Context ): Boolean
5669
+
5670
+ /** Filter does not need to be rechecked with full prefix, if it
5671
+ * has been already checked for the class denotation of the prefix
5672
+ */
5673
+ def isStable : Boolean
5668
5674
}
5669
5675
5670
5676
/** A filter for names of abstract types of a given type */
@@ -5674,6 +5680,7 @@ object Types {
5674
5680
val mbr = pre.nonPrivateMember(name)
5675
5681
mbr.symbol.is(Deferred ) && mbr.info.isInstanceOf [RealTypeBounds ]
5676
5682
}
5683
+ def isStable = false
5677
5684
}
5678
5685
5679
5686
/** A filter for names of abstract types of a given type */
@@ -5683,12 +5690,14 @@ object Types {
5683
5690
val mbr = pre.member(name)
5684
5691
mbr.symbol.isType && ! mbr.symbol.isClass
5685
5692
}
5693
+ def isStable = false
5686
5694
}
5687
5695
5688
5696
/** A filter for names of deferred term definitions of a given type */
5689
5697
object abstractTermNameFilter extends NameFilter {
5690
5698
def apply (pre : Type , name : Name )(using Context ): Boolean =
5691
5699
name.isTermName && pre.nonPrivateMember(name).hasAltWith(_.symbol.is(Deferred ))
5700
+ def isStable = false
5692
5701
}
5693
5702
5694
5703
/** A filter for names of type aliases of a given type */
@@ -5698,19 +5707,23 @@ object Types {
5698
5707
val mbr = pre.nonPrivateMember(name)
5699
5708
mbr.symbol.isAliasType
5700
5709
}
5710
+ def isStable = false
5701
5711
}
5702
5712
5703
5713
object typeNameFilter extends NameFilter {
5704
5714
def apply (pre : Type , name : Name )(using Context ): Boolean = name.isTypeName
5715
+ def isStable = true
5705
5716
}
5706
5717
5707
5718
object fieldFilter extends NameFilter {
5708
5719
def apply (pre : Type , name : Name )(using Context ): Boolean =
5709
5720
name.isTermName && (pre member name).hasAltWith(! _.symbol.is(Method ))
5721
+ def isStable = true
5710
5722
}
5711
5723
5712
5724
object takeAllFilter extends NameFilter {
5713
5725
def apply (pre : Type , name : Name )(using Context ): Boolean = true
5726
+ def isStable = true
5714
5727
}
5715
5728
5716
5729
object implicitFilter extends NameFilter {
@@ -5719,6 +5732,7 @@ object Types {
5719
5732
* no post-filtering is needed.
5720
5733
*/
5721
5734
def apply (pre : Type , name : Name )(using Context ): Boolean = true
5735
+ def isStable = true
5722
5736
}
5723
5737
5724
5738
// ----- Debug ---------------------------------------------------------
0 commit comments