Skip to content

Commit 8b2500e

Browse files
Merge pull request #4682 from dotty-staging/fix-typeselect
Fix type of Tasty.Type.TypeSelect.prefix
2 parents 1b73ba6 + a3b2486 commit 8b2500e

File tree

9 files changed

+41
-13
lines changed

9 files changed

+41
-13
lines changed

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,9 +554,16 @@ object TastyImpl extends scala.tasty.Tasty {
554554
}
555555
}
556556

557-
object TypeSelect extends TypeSelectExtractor {
557+
object TermSelect extends TermSelectExtractor {
558558
def unapply(x: TypeTree)(implicit ctx: Context): Option[(Term, String)] = x match {
559-
case x: tpd.Select @unchecked if x.isType => Some(x.qualifier, x.name.toString)
559+
case x: tpd.Select @unchecked if x.isType && x.qualifier.isTerm => Some(x.qualifier, x.name.toString)
560+
case _ => None
561+
}
562+
}
563+
564+
object TypeSelect extends TypeSelectExtractor {
565+
def unapply(x: TypeTree)(implicit ctx: Context): Option[(TypeTree, String)] = x match {
566+
case x: tpd.Select @unchecked if x.isType && x.qualifier.isType => Some(x.qualifier, x.name.toString)
560567
case _ => None
561568
}
562569
}

library/src/scala/tasty/Tasty.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,9 +433,14 @@ abstract class Tasty { tasty =>
433433
def unapply(x: TypeTree)(implicit ctx: Context): Option[String]
434434
}
435435

436+
val TermSelect: TermSelectExtractor
437+
abstract class TermSelectExtractor {
438+
def unapply(x: TypeTree)(implicit ctx: Context): Option[(Term, String)]
439+
}
440+
436441
val TypeSelect: TypeSelectExtractor
437442
abstract class TypeSelectExtractor {
438-
def unapply(x: TypeTree)(implicit ctx: Context): Option[(Term, String)]
443+
def unapply(x: TypeTree)(implicit ctx: Context): Option[(TypeTree, String)]
439444
}
440445

441446
val Singleton: SingletonExtractor

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ class ShowExtractors[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty
9494
this += "TypeTree.Synthetic()"
9595
case TypeTree.TypeIdent(name) =>
9696
this += "TypeTree.TypeIdent(\"" += name += "\")"
97+
case TypeTree.TermSelect(qualifier, name) =>
98+
this += "TypeTree.TermSelect(" += qualifier += ", \"" += name += "\")"
9799
case TypeTree.TypeSelect(qualifier, name) =>
98100
this += "TypeTree.TypeSelect(" += qualifier += ", \"" += name += "\")"
99101
case TypeTree.Singleton(ref) =>

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty
8585

8686
val parents1 = parents.filter {
8787
case Term.Apply(Term.Select(Term.New(tpt), _, _), _) => !Types.JavaLangObject.unapply(tpt.tpe)
88-
case TypeTree.TypeSelect(Term.Select(Term.Ident("_root_"), "scala", _), "Product") => false
88+
case TypeTree.TermSelect(Term.Select(Term.Ident("_root_"), "scala", _), "Product") => false
8989
case _ => true
9090
}
9191
if (parents1.nonEmpty) {
@@ -701,12 +701,11 @@ class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty
701701
case TypeTree.TypeIdent(name) =>
702702
printType(tree.tpe)
703703

704+
case TypeTree.TermSelect(qual, name) =>
705+
printTree(qual) += "." += name
706+
704707
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)
708-
}
709-
this += "." += name
708+
printTypeTree(qual) += "#" += 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.TermSelect(qualifier, _) => foldTree(x, qualifier)
85+
case TypeTree.TypeSelect(qualifier, _) => 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: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ 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 TermSelect(prefix: Term, name: String)
96+
case TypeSelect(prefix: TypeTree, name: String)
9697
case Singleton(ref: Term)
9798
case Refined(underlying: TypeTree, refinements: List[Definition])
9899
case Applied(tycon: TypeTree, args: List[TypeTree | TypeBoundsTree])

tests/run/tasty-extractors-2.check

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,10 @@ Type.SymRef(ClassDef("Unit", _, _, _, _), Type.ThisType(Type.SymRef(PackageDef("
100100
Term.Block(List(ClassDef("Foo", DefDef("<init>", Nil, List(List(ValDef("i", TypeTree.TypeIdent("Int"), None))), TypeTree.Synthetic(), None), List(Term.Apply(Term.Select(Term.New(TypeTree.Synthetic()), "<init>", Some(Signature(Nil, java.lang.Object))), Nil)), None, List(ValDef("i", TypeTree.Synthetic(), None))), ClassDef("Bar", DefDef("<init>", Nil, List(Nil), TypeTree.Synthetic(), None), List(Term.Apply(Term.Select(Term.New(TypeTree.TypeIdent("Foo")), "<init>", Some(Signature(List(scala.Int), Test$._$Foo))), List(Term.Literal(Constant.Int(1))))), None, Nil)), Term.Literal(Constant.Unit()))
101101
Type.SymRef(ClassDef("Unit", _, _, _, _), Type.ThisType(Type.SymRef(PackageDef("scala", _), NoPrefix())))
102102

103-
Term.Block(List(ClassDef("Foo", DefDef("<init>", Nil, List(Nil), TypeTree.Synthetic(), None), List(Term.Apply(Term.Select(Term.New(TypeTree.Synthetic()), "<init>", Some(Signature(Nil, java.lang.Object))), Nil)), None, List(TypeDef("X", TypeTree.TypeIdent("Int")))), DefDef("f", Nil, List(List(ValDef("a", TypeTree.TypeIdent("Foo"), None))), TypeTree.TypeSelect(Term.Ident("a"), "X"), Some(Term.Ident("???")))), Term.Literal(Constant.Unit()))
103+
Term.Block(List(ClassDef("Foo", DefDef("<init>", Nil, List(Nil), TypeTree.Synthetic(), None), List(Term.Apply(Term.Select(Term.New(TypeTree.Synthetic()), "<init>", Some(Signature(Nil, java.lang.Object))), Nil)), None, List(TypeDef("X", TypeTree.TypeIdent("Int")))), DefDef("f", Nil, List(List(ValDef("a", TypeTree.TypeIdent("Foo"), None))), TypeTree.TermSelect(Term.Ident("a"), "X"), Some(Term.Ident("???")))), Term.Literal(Constant.Unit()))
104104
Type.SymRef(ClassDef("Unit", _, _, _, _), Type.ThisType(Type.SymRef(PackageDef("scala", _), NoPrefix())))
105105

106-
Term.Block(List(ClassDef("Foo", DefDef("<init>", Nil, List(Nil), TypeTree.Synthetic(), None), List(Term.Apply(Term.Select(Term.New(TypeTree.Synthetic()), "<init>", Some(Signature(Nil, java.lang.Object))), Nil)), None, List(TypeDef("X", TypeBoundsTree(TypeTree.Synthetic(), TypeTree.Synthetic())))), DefDef("f", Nil, List(List(ValDef("a", TypeTree.Refined(TypeTree.TypeIdent("Foo"), List(TypeDef("X", TypeTree.TypeIdent("Int")))), None))), TypeTree.TypeSelect(Term.Ident("a"), "X"), Some(Term.Ident("???")))), Term.Literal(Constant.Unit()))
106+
Term.Block(List(ClassDef("Foo", DefDef("<init>", Nil, List(Nil), TypeTree.Synthetic(), None), List(Term.Apply(Term.Select(Term.New(TypeTree.Synthetic()), "<init>", Some(Signature(Nil, java.lang.Object))), Nil)), None, List(TypeDef("X", TypeBoundsTree(TypeTree.Synthetic(), TypeTree.Synthetic())))), DefDef("f", Nil, List(List(ValDef("a", TypeTree.Refined(TypeTree.TypeIdent("Foo"), List(TypeDef("X", TypeTree.TypeIdent("Int")))), None))), TypeTree.TermSelect(Term.Ident("a"), "X"), Some(Term.Ident("???")))), Term.Literal(Constant.Unit()))
107107
Type.SymRef(ClassDef("Unit", _, _, _, _), Type.ThisType(Type.SymRef(PackageDef("scala", _), NoPrefix())))
108108

109109
Term.Block(List(ValDef("lambda", TypeTree.Applied(TypeTree.Synthetic(), List(TypeTree.TypeIdent("Int"), TypeTree.TypeIdent("Int"))), Some(Term.Block(List(DefDef("$anonfun", Nil, List(List(ValDef("x", TypeTree.Synthetic(), None))), TypeTree.Synthetic(), Some(Term.Ident("x")))), Term.Lambda(Term.Ident("$anonfun"), None))))), Term.Literal(Constant.Unit()))

0 commit comments

Comments
 (0)