/* __ *\ ** ________ ___ / / ___ __ ____ 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) } }