@@ -9,7 +9,7 @@ import TastyFormat._, NameTags._, TastyTagOps._, TastyRefs._
9
9
10
10
object TastyUnpickler {
11
11
def unpickleClass (in : TastyReader , clazz : ClassInfo , path : String ): Unit = {
12
- val doPrint = false
12
+ // val doPrint = false
13
13
// val doPrint = path.contains("v1") && !path.contains("experimental2.tasty")
14
14
// if (doPrint) TastyPrinter.printClassNames(in.fork, path)
15
15
// if (doPrint) TastyPrinter.printPickle(in.fork, path)
@@ -23,7 +23,13 @@ object TastyUnpickler {
23
23
24
24
object trav extends Traverser {
25
25
var pkgNames = List .empty[Name ]
26
- val classes = new mutable.ListBuffer [(Name , ClsDef )]
26
+ var clsNames = List .empty[Name ]
27
+
28
+ def dropHead [A ](xs : List [A ], head : A ) = xs match {
29
+ case `head` :: ys => ys
30
+ case x :: _ => throw new AssertionError (s " assertion failed: Expected head= $head but it was $x" )
31
+ case _ => throw new AssertionError (s " assertion failed: Expected head= $head but list was empty " )
32
+ }
27
33
28
34
override def traversePkg (pkg : Pkg ): Unit = {
29
35
val pkgName = pkg.path match {
@@ -32,21 +38,22 @@ object TastyUnpickler {
32
38
}
33
39
pkgNames ::= pkgName
34
40
super .traversePkg(pkg)
35
- pkgNames match {
36
- case n :: ns => pkgNames = ns.ensuring(n == pkgName, s " last= $n pkgName= $pkgName" )
37
- case _ => assert(false , s " Expected $pkgName as last pkg name, was empty " )
38
- }
41
+ pkgNames = dropHead(pkgNames, pkgName)
39
42
}
40
43
41
44
override def traverseClsDef (clsDef : ClsDef ): Unit = {
42
- classes += ((pkgNames.headOption.getOrElse(nme.Empty ), clsDef))
45
+ forEachClass(clsDef, pkgNames, clsNames)
46
+ clsNames ::= clsDef.name
43
47
super .traverseClsDef(clsDef)
48
+ clsNames = dropHead(clsNames, clsDef.name)
44
49
}
45
50
}
46
- trav.traverse(tree)
47
- trav.classes.toList.foreach { case (pkgName, clsDef) =>
51
+
52
+ def forEachClass (clsDef : ClsDef , pkgNames : List [Name ], clsNames : List [Name ]): Unit = {
53
+ val pkgName = pkgNames.headOption.getOrElse(nme.Empty )
48
54
if (pkgName.source == clazz.owner.fullName) {
49
- val cls = clazz.owner.classes.getOrElse(clsDef.name.source, NoClass )
55
+ val clsName = (clsDef.name :: clsNames).reverseIterator.mkString(" $" )
56
+ val cls = clazz.owner.classes.getOrElse(clsName, NoClass )
50
57
if (cls != NoClass ) {
51
58
cls._experimental |= clsDef.annots.exists(_.tycon.toString == " scala.annotation.experimental" )
52
59
cls._experimental |= clsDef.annots.exists(_.tycon.toString == " scala.annotation.experimental2" )
@@ -62,6 +69,8 @@ object TastyUnpickler {
62
69
}
63
70
}
64
71
}
72
+
73
+ trav.traverse(tree)
65
74
}
66
75
67
76
def unpickleTree (in : TastyReader , names : Names ): Tree = {
@@ -108,7 +117,7 @@ object TastyUnpickler {
108
117
DefDef (name, annots)
109
118
}
110
119
111
- def readTemplate () = {
120
+ def readTemplate (): Template = {
112
121
// TypeParam* TermParam* parent_Term* Self? Stat* -- [typeparams] paramss extends parents { self => stats }, where Stat* always starts with the primary constructor.
113
122
// TypeParam = TYPEPARAM Length NameRef type_Term Modifier* -- modifiers name bounds
114
123
// TermParam = PARAM Length NameRef type_Term Modifier* -- modifiers name : type.
@@ -121,12 +130,14 @@ object TastyUnpickler {
121
130
while (nextByte == PARAM || nextByte == EMPTYCLAUSE || nextByte == SPLITCLAUSE ) skipTree(readByte()) // tparams
122
131
while (nextByte != SELFDEF && nextByte != DEFDEF ) skipTree(readByte()) // parents
123
132
if (nextByte == SELFDEF ) skipTree(readByte()) // self
133
+ val classes = new ListBuffer [ClsDef ]
124
134
val meths = new ListBuffer [DefDef ]
125
135
doUntil(end)(readByte match {
126
- case DEFDEF => meths += readDefDef()
127
- case tag => skipTree(tag)
136
+ case TYPEDEF => readTypeDef() match { case clsDef : ClsDef => classes += clsDef case _ => }
137
+ case DEFDEF => meths += readDefDef()
138
+ case tag => skipTree(tag)
128
139
})
129
- Template (meths.toList)
140
+ Template (classes.toList, meths.toList)
130
141
}
131
142
132
143
def readClassDef (name : Name , end : Addr ) = ClsDef (name.toTypeName, readTemplate(), readAnnotsInMods(end)) // NameRef Template Modifier* -- modifiers class name template
@@ -199,7 +210,7 @@ object TastyUnpickler {
199
210
final case class Pkg (path : Path , trees : List [Tree ]) extends Tree { def show = s " package $path${trees.map(" \n " + _).mkString}" }
200
211
201
212
final case class ClsDef (name : TypeName , template : Template , annots : List [Annot ]) extends Tree { def show = s " ${annots.map(" " + _ + " " ).mkString}class $name$template" }
202
- final case class Template (meths : List [DefDef ]) extends Tree { def show = s " ${meths.map(" \n " + _).mkString}" }
213
+ final case class Template (classes : List [ ClsDef ], meths : List [DefDef ]) extends Tree { def show = s " ${(classes ::: meths) .map(" \n " + _).mkString}" }
203
214
final case class DefDef (name : Name , annots : List [Annot ] = Nil ) extends Tree { def show = s " ${annots.map(" " + _ + " " ).mkString}def $name" }
204
215
205
216
sealed trait Type extends Tree
@@ -225,14 +236,11 @@ object TastyUnpickler {
225
236
226
237
def traverseName (name : Name ) = ()
227
238
228
- def traverseTrees (trees : List [Tree ]) = trees.foreach(traverse)
229
- def traverseAnnots (annots : List [Annot ]) = annots.foreach(traverse)
230
-
231
- def traversePkg (pkg : Pkg ) = { traverse(pkg.path); traverseTrees(pkg.trees) }
232
- def traverseClsDef (clsDef : ClsDef ) = { traverseName(clsDef.name); traverseAnnots(clsDef.annots) }
233
- def traverseTemplate (tmpl : Template ) = { traverseTrees(tmpl.meths) }
234
- def traverseDefDef (defDef : DefDef ) = { traverseName(defDef.name); traverseAnnots(defDef.annots) }
235
- def traverseAnnot (annot : Annot ) = { traverse(annot.tycon); traverse(annot.fullAnnotation) }
239
+ def traversePkg (pkg : Pkg ) = { val Pkg (path, trees) = pkg; traverse(path); trees.foreach(traverse) }
240
+ def traverseClsDef (clsDef : ClsDef ) = { val ClsDef (name, tmpl, annots) = clsDef; traverseName(name); traverseTemplate(tmpl); annots.foreach(traverse) }
241
+ def traverseTemplate (tmpl : Template ) = { val Template (classes, meths) = tmpl; classes.foreach(traverse); meths.foreach(traverse) }
242
+ def traverseDefDef (defDef : DefDef ) = { val DefDef (name, annots) = defDef; traverseName(name); annots.foreach(traverse) }
243
+ def traverseAnnot (annot : Annot ) = { val Annot (tycon, fullAnnotation) = annot; traverse(tycon); traverse(fullAnnotation) }
236
244
237
245
def traversePath (path : Path ) = path match {
238
246
case TypeRefPkg (fullyQual) => traverseName(fullyQual)
0 commit comments