Skip to content

Commit fec107c

Browse files
committed
New stuff in Definitions.
1 parent e8366c0 commit fec107c

File tree

1 file changed

+48
-2
lines changed

1 file changed

+48
-2
lines changed

src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,49 @@ package dotty.tools.dotc
77
package core
88

99
import Types._, Contexts._, Symbols._, SymDenotations._, StdNames._, Names._
10-
10+
import Flags._, Scopes._, Decorators._, NameOps._
1111
import scala.annotation.{ switch, meta }
1212
import scala.collection.{ mutable, immutable }
13-
import Flags._
1413
import PartialFunction._
1514
import collection.mutable
1615
import scala.reflect.api.{ Universe => ApiUniverse }
1716

17+
object Definitions {
18+
val MaxFunctionArity, MaxTupleArity = 22
19+
}
20+
1821
class Definitions(implicit ctx: Context) {
22+
import Definitions._
1923
def requiredPackage(str: String): TermSymbol = ???
2024
def requiredClass(str: String): ClassSymbol = ???
2125
def requiredModule(str: String): TermSymbol = ???
2226

27+
private def newSyntheticTypeParam(cls: ClassSymbol, scope: Scope, suffix: String = "T0") = {
28+
val tname = suffix.toTypeName.expandedName(cls)
29+
val tparam = ctx.newSymbol(cls, tname, TypeParamFlags, TypeBounds.empty)
30+
scope.enter(tparam)
31+
}
32+
33+
private def specialPolyClass(name: TypeName, flags: FlagSet, parentConstrs: Type*): ClassSymbol = {
34+
def classDenot(cls: ClassSymbol) = {
35+
val paramDecls = newScope
36+
val typeParam = newSyntheticTypeParam(cls, paramDecls)
37+
def instantiate(tpe: Type) =
38+
if (tpe.typeParams.nonEmpty) tpe.appliedTo(typeParam.symbolicRef)
39+
else tpe
40+
val parents = parentConstrs.toList map instantiate
41+
val parentRefs: List[TypeRef] = ctx.normalizeToRefs(parents, cls, paramDecls)
42+
CompleteClassDenotation(cls, ScalaPackageClass, name, flags, parentRefs, decls = paramDecls)(ctx)
43+
}
44+
new ClassSymbol(classDenot)
45+
}
46+
47+
private def mkArityArray(name: String, arity: Int, countFrom: Int): Array[ClassSymbol] = {
48+
val arr = new Array[ClassSymbol](arity)
49+
for (i <- countFrom to arity) arr(i) = requiredClass("scala." + name + i)
50+
arr
51+
}
52+
2353
lazy val RootClass: ClassSymbol = ctx.newLazyPackageSymbols(
2454
NoSymbol, nme.ROOT, ctx.rootLoader)._2
2555
lazy val RootPackage: TermSymbol = ctx.newSymbol(
@@ -46,7 +76,9 @@ class Definitions(implicit ctx: Context) {
4676

4777
lazy val PredefModule = requiredModule("scala.Predef")
4878

79+
// lazy val FunctionClass: ClassSymbol = requiredClass("scala.Function")
4980
lazy val SingletonClass: ClassSymbol = requiredClass("scala.Singleton")
81+
lazy val SeqClass: ClassSymbol = requiredClass("scala.collection.Seq")
5082
lazy val ArrayClass: ClassSymbol = requiredClass("scala.Array")
5183
lazy val uncheckedStableClass: ClassSymbol = requiredClass("scala.annotation.unchecked.uncheckedStable")
5284

@@ -70,20 +102,34 @@ class Definitions(implicit ctx: Context) {
70102
lazy val BoxedFloatClass = requiredClass("java.lang.Float")
71103
lazy val BoxedDoubleClass = requiredClass("java.lang.Double")
72104

105+
lazy val ByNameParamClass = specialPolyClass(tpnme.BYNAME_PARAM_CLASS, Covariant, AnyType)
106+
lazy val EqualsPatternClass = specialPolyClass(tpnme.EQUALS_PATTERN, EmptyFlags, AnyType)
107+
lazy val JavaRepeatedParamClass = specialPolyClass(tpnme.JAVA_REPEATED_PARAM_CLASS, Contravariant, AnyRefType, ArrayType)
108+
lazy val RepeatedParamClass = specialPolyClass(tpnme.REPEATED_PARAM_CLASS, Covariant, AnyRefType, SeqType)
109+
73110
lazy val AnyType = AnyClass.typeConstructor
74111
lazy val AnyValType = AnyValClass.typeConstructor
75112
lazy val ObjectType = ObjectClass.typeConstructor
76113
lazy val AnyRefType = AnyRefAlias.typeConstructor
77114
lazy val NotNullType = NotNullClass.typeConstructor
78115
lazy val NothingType = NothingClass.typeConstructor
79116
lazy val NullType = NullClass.typeConstructor
117+
lazy val SeqType = SeqClass.typeConstructor
118+
lazy val ArrayType = ArrayClass.typeConstructor
119+
80120

81121
lazy val BoxedNumberClass = requiredClass("java.lang.Number")
82122
lazy val JavaSerializableClass = requiredClass("java.lang.Serializable")
83123
lazy val ComparableClass = requiredClass("java.lang.Comparable")
84124

85125
// ----- Class sets ---------------------------------------------------
86126

127+
lazy val FunctionClass = mkArityArray("Function", MaxFunctionArity, 0)
128+
lazy val TupleClass = mkArityArray("Tuple", MaxTupleArity, 2)
129+
130+
lazy val FunctionClasses: Set[Symbol] = FunctionClass.toSet
131+
lazy val TupleClasses: Set[Symbol] = TupleClass.toSet
132+
87133
/** Modules whose members are in the default namespace */
88134
lazy val UnqualifiedModules: Set[TermSymbol] = Set(PredefModule, ScalaPackageVal, JavaLangPackageVal)
89135

0 commit comments

Comments
 (0)