package dotty.tools.dotc package core import scala.language.implicitConversions import scala.collection.{mutable, immutable} import scala.annotation.switch import Names._ import Symbols._ import Contexts._ import Decorators.PreNamedString import util.NameTransformer import scala.collection.breakOut object StdNames { /** Base strings from which synthetic names are derived. */ object str { final val SETTER_SUFFIX = "_$eq" final val EXPAND_SEPARATOR = "$$" final val TRAIT_SETTER_SEPARATOR = "$_setter_$" final val SUPER_PREFIX = "super$" final val INITIALIZER_PREFIX = "initial$" final val SHADOWED_PREFIX = "(shadowed)" final val AVOID_CLASH_SUFFIX = "$_avoid_name_clash_$" final val MODULE_SUFFIX = NameTransformer.MODULE_SUFFIX_STRING final val DEFAULT_GETTER = "$default$" final val INTERPRETER_IMPORT_WRAPPER = "$iw" final val INTERPRETER_LINE_PREFIX = "line" final val INTERPRETER_VAR_PREFIX = "res" final val INTERPRETER_WRAPPER_SUFFIX = "$object" final val Function = "Function" final val ImplicitFunction = "ImplicitFunction" final val AbstractFunction = "AbstractFunction" final val Tuple = "Tuple" final val Product = "Product" def sanitize(str: String) = str.replaceAll("""[<>]""", """\$""") } abstract class DefinedNames[N <: Name] { protected implicit def fromString(s: String): N protected def fromName(name: Name): N = fromString(name.toString) private val kws = mutable.Set[N]() protected def kw(name: N) = { kws += name; name } final val keywords: collection.Set[N] = kws } abstract class ScalaNames[N <: Name] extends DefinedNames[N] { protected def encode(s: String): N = fromName(fromString(s).encode) // Keywords, need to come first ----------------------- final val ABSTRACTkw: N = kw("abstract") final val CASEkw: N = kw("case") final val CLASSkw: N = kw("class") final val CATCHkw: N = kw("catch") final val DEFkw: N = kw("def") final val DOkw: N = kw("do") final val ELSEkw: N = kw("else") final val EXTENDSkw: N = kw("extends") final val FALSEkw: N = kw("false") final val FINALkw: N = kw("final") final val FINALLYkw: N = kw("finally") final val FORkw: N = kw("for") final val FORSOMEkw: N = kw("forSome") final val IFkw: N = kw("if") final val IMPLICITkw: N = kw("implicit") final val IMPORTkw: N = kw("import") final val INLINEkw: N = kw("inline") final val LAZYkw: N = kw("lazy") final val MACROkw: N = kw("macro") final val MATCHkw: N = kw("match") final val NEWkw: N = kw("new") final val NULLkw: N = kw("null") final val OBJECTkw: N = kw("object") final val OVERRIDEkw: N = kw("override") final val PACKAGEkw: N = kw("package") final val PRIVATEkw: N = kw("private") final val PROTECTEDkw: N = kw("protected") final val RETURNkw: N = kw("return") final val SEALEDkw: N = kw("sealed") final val SUPERkw: N = kw("super") final val THENkw: N = kw("then") final val THISkw: N = kw("this") final val THROWkw: N = kw("throw") final val TRAITkw: N = kw("trait") final val TRUEkw: N = kw("true") final val TRYkw: N = kw("try") final val TYPEkw: N = kw("type") final val VALkw: N = kw("val") final val VARkw: N = kw("var") final val WITHkw: N = kw("with") final val WHILEkw: N = kw("while") final val YIELDkw: N = kw("yield") final val DOTkw: N = kw(".") final val USCOREkw: N = kw("_") final val COLONkw: N = kw(":") final val EQUALSkw: N = kw("=") final val ARROWkw: N = kw("=>") final val LARROWkw: N = kw("<-") final val SUBTYPEkw: N = kw("<:") final val VIEWBOUNDkw: N = kw("<%") final val SUPERTYPEkw: N = kw(">:") final val HASHkw: N = kw("#") final val ATkw: N = kw("@") val ANON_CLASS: N = "$anon" val ANON_FUN: N = "$anonfun" val BITMAP_PREFIX: N = "bitmap$" // @darkdimius: $bitmap? Also, the next 4 names are unused. val BITMAP_NORMAL: N = BITMAP_PREFIX // initialization bitmap for public/protected lazy vals val BITMAP_TRANSIENT: N = BITMAP_PREFIX + "trans$" // initialization bitmap for transient lazy vals val BITMAP_CHECKINIT: N = BITMAP_PREFIX + "init$" // initialization bitmap for checkinit values val BITMAP_CHECKINIT_TRANSIENT: N = BITMAP_PREFIX + "inittrans$" // initialization bitmap for transient checkinit values val DEFAULT_GETTER: N = str.DEFAULT_GETTER val DEFAULT_GETTER_INIT: N = "$lessinit$greater" val DO_WHILE_PREFIX: N = "doWhile$" val EMPTY: N = "" val EMPTY_PACKAGE: N = Names.EMPTY_PACKAGE.toString val EXCEPTION_RESULT_PREFIX: N = "exceptionResult" val EXPAND_SEPARATOR: N = str.EXPAND_SEPARATOR val IMPL_CLASS_SUFFIX: N = "$class" val IMPORT: N = "" val LOCALDUMMY_PREFIX: N = ">") val DIV = encode("/") val EQ = encode("==") val EQL = encode("=") val GE = encode(">=") val GT = encode(">") val HASHHASH = encode("##") val LE = encode("<=") val LSL = encode("<<") val LSR = encode(">>>") val LT = encode("<") val MINUS = encode("-") val MOD = encode("%") val MUL = encode("*") val NE = encode("!=") val OR = encode("|") val PLUS = ADD // technically redundant, but ADD looks funny with MINUS val SUB = MINUS // ... as does SUB with PLUS val XOR = encode("^") val ZAND = encode("&&") val ZOR = encode("||") // unary operators val UNARY_PREFIX: N = "unary_" val UNARY_~ = encode("unary_~") val UNARY_+ = encode("unary_+") val UNARY_- = encode("unary_-") val UNARY_! = encode("unary_!") // Grouped here so Cleanup knows what tests to perform. val CommonOpNames = Set[Name](OR, XOR, AND, EQ, NE) val ConversionNames = Set[Name](toByte, toChar, toDouble, toFloat, toInt, toLong, toShort) val BooleanOpNames = Set[Name](ZOR, ZAND, UNARY_!) ++ CommonOpNames val NumberOpNames = ( Set[Name](ADD, SUB, MUL, DIV, MOD, LSL, LSR, ASR, LT, LE, GE, GT) ++ Set(UNARY_+, UNARY_-, UNARY_!) ++ ConversionNames ++ CommonOpNames ) val add: N = "add" val complement: N = "complement" val divide: N = "divide" val multiply: N = "multiply" val negate: N = "negate" val positive: N = "positive" val shiftLogicalRight: N = "shiftLogicalRight" val shiftSignedLeft: N = "shiftSignedLeft" val shiftSignedRight: N = "shiftSignedRight" val subtract: N = "subtract" val takeAnd: N = "takeAnd" val takeConditionalAnd: N = "takeConditionalAnd" val takeConditionalOr: N = "takeConditionalOr" val takeModulo: N = "takeModulo" val takeNot: N = "takeNot" val takeOr: N = "takeOr" val takeXor: N = "takeXor" val testEqual: N = "testEqual" val testGreaterOrEqualThan: N = "testGreaterOrEqualThan" val testGreaterThan: N = "testGreaterThan" val testLessOrEqualThan: N = "testLessOrEqualThan" val testLessThan: N = "testLessThan" val testNotEqual: N = "testNotEqual" val isBoxedNumberOrBoolean: N = "isBoxedNumberOrBoolean" val isBoxedNumber: N = "isBoxedNumber" val reflPolyCacheName: N = "reflPoly$Cache" val reflClassCacheName: N = "reflClass$Cache" val reflParamsCacheName: N = "reflParams$Cache" val reflMethodCacheName: N = "reflMethod$Cache" val reflMethodName: N = "reflMethod$Method" private val reflectionCacheNames = Set[N]( reflPolyCacheName, reflClassCacheName, reflParamsCacheName, reflMethodCacheName, reflMethodName ) def isReflectionCacheName(name: Name) = reflectionCacheNames exists (name startsWith _) } class ScalaTermNames extends ScalaNames[TermName] { protected implicit def fromString(s: String): TermName = termName(s) @switch def syntheticParamName(i: Int): TermName = i match { case 0 => x_0 case 1 => x_1 case 2 => x_2 case 3 => x_3 case 4 => x_4 case 5 => x_5 case 6 => x_6 case 7 => x_7 case 8 => x_8 case 9 => x_9 case _ => termName("x$" + i) } @switch def productAccessorName(j: Int): TermName = j match { case 1 => nme._1 case 2 => nme._2 case 3 => nme._3 case 4 => nme._4 case 5 => nme._5 case 6 => nme._6 case 7 => nme._7 case 8 => nme._8 case 9 => nme._9 case 10 => nme._10 case 11 => nme._11 case 12 => nme._12 case 13 => nme._13 case 14 => nme._14 case 15 => nme._15 case 16 => nme._16 case 17 => nme._17 case 18 => nme._18 case 19 => nme._19 case 20 => nme._20 case 21 => nme._21 case 22 => nme._22 case _ => termName("_" + j) } def localDummyName(clazz: Symbol)(implicit ctx: Context): TermName = LOCALDUMMY_PREFIX ++ clazz.name ++ ">" def newBitmapName(bitmapPrefix: TermName, n: Int): TermName = bitmapPrefix ++ n.toString def selectorName(n: Int): TermName = "_" + (n + 1) object primitive { val arrayApply: TermName = "[]apply" val arrayUpdate: TermName = "[]update" val arrayLength: TermName = "[]length" val names: Set[Name] = Set(arrayApply, arrayUpdate, arrayLength) } def isPrimitiveName(name: Name) = primitive.names.contains(name) } class ScalaTypeNames extends ScalaNames[TypeName] { protected implicit def fromString(s: String): TypeName = typeName(s) def syntheticTypeParamName(i: Int): TypeName = "X" + i final val Conforms = encode("<:<") final val Uninstantiated: TypeName = "?$" } abstract class JavaNames[N <: Name] extends DefinedNames[N] { final val ABSTRACTkw: N = kw("abstract") final val ASSERTkw: N = kw("assert") final val BOOLEANkw: N = kw("boolean") final val BREAKkw: N = kw("break") final val BYTEkw: N = kw("byte") final val CASEkw: N = kw("case") final val CATCHkw: N = kw("catch") final val CHARkw: N = kw("char") final val CLASSkw: N = kw("class") final val CONSTkw: N = kw("const") final val CONTINUEkw: N = kw("continue") final val DEFAULTkw: N = kw("default") final val DOkw: N = kw("do") final val DOUBLEkw: N = kw("double") final val ELSEkw: N = kw("else") final val ENUMkw: N = kw("enum") final val EXTENDSkw: N = kw("extends") final val FINALkw: N = kw("final") final val FINALLYkw: N = kw("finally") final val FLOATkw: N = kw("float") final val FORkw: N = kw("for") final val IFkw: N = kw("if") final val GOTOkw: N = kw("goto") final val IMPLEMENTSkw: N = kw("implements") final val IMPORTkw: N = kw("import") final val INSTANCEOFkw: N = kw("instanceof") final val INTkw: N = kw("int") final val INTERFACEkw: N = kw("interface") final val LONGkw: N = kw("long") final val NATIVEkw: N = kw("native") final val NEWkw: N = kw("new") final val PACKAGEkw: N = kw("package") final val PRIVATEkw: N = kw("private") final val PROTECTEDkw: N = kw("protected") final val PUBLICkw: N = kw("public") final val RETURNkw: N = kw("return") final val SHORTkw: N = kw("short") final val STATICkw: N = kw("static") final val STRICTFPkw: N = kw("strictfp") final val SUPERkw: N = kw("super") final val SWITCHkw: N = kw("switch") final val SYNCHRONIZEDkw: N = kw("synchronized") final val THISkw: N = kw("this") final val THROWkw: N = kw("throw") final val THROWSkw: N = kw("throws") final val TRANSIENTkw: N = kw("transient") final val TRYkw: N = kw("try") final val VOIDkw: N = kw("void") final val VOLATILEkw: N = kw("volatile") final val WHILEkw: N = kw("while") final val BoxedBoolean: N = "java.lang.Boolean" final val BoxedByte: N = "java.lang.Byte" final val BoxedCharacter: N = "java.lang.Character" final val BoxedDouble: N = "java.lang.Double" final val BoxedFloat: N = "java.lang.Float" final val BoxedInteger: N = "java.lang.Integer" final val BoxedLong: N = "java.lang.Long" final val BoxedNumber: N = "java.lang.Number" final val BoxedShort: N = "java.lang.Short" final val Class: N = "java.lang.Class" final val IOOBException: N = "java.lang.IndexOutOfBoundsException" final val InvTargetException: N = "java.lang.reflect.InvocationTargetException" final val MethodAsObject: N = "java.lang.reflect.Method" final val NPException: N = "java.lang.NullPointerException" final val Object: N = "java.lang.Object" final val String: N = "java.lang.String" final val Throwable: N = "java.lang.Throwable" final val ForName: N = "forName" final val GetCause: N = "getCause" final val GetClass: N = "getClass" final val GetClassLoader: N = "getClassLoader" final val GetComponentType: N = "getComponentType" final val GetMethod: N = "getMethod" final val Invoke: N = "invoke" final val JavaLang: N = "java.lang" final val BeanProperty: N = "scala.beans.BeanProperty" final val BooleanBeanProperty: N = "scala.beans.BooleanBeanProperty" final val JavaSerializable: N = "java.io.Serializable" } class JavaTermNames extends JavaNames[TermName] { protected def fromString(s: String): TermName = termName(s) } class JavaTypeNames extends JavaNames[TypeName] { protected def fromString(s: String): TypeName = typeName(s) } val nme = new ScalaTermNames val tpnme = new ScalaTypeNames val jnme = new JavaTermNames val jtpnme = new JavaTypeNames }