def emitEmbeddedSym()

in rsc/src/main/scala/rsc/scalasig/Pickle.scala [78:133]


  def emitEmbeddedSym(ssym: String, smode: Mode): Ref = {
    stack.inEmbedded(ssym) { sowner =>
      if (ssym.isNone) {
        entries.getOrElseUpdate(RefKey(ssym))(NoSymbol)
      } else if ((ssym.isObject || ssym.isPackageObject) && smode.emitModules) {
        entries.getOrElseUpdate(ModuleRefKey(ssym)) {
          history.markModule(ssym)
          val name = ssym.name match {
            case TypeName(value) => emitName(TermName(value))
            case other => crash(other.toString)
          }
          val owner = emitSym(sowner, RefMode)
          val flags = ssym.flags
          val within = ssym.swithin.map(emitSym(_, RefMode))
          if (ssym.swithin.isEmpty) emitSym(Symbols.None, RefMode)
          val info = emitTpe(ssym.stpe)
          emitSymAnnots(ssym, smode)
          ModuleSymbol(name, owner, flags, within, info)
        }
      } else {
        entries.getOrElseUpdate(RefKey(ssym)) {
          val name = emitName(ssym.name)
          val owner = {
            if (ssym.isRefinement && sowner.isRootPackage) emitSym(sroot1, ModuleRefMode)
            else emitSym(sowner, RefMode)
          }
          val flags = {
            val result = ssym.flags
            if (ssym.isObject) result & ~IMPLICIT
            else result
          }
          val within = ssym.swithin.map(emitSym(_, RefMode))
          if (ssym.swithin.isEmpty) emitSym(Symbols.None, RefMode)
          val info = emitSig(ssym.ssig)
          emitSymAnnots(ssym, smode)
          if (ssym.isTypeParam || ssym.isAbstractType) {
            TypeSymbol(name, owner, flags, within, info)
          } else if (ssym.isAliasType) {
            AliasSymbol(name, owner, flags, within, info)
          } else if (ssym.isObject || ssym.isPackageObject ||
                     ssym.isClass || ssym.isInterface || ssym.isTrait) {
            val thisType = stack.inSelf(ssym.sself.map(emitTpe))
            emitChildren(ssym)
            ClassSymbol(name, owner, flags, within, info, thisType)
          } else if (ssym.isDef || ssym.isParam || ssym.isField) {
            // FIXME: https://github.com/twitter/rsc/issues/100
            val alias = ssym.salias.map(emitSym(_, RefMode))
            ValSymbol(name, owner, flags, within, info, alias)
          } else {
            val sdefault = s.SymbolInformation(symbol = ssym)
            crash(mtab.getOrElse(ssym, sdefault))
          }
        }
      }
    }
  }