@@ -100,25 +100,37 @@ object Applications {
100
100
Nil
101
101
}
102
102
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
+ */
103
114
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))
108
119
def toSeqTp (elemTp : Type ) = ExprType (defn.SeqType .appliedTo(elemTp))
109
120
121
+ // the result type of `def apply(i: Int): T`
110
122
val elemTp = getTp.member(nme.apply).suchThat(_.info <:< applyTp(WildcardType )).info.resultType
111
123
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
113
126
114
- val valid =
127
+ val isValid =
115
128
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))
120
132
121
- if (valid ) elemTp else NoType
133
+ if (isValid ) elemTp else NoType
122
134
}
123
135
124
136
if (unapplyName == nme.unapplySeq) {
0 commit comments