Skip to content

Commit 64d248d

Browse files
committed
Fix type of Tasty.Type.TypeSelect.prefix
Previously we did not support type trees as prefixes
1 parent 1b73ba6 commit 64d248d

File tree

8 files changed

+27
-9
lines changed

8 files changed

+27
-9
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ object TastyImpl extends scala.tasty.Tasty {
555555
}
556556

557557
object TypeSelect extends TypeSelectExtractor {
558-
def unapply(x: TypeTree)(implicit ctx: Context): Option[(Term, String)] = x match {
558+
def unapply(x: TypeTree)(implicit ctx: Context): Option[(Parent, String)] = x match {
559559
case x: tpd.Select @unchecked if x.isType => Some(x.qualifier, x.name.toString)
560560
case _ => None
561561
}

library/src/scala/tasty/Tasty.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ abstract class Tasty { tasty =>
435435

436436
val TypeSelect: TypeSelectExtractor
437437
abstract class TypeSelectExtractor {
438-
def unapply(x: TypeTree)(implicit ctx: Context): Option[(Term, String)]
438+
def unapply(x: TypeTree)(implicit ctx: Context): Option[(Parent, String)]
439439
}
440440

441441
val Singleton: SingletonExtractor

library/src/scala/tasty/util/ShowExtractors.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,12 @@ class ShowExtractors[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty
9595
case TypeTree.TypeIdent(name) =>
9696
this += "TypeTree.TypeIdent(\"" += name += "\")"
9797
case TypeTree.TypeSelect(qualifier, name) =>
98-
this += "TypeTree.TypeSelect(" += qualifier += ", \"" += name += "\")"
98+
this += "TypeTree.TypeSelect("
99+
qualifier match {
100+
case qualifier @ Term() => this += qualifier
101+
case qualifier @ TypeTree() => this += qualifier
102+
}
103+
this += ", \"" += name += "\")"
99104
case TypeTree.Singleton(ref) =>
100105
this += "TypeTree.Singleton(" += ref += ")"
101106
case TypeTree.And(left, right) =>

library/src/scala/tasty/util/ShowSourceCode.scala

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -702,11 +702,10 @@ class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty
702702
printType(tree.tpe)
703703

704704
case TypeTree.TypeSelect(qual, name) =>
705-
(qual: Any) match {
706-
case qual @ TypeTree.TypeIdent(_) => printTypeTree(qual) // FIXME: qual is of type Tree buy we are getting a TypeTree qualifier
707-
case _ => printTree(qual)
705+
qual match {
706+
case qual @ Term() => printTree(qual) += "." += name
707+
case qual @ TypeTree() => printTypeTree(qual) += "#" += name
708708
}
709-
this += "." += name
710709

711710
case TypeTree.Singleton(ref) =>
712711
printTree(ref)

library/src/scala/tasty/util/TreeAccumulator.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ abstract class TreeAccumulator[X, T <: Tasty with Singleton](val tasty: T) {
8181
def foldOverTypeTree(x: X, tree: TypeOrBoundsTree)(implicit ctx: Context): X = tree match {
8282
case TypeTree.Synthetic() => x
8383
case TypeTree.TypeIdent(_) => x
84-
case TypeTree.TypeSelect(qualifier, _) => foldTree(x, qualifier)
84+
case TypeTree.TypeSelect(qualifier @ Term(), _) => foldTree(x, qualifier)
85+
case TypeTree.TypeSelect(qualifier @ TypeTree(), _) => foldTypeTree(x, qualifier)
8586
case TypeTree.Singleton(ref) => foldTree(x, ref)
8687
case TypeTree.And(left, right) => foldTypeTree(foldTypeTree(x, left), right)
8788
case TypeTree.Or(left, right) => foldTypeTree(foldTypeTree(x, left), right)

tests/pos/simpleTypeSelect.decompiled

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/** Decompiled from out/posTestFromTasty/pos/simpleTypeSelect/Foo.class */
2+
trait Foo() extends java.lang.Object {
3+
type Bar
4+
}
5+
/** Decompiled from out/posTestFromTasty/pos/simpleTypeSelect/Test.class */
6+
object Test {
7+
val x: Foo#Bar = scala.Predef.???
8+
}

tests/pos/simpleTypeSelect.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
trait Foo { type Bar }
3+
object Test {
4+
val x: Foo#Bar = ???
5+
}

tests/pos/tasty/definitions.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ object definitions {
9292
def tpe: Type = ???
9393
case Synthetic()
9494
case Ident(name: String, override val tpe: Type)
95-
case Select(prefix: Term, name: String)
95+
case Select(prefix: Term | TypeTree, name: String)
9696
case Singleton(ref: Term)
9797
case Refined(underlying: TypeTree, refinements: List[Definition])
9898
case Applied(tycon: TypeTree, args: List[TypeTree | TypeBoundsTree])

0 commit comments

Comments
 (0)