aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Types.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/dotty/tools/dotc/core/Types.scala')
-rw-r--r--src/dotty/tools/dotc/core/Types.scala17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala
index db0831ba0..7e8a11e5b 100644
--- a/src/dotty/tools/dotc/core/Types.scala
+++ b/src/dotty/tools/dotc/core/Types.scala
@@ -139,7 +139,7 @@ object Types {
case _ => false
}
isConcrete(tp) &&
- tp.abstractTypeMembers.forall { m =>
+ tp.nonClassTypeMembers.forall { m =>
val bounds = m.info.bounds
bounds.lo <:< bounds.hi
} ||
@@ -592,6 +592,12 @@ object Types {
(name, buf) => buf += member(name).asSingleDenotation)
}
+ /** The set of abstract type members of this type. */
+ final def nonClassTypeMembers(implicit ctx: Context): Seq[SingleDenotation] = track("nonClassTypeMembers") {
+ memberDenots(nonClassTypeNameFilter,
+ (name, buf) => buf += member(name).asSingleDenotation)
+ }
+
/** The set of type members of this type */
final def typeMembers(implicit ctx: Context): Seq[SingleDenotation] = track("typeMembers") {
memberDenots(typeNameFilter,
@@ -3387,6 +3393,15 @@ object Types {
}
}
+ /** A filter for names of abstract types of a given type */
+ object nonClassTypeNameFilter extends NameFilter {
+ def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean =
+ name.isTypeName && {
+ val mbr = pre.member(name)
+ mbr.symbol.isType && !mbr.symbol.isClass
+ }
+ }
+
/** A filter for names of deferred term definitions of a given type */
object abstractTermNameFilter extends NameFilter {
def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean =