Skip to content

Commit 4446bcc

Browse files
authored
Merge pull request #273 from scala/backport-lts-3.3-22663
Backport "Handle Typeable" to 3.3 LTS
2 parents 38745fd + cf181c2 commit 4446bcc

File tree

4 files changed

+23
-12
lines changed

4 files changed

+23
-12
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,7 @@ class Definitions {
811811

812812
@tu lazy val ReflectSelectableTypeRef: TypeRef = requiredClassRef("scala.reflect.Selectable")
813813

814+
@tu lazy val TypeableType: TypeSymbol = requiredPackage("scala.reflect.Typeable$package").moduleClass.requiredType("Typeable")
814815
@tu lazy val TypeTestClass: ClassSymbol = requiredClass("scala.reflect.TypeTest")
815816
@tu lazy val TypeTest_unapply: Symbol = TypeTestClass.requiredMethod(nme.unapply)
816817
@tu lazy val TypeTestModule_identity: Symbol = TypeTestClass.companionModule.requiredMethod(nme.identity)

compiler/src/dotty/tools/dotc/transform/CheckUnused.scala

+5-2
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,11 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
6868
val name = tree.removeAttachment(OriginalName).getOrElse(nme.NO_NAME)
6969
if tree.srcPos.isSynthetic && tree.symbol == defn.TypeTest_unapply then
7070
tree.qualifier.tpe.underlying.finalResultType match
71-
case AppliedType(_, args) => // tycon.typeSymbol == defn.TypeTestClass
72-
val res = args(1) // T in TypeTest[-S, T]
71+
case AppliedType(tycon, args) =>
72+
val res =
73+
if tycon.typeSymbol == defn.TypeTestClass then args(1) // T in TypeTest[-S, T]
74+
else if tycon.typeSymbol == defn.TypeableType then args(0) // T in Typeable[T]
75+
else return tree
7376
val target = res.dealias.typeSymbol
7477
resolveUsage(target, target.name, res.importPrefix.skipPackageObject) // case _: T =>
7578
case _ =>

tests/warn/i15503d.scala

-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
//> using options -Wunused:patvars
22

3-
import scala.reflect.Typeable
4-
53
sealed trait Calc
64
sealed trait Const extends Calc
75
case class Sum(a: Calc, b: Calc) extends Calc
@@ -74,13 +72,6 @@ class C(c0: Option[Int], k0: K):
7472
for case Some(value) <- List(Option(42))
7573
yield 27
7674

77-
/*
78-
def tester[A](a: A)(using Typeable[K]) =
79-
a match
80-
case S(i, j) => i + j
81-
case _ => 0
82-
*/
83-
8475
class Wild:
8576
def f(x: Any) =
8677
x match

tests/warn/i21525.scala

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//> using options -Werror -Wunused:imports
22

3-
import scala.reflect.TypeTest
3+
import scala.reflect.{Typeable, TypeTest}
4+
import compiletime.*
45

56
trait A {
67
type B
@@ -18,3 +19,18 @@ def f(a: A, b: a.B): Boolean = {
1819
false
1920
}
2021
}
22+
23+
trait T:
24+
type X
25+
given Typeable[X] = deferred
26+
27+
def g(t: T, x: Any) =
28+
import t.X
29+
x match
30+
case _: X => true
31+
case _ => false
32+
33+
def typer[T: Typeable](x: Any) =
34+
x match
35+
case _: T => 1
36+
case _ => 0

0 commit comments

Comments
 (0)