@@ -100,25 +100,37 @@ object Applications {
100100 Nil
101101 }
102102
103+ /** If `getType` is of the form:
104+ * ```
105+ * {
106+ * def lengthCompare(len: Int): Int // or, def length: Int
107+ * def apply(i: Int): T = a(i)
108+ * def drop(n: Int): scala.Seq[T]
109+ * def toSeq: scala.Seq[T]
110+ * }
111+ * ```
112+ * returns `T`, otherwise NoType.
113+ */
103114 def unapplySeqTypeElemTp (getTp : Type ): Type = {
104- val lengthTp = ExprType (defn.IntType )
105- val lengthCompareTp = MethodType (List (" len " .toTermName))(_ => defn.IntType :: Nil , _ => defn.IntType )
106- def applyTp (elemTp : Type ) = MethodType (List (" i " .toTermName))(_ => defn.IntType :: Nil , _ => elemTp)
107- def dropTp (elemTp : Type ) = MethodType (List (" n " .toTermName))(_ => defn.IntType :: Nil , _ => defn.SeqType .appliedTo(elemTp))
115+ def lengthTp = ExprType (defn.IntType )
116+ def lengthCompareTp = MethodType (List (defn.IntType ), defn.IntType )
117+ def applyTp (elemTp : Type ) = MethodType (List (defn.IntType ), elemTp)
118+ def dropTp (elemTp : Type ) = MethodType (List (defn.IntType ), defn.SeqType .appliedTo(elemTp))
108119 def toSeqTp (elemTp : Type ) = ExprType (defn.SeqType .appliedTo(elemTp))
109120
121+ // the result type of `def apply(i: Int): T`
110122 val elemTp = getTp.member(nme.apply).suchThat(_.info <:< applyTp(WildcardType )).info.resultType
111123
112- def test (name : Name , tp : Type ) = getTp.member(name).suchThat(getTp.memberInfo(_) <:< tp).exists
124+ def hasMethod (name : Name , tp : Type ) =
125+ getTp.member(name).suchThat(getTp.memberInfo(_) <:< tp).exists
113126
114- val valid =
127+ val isValid =
115128 elemTp.exists &&
116- (test(nme.lengthCompare, lengthCompareTp) ||
117- test(nme.length, lengthTp)) &&
118- test(nme.drop, dropTp(elemTp)) &&
119- test(nme.toSeq, toSeqTp(elemTp))
129+ (hasMethod(nme.lengthCompare, lengthCompareTp) || hasMethod(nme.length, lengthTp)) &&
130+ hasMethod(nme.drop, dropTp(elemTp)) &&
131+ hasMethod(nme.toSeq, toSeqTp(elemTp))
120132
121- if (valid ) elemTp else NoType
133+ if (isValid ) elemTp else NoType
122134 }
123135
124136 if (unapplyName == nme.unapplySeq) {
0 commit comments