@@ -13,6 +13,7 @@ import scala.collection.{immutable, mutable}
13
13
trait Placeholders { self : Quasiquotes =>
14
14
import global ._
15
15
import Cardinality ._
16
+ import universeTypes ._
16
17
17
18
// Step 1: Transform Scala source with holes into vanilla Scala source
18
19
@@ -32,13 +33,17 @@ trait Placeholders { self: Quasiquotes =>
32
33
def appendHole (tree : Tree , cardinality : Cardinality ) = {
33
34
val placeholderName = c.freshName(TermName (nme.QUASIQUOTE_PREFIX + sessionSuffix))
34
35
sb.append(placeholderName)
35
- val holeTree = if (method == nme.unapply) Bind (placeholderName, Ident (nme.WILDCARD )) else tree
36
- holeMap(placeholderName) = Hole (holeTree, cardinality)
36
+ val holeTree =
37
+ if (method != nme.unapply) tree
38
+ else Bind (placeholderName, tree)
39
+ holeMap(placeholderName) = Hole (cardinality, holeTree)
37
40
}
38
41
39
42
val iargs = method match {
40
43
case nme.apply => args
41
- case nme.unapply => List .fill(parts.length - 1 )(EmptyTree )
44
+ case nme.unapply =>
45
+ val (dummy @ Ident (nme.SELECTOR_DUMMY )) :: Nil = args
46
+ dummy.attachments.get[SubpatternsAttachment ].get.patterns
42
47
case _ => global.abort(" unreachable" )
43
48
}
44
49
@@ -78,9 +83,9 @@ trait Placeholders { self: Quasiquotes =>
78
83
79
84
trait HolePlaceholder {
80
85
def matching : PartialFunction [Any , Name ]
81
- def unapply (scrutinee : Any ): Option [( Tree , Location , Cardinality ) ] = {
86
+ def unapply (scrutinee : Any ): Option [Hole ] = {
82
87
val name = matching.lift(scrutinee)
83
- name.flatMap { holeMap.get(_).map { case Hole (repr, loc, card) => (repr, loc, card) } }
88
+ name.flatMap { holeMap.get(_) }
84
89
}
85
90
}
86
91
@@ -128,44 +133,44 @@ trait Placeholders { self: Quasiquotes =>
128
133
}
129
134
130
135
object SymbolPlaceholder {
131
- def unapply (scrutinee : Any ): Option [Tree ] = scrutinee match {
132
- case Placeholder (tree, SymbolLocation , _) => Some (tree )
136
+ def unapply (scrutinee : Any ): Option [Hole ] = scrutinee match {
137
+ case Placeholder (hole : ApplyHole ) if hole.tpe <:< symbolType => Some (hole )
133
138
case _ => None
134
139
}
135
140
}
136
141
137
142
object CasePlaceholder {
138
- def unapply (tree : Tree ): Option [( Tree , Location , Cardinality ) ] = tree match {
139
- case CaseDef (Apply (Ident (nme.QUASIQUOTE_CASE ), List (Placeholder (tree, location, card ))), EmptyTree , EmptyTree ) => Some ((tree, location, card) )
143
+ def unapply (tree : Tree ): Option [Hole ] = tree match {
144
+ case CaseDef (Apply (Ident (nme.QUASIQUOTE_CASE ), List (Placeholder (hole ))), EmptyTree , EmptyTree ) => Some (hole )
140
145
case _ => None
141
146
}
142
147
}
143
148
144
149
object RefineStatPlaceholder {
145
- def unapply (tree : Tree ): Option [( Tree , Location , Cardinality ) ] = tree match {
146
- case ValDef (_, Placeholder (tree, location, card ), Ident (tpnme.QUASIQUOTE_REFINE_STAT ), _) => Some ((tree, location, card) )
150
+ def unapply (tree : Tree ): Option [Hole ] = tree match {
151
+ case ValDef (_, Placeholder (hole ), Ident (tpnme.QUASIQUOTE_REFINE_STAT ), _) => Some (hole )
147
152
case _ => None
148
153
}
149
154
}
150
155
151
156
object EarlyDefPlaceholder {
152
- def unapply (tree : Tree ): Option [( Tree , Location , Cardinality ) ] = tree match {
153
- case ValDef (_, Placeholder (tree, location, card ), Ident (tpnme.QUASIQUOTE_EARLY_DEF ), _) => Some ((tree, location, card) )
157
+ def unapply (tree : Tree ): Option [Hole ] = tree match {
158
+ case ValDef (_, Placeholder (hole ), Ident (tpnme.QUASIQUOTE_EARLY_DEF ), _) => Some (hole )
154
159
case _ => None
155
160
}
156
161
}
157
162
158
163
object PackageStatPlaceholder {
159
- def unapply (tree : Tree ): Option [( Tree , Location , Cardinality ) ] = tree match {
160
- case ValDef (NoMods , Placeholder (tree, location, card ), Ident (tpnme.QUASIQUOTE_PACKAGE_STAT ), EmptyTree ) => Some ((tree, location, card) )
164
+ def unapply (tree : Tree ): Option [Hole ] = tree match {
165
+ case ValDef (NoMods , Placeholder (hole ), Ident (tpnme.QUASIQUOTE_PACKAGE_STAT ), EmptyTree ) => Some (hole )
161
166
case _ => None
162
167
}
163
168
}
164
169
165
170
object ForEnumPlaceholder {
166
- def unapply (tree : Tree ): Option [( Tree , Location , Cardinality ) ] = tree match {
167
- case build.SyntacticValFrom (Bind (Placeholder (tree, location, card ), Ident (nme.WILDCARD )), Ident (nme.QUASIQUOTE_FOR_ENUM )) =>
168
- Some ((tree, location, card) )
171
+ def unapply (tree : Tree ): Option [Hole ] = tree match {
172
+ case build.SyntacticValFrom (Bind (Placeholder (hole ), Ident (nme.WILDCARD )), Ident (nme.QUASIQUOTE_FOR_ENUM )) =>
173
+ Some (hole )
169
174
case _ => None
170
175
}
171
176
}
0 commit comments