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))
}
}
}
}
}