Skip to content

Commit e592b37

Browse files
authored
Handle Typeable (#22663)
Fixes #22642 Turn code comments into actual code.
2 parents fc61936 + b52b057 commit e592b37

File tree

4 files changed

+23
-12
lines changed

4 files changed

+23
-12
lines changed

Diff for: compiler/src/dotty/tools/dotc/core/Definitions.scala

+1
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,7 @@ class Definitions {
830830

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

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

Diff for: 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 _ =>

Diff for: 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

Diff for: 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)