Skip to content

Commit 8d2127f

Browse files
committed
Add constructors for Select
1 parent d17e041 commit 8d2127f

File tree

4 files changed

+85
-1
lines changed

4 files changed

+85
-1
lines changed

compiler/src/dotty/tools/dotc/tastyreflect/TreeOpsImpl.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,15 @@ trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with CoreImpl with Helpers
400400

401401

402402
object Select extends SelectModule {
403+
def unique(qualifier: Term, name: String)(implicit ctx: Context): Select = {
404+
val denot = qualifier.tpe.member(name.toTermName)
405+
assert(!denot.isOverloaded, s"The symbol `$name` is overloaded. The method Select.unique can only be used for non-overloaded symbols.")
406+
tpd.Select(qualifier, name.toTermName)
407+
}
408+
409+
def overloaded(qualifier: Term, name: String, targs: List[Type], args: List[Term])(implicit ctx: Context): Apply =
410+
tpd.applyOverloaded(qualifier, name.toTermName, args, targs, Types.WildcardType).asInstanceOf[Apply]
411+
403412
def copy(original: Tree)(qualifier: Term, name: String)(implicit ctx: Context): Select =
404413
tpd.cpy.Select(original)(qualifier, name.toTermName)
405414

library/src/scala/tasty/reflect/TreeOps.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,9 @@ trait TreeOps extends Core {
271271
/** Scala term selection */
272272
val Select: SelectModule
273273
abstract class SelectModule {
274+
def unique(qualifier: Term, name: String)(implicit ctx: Context): Select
274275

275-
// TODO def apply(qualifier: Term, name: String, signature: Option[Signature])(implicit ctx: Context): Select
276+
def overloaded(qualifier: Term, name: String, targs: List[Type], args: List[Term])(implicit ctx: Context): Apply
276277

277278
def copy(original: Tree)(qualifier: Term, name: String)(implicit ctx: Context): Select
278279

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import scala.quoted._
2+
import scala.tasty._
3+
4+
object scalatest {
5+
6+
inline def assert(condition: => Boolean): Unit = ~assertImpl('(condition), '(""))
7+
8+
def assertImpl(cond: Expr[Boolean], clue: Expr[Any])(implicit refl: Reflection): Expr[Unit] = {
9+
import refl._
10+
import util._
11+
import quoted.Toolbox.Default._
12+
13+
def isImplicitMethodType(tp: Type): Boolean =
14+
Type.IsMethodType.unapply(tp).flatMap(tp => if tp.isImplicit then Some(true) else None).nonEmpty
15+
16+
cond.unseal.underlyingArgument match {
17+
case Term.Apply(Term.Select(lhs, op), rhs :: Nil) =>
18+
let(lhs) { left =>
19+
let(rhs) { right =>
20+
let(Term.Select.overloaded(left, op, Nil, right :: Nil)) { result =>
21+
val l = left.seal[Any]
22+
val r = right.seal[Any]
23+
val b = result.seal[Boolean]
24+
val code = '{ scala.Predef.assert(~b) }
25+
code.unseal
26+
}
27+
}
28+
}.seal[Unit]
29+
case Term.Apply(f @ Term.Apply(Term.Select(Term.Apply(qual, lhs :: Nil), op), rhs :: Nil), implicits)
30+
if isImplicitMethodType(f.tpe) =>
31+
let(lhs) { left =>
32+
let(rhs) { right =>
33+
let(Term.Apply(Term.Select.overloaded(Term.Apply(qual, left :: Nil), op, Nil, right :: Nil), implicits)) { result =>
34+
val l = left.seal[Any]
35+
val r = right.seal[Any]
36+
val b = result.seal[Boolean]
37+
val code = '{ scala.Predef.assert(~b) }
38+
code.unseal
39+
}
40+
}
41+
}.seal[Unit]
42+
}
43+
}
44+
45+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
object Test {
2+
import scalatest._
3+
4+
case class Box[T](v: T) {
5+
def >(that: Box[T]): Boolean = this == that
6+
}
7+
8+
trait EqInt
9+
implicit val eq: EqInt = new EqInt {}
10+
11+
implicit class AnyOps[T](x: T) {
12+
def === (y: T)(implicit c: EqInt) = x == y
13+
}
14+
15+
def main(args: Array[String]): Unit = {
16+
val a = Box(Some(10))
17+
val five: Float = 5.0f
18+
val six: Double = 6.0
19+
val ten: Int = 10
20+
assert(a.v === Some(10))
21+
assert(five < six)
22+
assert(five > 4)
23+
assert(ten > 5)
24+
assert(six < 7)
25+
assert(six > 5L)
26+
assert(Box(6) > Box(6))
27+
assert(Box("h") > Box("h"))
28+
}
29+
}

0 commit comments

Comments
 (0)