Skip to content

Commit f33b078

Browse files
committed
Flesh out derived$shaped
1 parent 0992722 commit f33b078

File tree

4 files changed

+32
-4
lines changed

4 files changed

+32
-4
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,8 @@ class Definitions {
656656
def ShapeCaseClass(implicit ctx: Context): ClassSymbol = ShapeCaseType.symbol.asClass
657657
lazy val ShapeCasesType: TypeRef = ctx.requiredClassRef("scala.typelevel.Shape.Cases")
658658
def ShapeCasesClass(implicit ctx: Context): ClassSymbol = ShapeCasesType.symbol.asClass
659+
lazy val MirrorType: TypeRef = ctx.requiredClassRef("scala.typelevel.Mirror")
660+
lazy val ReflectedClassType: TypeRef = ctx.requiredClassRef("scala.typelevel.ReflectedClass")
659661

660662
lazy val LanguageModuleRef: TermSymbol = ctx.requiredModule("scala.language")
661663
def LanguageModuleClass(implicit ctx: Context): ClassSymbol = LanguageModuleRef.moduleClass.asClass

compiler/src/dotty/tools/dotc/core/StdNames.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@ object StdNames {
391391
val ClassManifestFactory: N = "ClassManifestFactory"
392392
val classOf: N = "classOf"
393393
val clone_ : N = "clone"
394+
val common: N = "common"
394395
val conforms_ : N = "$conforms"
395396
val copy: N = "copy"
396397
val currentMirror: N = "currentMirror"

compiler/src/dotty/tools/dotc/typer/Deriving.scala

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ trait Deriving { this: Typer =>
114114
sym
115115
}
116116

117+
private def newMethod(name: TermName, info: Type, flags: FlagSet = EmptyFlags)(implicit ctx: Context) =
118+
ctx.newSymbol(ctx.owner, name, flags | Method | Synthetic, info, coord = cls.pos.startPos)
119+
117120
/** Enter type class instance with given name and info in current scope, provided
118121
* an instance woth the same name does not exist already.
119122
*/
@@ -124,7 +127,7 @@ trait Deriving { this: Typer =>
124127
}
125128
else {
126129
val implFlag = if (reportErrors) Implicit else EmptyFlags // for now
127-
add(ctx.newSymbol(ctx.owner, instanceName, Synthetic | Method | implFlag, info, coord = cls.pos.startPos))
130+
add(newMethod(instanceName, info, implFlag))
128131
}
129132
}
130133

@@ -175,8 +178,29 @@ trait Deriving { this: Typer =>
175178
addShape()
176179
}
177180

178-
def implementedClass(instance: Symbol) =
179-
instance.info.stripPoly.finalResultType.classSymbol
181+
private def shapedRHS(shapedType: Type, pos: Position)(implicit ctx: Context) = {
182+
import tpd._
183+
val AppliedType(_, clsArg :: shapeArg :: Nil) = shapedType
184+
val shape = shapeArg.dealias
185+
186+
val implClassSym = ctx.newNormalizedClassSymbol(
187+
ctx.owner, tpnme.ANON_CLASS, EmptyFlags, shapedType :: Nil, coord = cls.pos.startPos)
188+
val implClassCtx = ctx.withOwner(implClassSym)
189+
val implClassConstr = newMethod(nme.CONSTRUCTOR, MethodType(Nil, implClassSym.typeRef))(implClassCtx).entered
190+
191+
def implClassStats(implicit ctx: Context): List[Tree] = {
192+
val reflectMeth = newMethod(nme.reflect, MethodType(clsArg :: Nil, defn.MirrorType)).entered
193+
val reifyMeth = newMethod(nme.reify, MethodType(defn.MirrorType :: Nil, clsArg)).entered
194+
val commonMeth = newMethod(nme.common, ExprType(defn.ReflectedClassType)).entered
195+
List(
196+
tpd.DefDef(reflectMeth, tpd.ref(defn.Predef_undefinedR)), // TODO: flesh out
197+
tpd.DefDef(reifyMeth, tpd.ref(defn.Predef_undefinedR)),
198+
tpd.DefDef(commonMeth, tpd.ref(defn.Predef_undefinedR)))
199+
}
200+
201+
val implClassDef = ClassDef(implClassSym, DefDef(implClassConstr), implClassStats(implClassCtx))
202+
Block(implClassDef :: Nil, New(implClassSym.typeRef, Nil))
203+
}
180204

181205
private def typeclassInstance(sym: Symbol)(implicit ctx: Context) =
182206
(tparamRefs: List[Type]) => (paramRefss: List[List[tpd.Tree]]) => {
@@ -192,7 +216,7 @@ trait Deriving { this: Typer =>
192216
val resultType = instantiated(sym.info)
193217
val typeCls = resultType.classSymbol
194218
if (typeCls == defn.ShapedClass)
195-
tpd.ref(defn.Predef_undefinedR) // TODO: flesh out
219+
shapedRHS(resultType, sym.pos)
196220
else {
197221
val module = untpd.ref(typeCls.companionModule.termRef).withPos(sym.pos)
198222
val rhs = untpd.Select(module, nme.derived)

compiler/test/dotc/run-test-pickling.blacklist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ tuples1a.scala
1111
implicitMatch.scala
1212
typeclass-derivation1.scala
1313
typeclass-derivation2.scala
14+
typeclass-derivation3.scala

0 commit comments

Comments
 (0)