Skip to content

Commit 8c15881

Browse files
committed
Move traverser to library
1 parent 50d4714 commit 8c15881

File tree

2 files changed

+162
-210
lines changed

2 files changed

+162
-210
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package scala.tasty
2+
package util
3+
4+
import scala.runtime.tasty.Toolbox
5+
6+
class TreeTraverser(implicit toolbox: Toolbox) {
7+
8+
def traverse(arg: statements.TopLevelStatement): Unit = {
9+
import statements._
10+
arg match {
11+
case arg: terms.Term =>
12+
traverse(arg)
13+
case arg: Definition =>
14+
traverse(arg)
15+
case Package(pkg, body) =>
16+
traverse(pkg)
17+
body.foreach(traverse)
18+
case Import(expr, _) =>
19+
traverse(expr)
20+
case _ =>
21+
}
22+
}
23+
24+
def traverse(arg: statements.Definition): Unit = {
25+
import statements._
26+
arg match {
27+
case ValDef(_, tpt, rhs, _) =>
28+
traverse(tpt)
29+
rhs.foreach(traverse)
30+
case DefDef(_, typeParams, paramss, returnTpt, rhs, _) =>
31+
typeParams.foreach(traverse)
32+
paramss.foreach(_.foreach(traverse))
33+
traverse(returnTpt)
34+
rhs.foreach(traverse)
35+
case TypeDef(_, rhs, _) =>
36+
traverse(rhs)
37+
case ClassDef(_, constructor, parents, self, body, _) =>
38+
traverse(constructor)
39+
parents.foreach {
40+
case Left(term) => traverse(term)
41+
case Right(typetree) => traverse(typetree)
42+
}
43+
self.foreach(traverse)
44+
body.foreach(traverse)
45+
case _ =>
46+
}
47+
}
48+
49+
def traverse(arg: terms.Term): Unit = {
50+
import terms._
51+
arg match {
52+
case Select(qual, _) =>
53+
traverse(qual)
54+
case New(tpt) =>
55+
traverse(tpt)
56+
case NamedArg(name, arg) =>
57+
traverse(arg)
58+
case Apply(fn, args) =>
59+
traverse(fn)
60+
args.foreach(traverse)
61+
case TypeApply(fn, args) =>
62+
traverse(fn)
63+
args.foreach(traverse)
64+
case Super(qual, mixin) =>
65+
traverse(qual)
66+
case Typed(expr, tpt) =>
67+
traverse(expr)
68+
traverse(tpt)
69+
case Assign(lhs, rhs) =>
70+
traverse(lhs)
71+
traverse(rhs)
72+
case Block(stats, expr) =>
73+
stats.foreach(traverse)
74+
traverse(expr)
75+
case Lambda(meth, tpt) =>
76+
traverse(meth)
77+
tpt.foreach(traverse)
78+
case If(cond, thenp, elsep) =>
79+
traverse(cond)
80+
traverse(thenp)
81+
traverse(elsep)
82+
case Match(selector, cases) =>
83+
traverse(selector)
84+
cases.foreach(traverse)
85+
case Try(body, catches, finalizer) =>
86+
traverse(body)
87+
catches.foreach(traverse)
88+
finalizer.foreach(traverse)
89+
case Return(expr) =>
90+
traverse(expr)
91+
case Repeated(args) =>
92+
args.foreach(traverse)
93+
case _ =>
94+
// Literal(const)
95+
// Ident(name)
96+
97+
}
98+
}
99+
100+
def traverse(arg: patterns.CaseDef): Unit = {
101+
import patterns.CaseDef
102+
arg match {
103+
case CaseDef(pat, guard, body) =>
104+
traverse(pat)
105+
guard.foreach(traverse)
106+
traverse(body)
107+
case _ =>
108+
}
109+
}
110+
111+
def traverse(arg: patterns.Pattern): Unit = {
112+
import patterns._
113+
arg match {
114+
case Value(v) =>
115+
traverse(v)
116+
case Bind(_, body) =>
117+
traverse(body)
118+
case Unapply(fun, implicits, patterns) =>
119+
traverse(fun)
120+
implicits.foreach(traverse)
121+
patterns.foreach(traverse)
122+
case Alternative(patterns) =>
123+
patterns.foreach(traverse)
124+
case TypeTest(tpt) =>
125+
traverse(tpt)
126+
case _ =>
127+
}
128+
}
129+
130+
def traverse(arg: typetrees.TypeTree): Unit = {
131+
import typetrees._
132+
arg match {
133+
case Select(qual, _) =>
134+
traverse(qual)
135+
case Singleton(ref) =>
136+
traverse(ref)
137+
case Refined(tpt, refinements) =>
138+
traverse(tpt)
139+
refinements.foreach(traverse)
140+
case Applied(tycon, args) =>
141+
traverse(tycon)
142+
args.foreach(traverse)
143+
case TypeBounds(lo, hi) =>
144+
traverse(lo)
145+
traverse(hi)
146+
case Annotated(arg, annot) =>
147+
traverse(arg)
148+
traverse(annot)
149+
case And(left, right) =>
150+
traverse(left)
151+
traverse(right)
152+
case Or(left, right) =>
153+
traverse(left)
154+
traverse(right)
155+
case ByName(tpt) =>
156+
traverse(tpt)
157+
case _ =>
158+
// Ident(name)
159+
// Synthetic()
160+
}
161+
}
162+
}

