summaryrefslogtreecommitdiff
path: root/test/files/pos/t8999.scala
blob: 99c4b2ad84e50bcf04efd6758e64470839868276 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
object Types {

  abstract sealed class Type

  case object AnyType extends Type

  case object NothingType extends Type

  case object UndefType extends Type

  case object BooleanType extends Type

  case object IntType extends Type

  case object LongType extends Type

  case object FloatType extends Type

  case object DoubleType extends Type

  case object StringType extends Type

  case object NullType extends Type

  sealed abstract class ReferenceType extends Type

  final case class ClassType(className: String) extends ReferenceType

  final case class ArrayType(baseClassName: String, dimensions: Int) extends ReferenceType

  final case class RecordType(fields: List[RecordType.Field]) extends Type

  object RecordType {
    final case class Field(name: String, originalName: Option[String],
        tpe: Type, mutable: Boolean)
  }

  case object NoType extends Type

}


sealed abstract class ClassKind

object ClassKind {

  case object Class extends ClassKind

  case object ModuleClass extends ClassKind

  case object Interface extends ClassKind

  case object RawJSType extends ClassKind

  case object HijackedClass extends ClassKind

  case object TraitImpl extends ClassKind

}

object Trees {

  import Types._

  abstract sealed class Tree

  case object EmptyTree extends Tree

  sealed trait PropertyName
  case class Ident(name: String, originalName: Option[String]) extends PropertyName
  object Ident {
    def apply(name: String): Ident =
      new Ident(name, Some(name))
  }

  case class VarDef(name: Ident, vtpe: Type, mutable: Boolean, rhs: Tree) extends Tree

  case class ParamDef(name: Ident, ptpe: Type, mutable: Boolean) extends Tree

  case class Skip() extends Tree

  class Block private(val stats: List[Tree]) extends Tree

  object Block {
    def unapply(block: Block): Some[List[Tree]] = Some(block.stats)
  }

  case class Labeled(label: Ident, tpe: Type, body: Tree) extends Tree

  case class Assign(lhs: Tree, rhs: Tree) extends Tree

  case class Return(expr: Tree, label: Option[Ident] = None) extends Tree

  case class If(cond: Tree, thenp: Tree, elsep: Tree) extends Tree

  case class While(cond: Tree, body: Tree, label: Option[Ident] = None) extends Tree

  case class DoWhile(body: Tree, cond: Tree, label: Option[Ident] = None) extends Tree

  case class Try(block: Tree, errVar: Ident, handler: Tree, finalizer: Tree) extends Tree

  case class Throw(expr: Tree) extends Tree

  case class Continue(label: Option[Ident] = None) extends Tree

  case class Match(selector: Tree, cases: List[(List[Literal], Tree)], default: Tree) extends Tree

  case class Debugger() extends Tree

  case class New(cls: ClassType, ctor: Ident, args: List[Tree]) extends Tree

  case class LoadModule(cls: ClassType) extends Tree

  case class StoreModule(cls: ClassType, value: Tree) extends Tree

  case class Select(qualifier: Tree, item: Ident, mutable: Boolean) extends Tree

  case class Apply(receiver: Tree, method: Ident, args: List[Tree]) extends Tree

  case class StaticApply(receiver: Tree, cls: ClassType, method: Ident, args: List[Tree]) extends Tree

  case class TraitImplApply(impl: ClassType, method: Ident, args: List[Tree]) extends Tree

  case class UnaryOp(op: Int, lhs: Tree) extends Tree

  case class BinaryOp(op: Int, lhs: Tree, rhs: Tree) extends Tree

  case class NewArray(tpe: ArrayType, lengths: List[Tree]) extends Tree

  case class ArrayValue(tpe: ArrayType, elems: List[Tree]) extends Tree

  case class ArrayLength(array: Tree) extends Tree

  case class ArraySelect(array: Tree, index: Tree) extends Tree

  case class RecordValue(tpe: RecordType, elems: List[Tree]) extends Tree

  case class IsInstanceOf(expr: Tree, cls: ReferenceType) extends Tree

  case class AsInstanceOf(expr: Tree, cls: ReferenceType) extends Tree

  case class Unbox(expr: Tree, charCode: Char) extends Tree

  case class GetClass(expr: Tree) extends Tree

  case class CallHelper(helper: String, args: List[Tree]) extends Tree

  case class JSNew(ctor: Tree, args: List[Tree]) extends Tree

  case class JSDotSelect(qualifier: Tree, item: Ident) extends Tree

  case class JSBracketSelect(qualifier: Tree, item: Tree) extends Tree

  case class JSFunctionApply(fun: Tree, args: List[Tree]) extends Tree

  case class JSDotMethodApply(receiver: Tree, method: Ident, args: List[Tree]) extends Tree

