Skip to content

Commit 93d2f7a

Browse files
committed
[base] Flatten out [Bi|Contra]Repeated.forContext
Add conversions between asserted-equal Singleton Contexts to be safer and slightly more constrained than an asInstanceOf
1 parent c311750 commit 93d2f7a

File tree

6 files changed

+299
-310
lines changed

6 files changed

+299
-310
lines changed

Base/src/main/scala-2/package.scala

+9
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,13 @@ package stringContextParserCombinator {
8585
trait LiftFunction[U <: Context with Singleton, -CC[_], +Z] {def apply[A](lifter:U#Expr[CC[A]], elem:U#Expr[A]):Z}
8686
/** A context avaliable for the identity context. Essentially a `Unit`, but with an implicit value */
8787
final class IdCtx()
88+
89+
/** `type Ctx <: Context with Singleton` and `val ctx: Ctx` apparently does not imply `Ctx =:= ctx.type` */
90+
private[stringContextParserCombinator]
91+
final class BindSingletonContexts[Ctx1 <: Context with Singleton, Ctx2 <: Context with Singleton] {
92+
implicit def ttToLeft[A](a: Ctx1#TypeTag[A]): Ctx2#TypeTag[A] = a.asInstanceOf[Ctx2#TypeTag[A]]
93+
implicit def ttToRight[A](a: Ctx2#TypeTag[A]): Ctx1#TypeTag[A] = a.asInstanceOf[Ctx1#TypeTag[A]]
94+
implicit def exprToLeft[A](a: Ctx1#Expr[A]): Ctx2#Expr[A] = a.asInstanceOf[Ctx2#Expr[A]]
95+
implicit def exprToRight[A](a: Ctx2#Expr[A]): Ctx1#Expr[A] = a.asInstanceOf[Ctx1#Expr[A]]
96+
}
8897
}

Base/src/main/scala/typeclass/Exprs.scala

+15-9
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,28 @@ object Exprs {
4646
ctx.Expr[Boolean](ctx.universe.Liftable.liftBoolean(b))
4747
}
4848

49-
override def andBooleans(left2: Ctx#Expr[Boolean], rightFn: () => Ctx#Expr[Boolean])(implicit ctx: Ctx): Ctx#Expr[Boolean] = {
49+
override def andBooleans(left: Ctx#Expr[Boolean], rightFn: () => Ctx#Expr[Boolean])(implicit ctx: Ctx): Ctx#Expr[Boolean] = {
50+
val myBindSingletonContexts = new BindSingletonContexts[Ctx, ctx.type]
51+
import myBindSingletonContexts._
52+
5053
val B = ctx.universe.Unliftable.unliftBoolean
51-
val left = left2.asInstanceOf[ctx.Expr[Boolean]]
52-
val right = rightFn().asInstanceOf[ctx.Expr[Boolean]]
53-
(left.tree, right.tree) match {
54-
case (B(true), _) => right
54+
val left2: ctx.Expr[Boolean] = left
55+
val right2: ctx.Expr[Boolean] = rightFn()
56+
(left2.tree, right2.tree) match {
57+
case (B(true), _) => right2
5558
case (B(false), _) => this.constFalse
56-
case (_, B(true)) => left
59+
case (_, B(true)) => left2
5760
case (_, B(false)) => this.constFalse
58-
case (_, _) => selectApply[Boolean](ctx)(left, "$amp$amp", right)
61+
case (_, _) => selectApply[Boolean](ctx)(left2, "$amp$amp", right2)
5962
}
6063
}
6164

6265
override def isEqualTo[A](left: Ctx#Expr[A], right: Ctx#Expr[A])(implicit ctx: Ctx, typA: Ctx#TypeTag[A]): Ctx#Expr[Boolean] = {
63-
val left2 = left.asInstanceOf[ctx.Expr[A]]
64-
val right2 = right.asInstanceOf[ctx.Expr[A]]
66+
val myBindSingletonContexts = new BindSingletonContexts[Ctx, ctx.type]
67+
import myBindSingletonContexts._
68+
69+
val left2: ctx.Expr[A] = left
70+
val right2: ctx.Expr[A] = right
6571
selectApply[Boolean](ctx)(left2, "$eq$eq", right2)
6672
}
6773
}

Base/src/main/scala/typeclass/Optionally.scala

+24-12
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import scala.annotation.nowarn
55
import scala.reflect.ClassTag
66
import com.eed3si9n.ifdef.ifdef
77

8+
@nowarn("msg=make nowarn used")
9+
private[typeclass] final class Optionally_MakeNowarnUsed
10+
811
/**
912
* Describes how to represent an optional value
1013
*
@@ -244,33 +247,42 @@ private[typeclass] trait LowPrioBiOptionally {
244247
@ifdef("scalaEpochVersion:2")
245248
def contextToExprOption[Ctx <: scala.reflect.macros.blackbox.Context with Singleton, A](implicit typA:Ctx#TypeTag[A]):BiOptionally[Ctx, Ctx#Expr, Ctx#Expr[A], Ctx#Expr[Option[A]]] = BiOptionally.apply(
246249
(ctx:Ctx) => {
247-
@nowarn("msg=never used") implicit val typA2:ctx.TypeTag[A] = typA.asInstanceOf[ctx.TypeTag[A]]
248-
selectTermNames[Option[A]](ctx)("_root_", "scala", "None").asInstanceOf[Ctx#Expr[Option[A]]]
250+
val myBindSingletonContexts = new BindSingletonContexts[Ctx, ctx.type]
251+
import myBindSingletonContexts._
252+
@nowarn("msg=never used") implicit val typA2:ctx.TypeTag[A] = typA
253+
selectTermNames[Option[A]](ctx)("_root_", "scala", "None"): Ctx#Expr[Option[A]]
249254
},
250255
(value, ctx) => {
251-
@nowarn("msg=never used") implicit val typA2:ctx.TypeTag[A] = typA.asInstanceOf[ctx.TypeTag[A]]
252-
val value2 = value.asInstanceOf[ctx.Expr[A]]
256+
val myBindSingletonContexts = new BindSingletonContexts[Ctx, ctx.type]
257+
import myBindSingletonContexts._
258+
@nowarn("msg=never used") implicit val typA2:ctx.TypeTag[A] = typA
259+
val value2: ctx.Expr[A] = value
253260
val rootTree = ctx.universe.Ident(ctx.universe.TermName("_root_"))
254261
val namesTree = List("scala", "Some", "apply").foldLeft[ctx.universe.Tree](rootTree)({(folding, name) => ctx.universe.Select(folding, ctx.universe.TermName(name))})
255-
ctx.Expr[Option[A]](ctx.universe.Apply(namesTree, List(value2.tree))).asInstanceOf[Ctx#Expr[Option[A]]]
262+
ctx.Expr[Option[A]](ctx.universe.Apply(namesTree, List(value2.tree))): Ctx#Expr[Option[A]]
256263
},
257264
(value, ctx) => {
258-
val value2 = value.asInstanceOf[ctx.Expr[Option[A]]]
259-
select[Option[A], Boolean](ctx)(value2, "isEmpty").asInstanceOf[Ctx#Expr[Boolean]]
265+
val myBindSingletonContexts = new BindSingletonContexts[Ctx, ctx.type]
266+
import myBindSingletonContexts._
267+
val value2 = value: ctx.Expr[Option[A]]
268+
select[Option[A], Boolean](ctx)(value2, "isEmpty"): Ctx#Expr[Boolean]
260269
},
261270
PartialExprFunction(
262271
(value, ctx) => {
263-
val value2 = value.asInstanceOf[ctx.Expr[Option[A]]]
264-
select[Option[A], Boolean](ctx)(value2, "nonEmpty").asInstanceOf[Ctx#Expr[Boolean]]
272+
val myBindSingletonContexts = new BindSingletonContexts[Ctx, ctx.type]
273+
import myBindSingletonContexts._
274+
val value2 = value: ctx.Expr[Option[A]]
275+
select[Option[A], Boolean](ctx)(value2, "nonEmpty"): Ctx#Expr[Boolean]
265276
},
266277
(value, ctx) => {
267-
val value2 = value.asInstanceOf[ctx.Expr[Option[A]]]
268-
select[Option[A], A](ctx)(value2, "get").asInstanceOf[Ctx#Expr[A]]
278+
val myBindSingletonContexts = new BindSingletonContexts[Ctx, ctx.type]
279+
import myBindSingletonContexts._
280+
val value2 = value: ctx.Expr[Option[A]]
281+
select[Option[A], A](ctx)(value2, "get"): Ctx#Expr[A]
269282
},
270283
)
271284
)
272285

273-
@nowarn("msg=make nowarn used")
274286
@ifdef("scalaBinaryVersion:3")
275287
implicit def quotedToExprOption[A](implicit typ: TypeCreator[A]):BiOptionally[scala.quoted.Quotes, scala.quoted.Expr, scala.quoted.Expr[A], scala.quoted.Expr[Option[A]]] =
276288
OptionallyImpl.quotedToExprOption[A]

0 commit comments

Comments
 (0)