@@ -601,10 +601,11 @@ object Objects:
601
601
case _ => a
602
602
603
603
def filterType (tpe : Type )(using Context ): Value =
604
- // if tpe is SAMType and a is Fun, allow it
605
604
val baseClasses = tpe.baseClasses
606
605
if baseClasses.isEmpty then a
607
- else filterClass(baseClasses.head) // could have called ClassSymbol, but it does not handle OrType and AndType
606
+ else tpe match
607
+ case t @ SAMType (_, _) if a.isInstanceOf [Fun ] => a // if tpe is SAMType and a is Fun, allow it
608
+ case _ => filterClass(baseClasses.head) // could have called ClassSymbol, but it does not handle OrType and AndType
608
609
609
610
def filterClass (sym : Symbol )(using Context ): Value =
610
611
if ! sym.isClass then a
@@ -616,10 +617,9 @@ object Objects:
616
617
case ref : Ref => Bottom
617
618
case ValueSet (values) => values.map(v => v.filterClass(klass)).join
618
619
case arr : OfArray => if defn.ArrayClass .isSubClass(klass) then arr else Bottom
619
- case fun : Fun => if defn.Function1 .isSubClass(klass) then fun else Bottom
620
- // TODO: could be more precise for OfArray; possibly add class information for Fun
621
- // If ArrayClass.isSubClass(klass) keep the array else discard (see Definitions.scala)
622
- // For function, if any superclass is FunctionClass (or a single abstract method interface?), allow it
620
+ case fun : Fun =>
621
+ val functionSuperCls = klass.baseClasses.filter(defn.isFunctionClass)
622
+ if functionSuperCls.nonEmpty then fun else Bottom
623
623
624
624
extension (value : Ref | Cold .type )
625
625
def widenRefOrCold (height : Int )(using Context ) : Ref | Cold .type = value.widen(height).asInstanceOf [ThisValue ]
0 commit comments