summaryrefslogtreecommitdiff
path: root/ir/src/main/scala/scala/scalajs/ir/Infos.scala
diff options
context:
space:
mode:
Diffstat (limited to 'ir/src/main/scala/scala/scalajs/ir/Infos.scala')
-rw-r--r--ir/src/main/scala/scala/scalajs/ir/Infos.scala118
1 files changed, 118 insertions, 0 deletions
diff --git a/ir/src/main/scala/scala/scalajs/ir/Infos.scala b/ir/src/main/scala/scala/scalajs/ir/Infos.scala
new file mode 100644
index 0000000..66feec2
--- /dev/null
+++ b/ir/src/main/scala/scala/scalajs/ir/Infos.scala
@@ -0,0 +1,118 @@
+/* __ *\
+** ________ ___ / / ___ __ ____ Scala.js IR **
+** / __/ __// _ | / / / _ | __ / // __/ (c) 2014, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ |/_// /_\ \ http://scala-js.org/ **
+** /____/\___/_/ |_/____/_/ | |__/ /____/ **
+** |/____/ **
+\* */
+
+
+package scala.scalajs.ir
+
+object Infos {
+
+ sealed class RoughClassInfo protected (
+ val name: String,
+ val encodedName: String,
+ val isExported: Boolean,
+ val ancestorCount: Int
+ )
+
+ object RoughClassInfo {
+ def apply(name: String, encodedName: String, isExported: Boolean,
+ ancestorCount: Int): RoughClassInfo = {
+ new RoughClassInfo(name, encodedName, isExported, ancestorCount)
+ }
+ }
+
+ final class ClassInfo protected (
+ name: String,
+ encodedName: String,
+ isExported: Boolean,
+ ancestorCount: Int,
+ val kind: ClassKind,
+ val superClass: String,
+ val ancestors: List[String], // includes this class
+ val optimizerHints: OptimizerHints,
+ val methods: List[MethodInfo]
+ ) extends RoughClassInfo(name, encodedName, isExported, ancestorCount)
+
+ object ClassInfo {
+ def apply(
+ name: String,
+ encodedName: String,
+ isExported: Boolean = false,
+ ancestorCount: Int = 0,
+ kind: ClassKind = ClassKind.Class,
+ superClass: String = "",
+ ancestors: List[String] = Nil,
+ optimizerHints: OptimizerHints = OptimizerHints.empty,
+ methods: List[MethodInfo] = Nil): ClassInfo = {
+ new ClassInfo(name, encodedName, isExported, ancestorCount,
+ kind, superClass, ancestors, optimizerHints, methods)
+ }
+ }
+
+ final class MethodInfo private (
+ val encodedName: String,
+ val isAbstract: Boolean,
+ val isExported: Boolean,
+ val calledMethods: Map[String, List[String]],
+ val calledMethodsStatic: Map[String, List[String]],
+ val instantiatedClasses: List[String],
+ val accessedModules: List[String],
+ val accessedClassData: List[String],
+ val optimizerHints: OptimizerHints
+ )
+
+ object MethodInfo {
+ def apply(
+ encodedName: String,
+ isAbstract: Boolean = false,
+ isExported: Boolean = false,
+ calledMethods: Map[String, List[String]] = Map.empty,
+ calledMethodsStatic: Map[String, List[String]] = Map.empty,
+ instantiatedClasses: List[String] = Nil,
+ accessedModules: List[String] = Nil,
+ accessedClassData: List[String] = Nil,
+ optimizerHints: OptimizerHints = OptimizerHints.empty): MethodInfo = {
+ new MethodInfo(encodedName, isAbstract, isExported, calledMethods,
+ calledMethodsStatic, instantiatedClasses, accessedModules,
+ accessedClassData, optimizerHints)
+ }
+ }
+
+ final class OptimizerHints(val bits: Int) extends AnyVal {
+ import OptimizerHints._
+
+ private[scalajs] def isAccessor: Boolean = (bits & AccessorMask) != 0
+ private[scalajs] def hasInlineAnnot: Boolean = (bits & InlineAnnotMask) != 0
+
+ private[scalajs] def copy(
+ isAccessor: Boolean = this.isAccessor,
+ hasInlineAnnot: Boolean = this.hasInlineAnnot
+ ): OptimizerHints = {
+ var bits: Int = 0
+ if (isAccessor)
+ bits |= AccessorMask
+ if (hasInlineAnnot)
+ bits |= InlineAnnotMask
+ new OptimizerHints(bits)
+ }
+
+ override def toString(): String =
+ s"OptimizerHints($bits)"
+ }
+
+ object OptimizerHints {
+ private final val AccessorShift = 0
+ private final val AccessorMask = 1 << AccessorShift
+
+ private final val InlineAnnotShift = 1
+ private final val InlineAnnotMask = 1 << InlineAnnotShift
+
+ final val empty: OptimizerHints =
+ new OptimizerHints(0)
+ }
+
+}