tests/run-with-compiler/tasty-extractors.scala

Lines changed: 0 additions & 210 deletions
Original file line numberDiff line numberDiff line change
@@ -106,214 +106,4 @@ object Test {
106106
'{ class Foo { type X }; def f(a: Foo { type X = Int }): a.X = ??? },
107107

108108
)
109-
110-
class TreeTraverser {
111-
112-
def traverse(arg: statements.TopLevelStatement): Unit = {
113-
import statements._
114-
arg match {
115-
case arg: terms.Term =>
116-
traverse(arg)
117-
case arg: Definition =>
118-
traverse(arg)
119-
case Package(pkg, body) =>
120-
traverse(pkg)
121-
body.foreach(traverse)
122-
case Import(expr, selectors) =>
123-
traverse(expr)
124-
selectors.foreach(traverse)
125-
case _ =>
126-
}
127-
}
128-
129-
def traverse(arg: statements.Definition): Unit = {
130-
import statements._
131-
arg match {
132-
case ValDef(name, tpt, rhs, mods) =>
133-
traverse(name)
134-
traverse(tpt)
135-
rhs.foreach(traverse)
136-
mods.foreach(traverse)
137-
case DefDef(name, typeParams, paramss, returnTpt, rhs, mods) =>
138-
traverse(name)
139-
typeParams.foreach(traverse)
140-
paramss.foreach(_.foreach(traverse))
141-
traverse(returnTpt)
142-
rhs.foreach(traverse)
143-
mods.foreach(traverse)
144-
case TypeDef(name, rhs, mods) =>
145-
traverse(name)
146-
traverse(rhs)
147-
mods.foreach(traverse)
148-
case ClassDef(name, contraverseuctor, parents, self, body, mods) =>
149-
traverse(name)
150-
traverse(contraverseuctor)
151-
parents.foreach {
152-
case Left(term) => traverse(term)
153-
case Right(typetree) => traverse(typetree)
154-
}
155-
self.foreach(traverse)
156-
body.foreach(traverse)
157-
mods.foreach(traverse)
158-
case _ =>
159-
}
160-
}
161-
162-
def traverse(arg: terms.Term): Unit = {
163-
import terms._
164-
arg match {
165-
case Ident(name) =>
166-
traverse(name)
167-
case Select(qual, name) =>
168-
traverse(qual)
169-
traverse(name)
170-
case Literal(const) =>
171-
traverse(const)
172-
case New(tpt) =>
173-
traverse(tpt)
174-
case NamedArg(name, arg) =>
175-
traverse(name)
176-
traverse(arg)
177-
case Apply(fn, args) =>
178-
traverse(fn)
179-
args.foreach(traverse)
180-
case TypeApply(fn, args) =>
181-
traverse(fn)
182-
args.foreach(traverse)
183-
case Super(qual, mixin) =>
184-
traverse(qual)
185-
mixin.foreach(traverse)
186-
case Typed(expr, tpt) =>
187-
traverse(expr)
188-
traverse(tpt)
189-
case Assign(lhs, rhs) =>
190-
traverse(lhs)
191-
traverse(rhs)
192-
case Block(stats, expr) =>
193-
stats.foreach(traverse)
194-
traverse(expr)
195-
case Lambda(meth, tpt) =>
196-
traverse(meth)
197-
tpt.foreach(traverse)
198-
case If(cond, thenp, elsep) =>
199-
traverse(cond)
200-
traverse(thenp)
201-
traverse(elsep)
202-
case Match(selector, cases) =>
203-
traverse(selector)
204-
cases.foreach(traverse)
205-
case Try(body, catches, finalizer) =>
206-
traverse(body)
207-
catches.foreach(traverse)
208-
finalizer.foreach(traverse)
209-
case Return(expr) =>
210-
traverse(expr)
211-
case Repeated(args) =>
212-
args.foreach(traverse)
213-
case _ =>
214-
}
215-
}
216-
217-
def traverse(arg: patterns.CaseDef): Unit = {
218-
import patterns.CaseDef
219-
arg match {
220-
case CaseDef(pat, guard, body) =>
221-
traverse(pat)
222-
guard.foreach(traverse)
223-
traverse(body)
224-
case _ =>
225-
}
226-
}
227-
228-
def traverse(arg: patterns.Pattern): Unit = {
229-
import patterns._
230-
arg match {
231-
case Value(v) =>
232-
traverse(v)
233-
case Bind(name, body) =>
234-
traverse(name)
235-
traverse(body)
236-
case Unapply(fun, implicits, patterns) =>
237-
traverse(fun)
238-
implicits.foreach(traverse)
239-
patterns.foreach(traverse)
240-
case Alternative(patterns) =>
241-
patterns.foreach(traverse)
242-
case TypeTest(tpt) =>
243-
traverse(tpt)
244-
case _ =>
245-
}
246-
}
247-
248-
def traverse(arg: names.TermName): Unit = {
249-
import names._
250-
arg match {
251-
case Simple(name) =>
252-
case _ => ???
253-
}
254-
}
255-
256-
def traverse(arg: names.PossiblySignedName): Unit = {
257-
arg match {
258-
case _ => ???
259-
}
260-
}
261-
262-
def traverse(arg: typetrees.TypeTree): Unit = {
263-
import typetrees._
264-
arg match {
265-
case Synthetic() =>
266-
case Ident(name) => traverse(name)
267-
case Select(qual, name) =>
268-
traverse(qual)
269-
traverse(name)
270-
case Singleton(ref) => traverse(ref)
271-
// case Refined(tpt, refinements) =>
272-
// traverse(ref)
273-
// refinements.foreach(traverse)
274-
case Applied(tycon, args) =>
275-
traverse(tycon)
276-
args.foreach(traverse)
277-
case TypeBounds(lo, hi) =>
278-
traverse(lo)
279-
traverse(hi)
280-
case Annotated(arg, annot) =>
281-
traverse(arg)
282-
traverse(annot)
283-
case And(left, right) =>
284-
traverse(left)
285-
traverse(right)
286-
case Or(left, right) =>
287-
traverse(left)
288-
traverse(right)
289-
case ByName(tpt) =>
290-
traverse(tpt)
291-
case _ =>
292-
}
293-
}
294-
295-
def traverse(arg: names.TypeName): Unit = arg match {
296-
case _ => arg.toString // TODO
297-
case _ =>
298-
}
299-
300-
def traverse(arg: scala.tasty.Id): Unit = ()
301-
302-
def traverse(arg: Modifier): Unit = ()
303-
304-
def traverse(arg: statements.Import.ImportSelector): Unit = {
305-
import statements.Import.ImportSelector._
306-
arg match {
307-
case Simple(id) =>
308-
traverse(id)
309-
case Rename(id1, id2) =>
310-
traverse(id1)
311-
traverse(id2)
312-
case Omit(id) =>
313-
traverse(id)
314-
}
315-
}
316-
317-
def traverse(arg: Constant): Unit = ()
318-
}
319109
}

0 commit comments

Comments
 (0)