  case class JSBracketMethodApply(receiver: Tree, method: Tree, args: List[Tree]) extends Tree

  case class JSDelete(prop: Tree) extends Tree

  case class JSUnaryOp(op: String, lhs: Tree) extends Tree

  case class JSBinaryOp(op: String, lhs: Tree, rhs: Tree) extends Tree

  case class JSArrayConstr(items: List[Tree]) extends Tree

  case class JSObjectConstr(fields: List[(PropertyName, Tree)]) extends Tree

  case class JSEnvInfo() extends Tree

  sealed trait Literal extends Tree

  case class Undefined() extends Literal

  case class UndefinedParam() extends Literal

  case class Null() extends Literal

  case class BooleanLiteral(value: Boolean) extends Literal

  case class IntLiteral(value: Int) extends Literal

  case class LongLiteral(value: Long) extends Literal

  case class FloatLiteral(value: Float) extends Literal

  case class DoubleLiteral(value: Double) extends Literal

  case class StringLiteral(value: String) extends Literal with PropertyName

  case class ClassOf(cls: ReferenceType) extends Literal

  case class VarRef(ident: Ident, mutable: Boolean) extends Tree

  case class This() extends Tree

  case class Closure(captureParams: List[ParamDef], params: List[ParamDef],
                     body: Tree, captureValues: List[Tree]) extends Tree

  case class ClassDef(name: Ident, kind: ClassKind, parent: Option[Ident], ancestors: List[Ident], defs: List[Tree]) extends Tree

  case class MethodDef(name: PropertyName, args: List[ParamDef], resultType: Type, body: Tree) extends Tree

  case class PropertyDef(name: PropertyName, getterBody: Tree, setterArg: ParamDef, setterBody: Tree) extends Tree

  case class ConstructorExportDef(name: String, args: List[ParamDef], body: Tree) extends Tree

  case class ModuleExportDef(fullName: String) extends Tree

  final class TreeHash(val treeHash: Array[Byte], val posHash: Array[Byte])
}

object Main {
  import Trees._
  import Types._

  private def transform(tree: Tree) = {
    val ObjectClass = "O"
    tree match {
      case VarDef(_, _, _, rhs)                                             =>
      case tree: Block                                                      =>
      case Labeled(ident@Ident(label, _), tpe, body)                        =>
      case Assign(lhs, rhs)                                                 =>
      case Return(expr, optLabel)                                           =>
      case If(cond, thenp, elsep)                                           =>
      case While(cond, body, optLabel)                                      =>
      case DoWhile(body, cond, None)                                        =>
      case Try(block, errVar, EmptyTree, finalizer)                         =>
      case Try(block, errVar@Ident(name, originalName), handler, finalizer) =>
      case Throw(expr)                                                      =>
      case Continue(optLabel)                                               =>
      case Match(selector, cases, default)                                  =>
      case New(cls, ctor, args)                                             =>
      case StoreModule(cls, value)                                          =>
      case tree: Select                                                     =>
      case tree: Apply                                                      =>
      case tree: StaticApply                                                =>
      case tree: TraitImplApply                                             =>
      case tree@UnaryOp(_, arg)                                             =>
      case tree@BinaryOp(op, lhs, rhs)                                      =>
      case NewArray(tpe, lengths)                                           =>
      case ArrayValue(tpe, elems)                                           =>
      case ArrayLength(array)                                               =>
      case ArraySelect(array, index)                                        =>
      case RecordValue(tpe, elems)                                          =>
      case IsInstanceOf(expr, ClassType(ObjectClass))                       =>
      case IsInstanceOf(expr, tpe)                                          =>
      case AsInstanceOf(expr, ClassType(ObjectClass))                       =>
      case AsInstanceOf(expr, cls)                                          =>
      case Unbox(arg, charCode)                                             =>
      case GetClass(expr)                                                   =>
      case JSNew(ctor, args)                                                =>
      case JSDotSelect(qualifier, item)                                     =>
      case JSBracketSelect(qualifier, item)                                 =>
      case tree: JSFunctionApply                                            =>
      case JSDotMethodApply(receiver, method, args)                         =>
      case JSBracketMethodApply(receiver, method, args)                     =>
      case JSDelete(JSDotSelect(obj, prop))                                 =>
      case JSDelete(JSBracketSelect(obj, prop))                             =>
      case JSUnaryOp(op, lhs)                                               =>
      case JSBinaryOp(op, lhs, rhs)                                         =>
      case JSArrayConstr(items)                                             =>
      case JSObjectConstr(fields)                                           =>
      case _: VarRef | _: This                                              =>
      case Closure(captureParams, params, body, captureValues)              =>
      case _: Skip | _: Debugger | _: LoadModule |
           _: JSEnvInfo | _: Literal | EmptyTree                            =>
    }
  }
}