Skip to content

Commit 44a537b

Browse files
authored
Add reflect TypeRepr.dealiasKeepOpaques (#18583)
From #18562
2 parents a940541 + b59b901 commit 44a537b

File tree

6 files changed

+52
-0
lines changed

6 files changed

+52
-0
lines changed

compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala

+1
Original file line numberDiff line numberDiff line change
@@ -1790,6 +1790,7 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
17901790
def widenTermRefByName: TypeRepr = self.widenTermRefExpr
17911791
def widenByName: TypeRepr = self.widenExpr
17921792
def dealias: TypeRepr = self.dealias
1793+
def dealiasKeepOpaques: TypeRepr = self.dealiasKeepOpaques
17931794
def simplified: TypeRepr = self.simplified
17941795
def classSymbol: Option[Symbol] =
17951796
if self.classSymbol.exists then Some(self.classSymbol.asClass)

library/src/scala/quoted/Quotes.scala

+3
Original file line numberDiff line numberDiff line change
@@ -2652,6 +2652,9 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
26522652
/** Follow aliases, annotated types until type is no longer alias type, annotated type. */
26532653
def dealias: TypeRepr
26542654

2655+
/** Follow non-opaque aliases, annotated types until type is no longer alias type, annotated type. */
2656+
def dealiasKeepOpaques: TypeRepr
2657+
26552658
/** A simplified version of this type which is equivalent wrt =:= to this type.
26562659
* Reduces typerefs, applied match types, and and or types.
26572660
*/

project/MiMaFilters.scala

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ object MiMaFilters {
99
ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule.ValOrDefDefMethods"),
1010
ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#defnModule.FunctionClass"),
1111
ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#defnModule.PolyFunctionClass"),
12+
ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#TypeReprMethods.dealiasKeepOpaques"),
1213
)
1314
val TastyCore: Seq[ProblemFilter] = Seq(
1415
ProblemFilters.exclude[DirectMissingMethodProblem]("dotty.tools.tasty.TastyFormat.EXPLICITtpt"),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
java.lang.String
2+
java.lang.String
3+
scala.collection.immutable.List[Test_2$package.A]
4+
scala.collection.immutable.List[scala.Int]
5+
Test_2$package.OA
6+
Test_2$package.OB
7+
Test_2$package.OC[scala.Int]
8+
Test_2$package.OA
9+
Test_2$package.OB
10+
Test_2$package.OC[scala.Int]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import scala.quoted.*
2+
3+
inline def dealiasKeepOpaques[T]: String = ${ impl[T] }
4+
5+
def impl[T: Type](using Quotes) : Expr[String] = {
6+
import quotes.reflect.*
7+
Expr(TypeRepr.of[T].dealiasKeepOpaques.show)
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
type A = String
2+
type B = List[A]
3+
type C[X] = List[X]
4+
5+
opaque type OA = String
6+
object OA:
7+
def test = println(dealiasKeepOpaques[OA])
8+
9+
opaque type OB = List[A]
10+
object OB:
11+
def test = println(dealiasKeepOpaques[OB])
12+
13+
opaque type OC[X] = List[X]
14+
object OC:
15+
def test = println(dealiasKeepOpaques[OC[Int]])
16+
17+
18+
@main def Test: Unit = {
19+
println(dealiasKeepOpaques[String])
20+
println(dealiasKeepOpaques[A])
21+
println(dealiasKeepOpaques[B])
22+
println(dealiasKeepOpaques[C[Int]])
23+
println(dealiasKeepOpaques[OA])
24+
println(dealiasKeepOpaques[OB])
25+
println(dealiasKeepOpaques[OC[Int]])
26+
OA.test
27+
OB.test
28+
OC.test
29+
}

0 commit comments

Comments
 (0)