Skip to content

Commit bd52edf

Browse files
committed
Fix #8521: Remove PackageDef and use Symbol directly
PackageDef was originally added to try to encode trees in the API without the use of symbols. Now that we have symbols all the package def logic is redundant. At the time we assumed that we would be able to have a tree for all Symbol, but this has not been the case since the introduction of NoSymbol. Now we handle the `tree` of a package def the same way we did the one of a NoSymbol. * Remove `PackageDef` * Add `members` method on `Symbol` * Disallow package symbols in `Symbol.tree` as done with `NoSymbol`
1 parent 09eaed7 commit bd52edf

File tree

8 files changed

+54
-94
lines changed

8 files changed

+54
-94
lines changed

compiler/src/dotty/tools/dotc/quoted/QuoteContextImpl.scala

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import dotty.tools.dotc.core.NameKinds
1111
import dotty.tools.dotc.core.StdNames._
1212
import dotty.tools.dotc.quoted.reflect._
1313
import dotty.tools.dotc.core.Decorators._
14-
import dotty.tools.dotc.quoted.reflect.FromSymbol.{definitionFromSym, packageDefFromSym}
1514
import dotty.tools.dotc.typer.Implicits
1615

1716
import scala.quoted.QuoteContext
@@ -154,13 +153,12 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext:
154153
case _ => None
155154
end StatementTypeTest
156155

157-
type Definition = tpd.Tree
156+
type Definition = tpd.MemberDef
158157

159158
object DefinitionTypeTest extends TypeTest[Tree, Definition]:
160159
def runtimeClass: Class[?] = classOf[Definition]
161160
override def unapply(x: Any): Option[Definition] = x match
162161
case x: tpd.MemberDef @unchecked => Some(x)
163-
case x: PackageDefinition @unchecked => Some(x)
164162
case _ => None
165163
end DefinitionTypeTest
166164

@@ -170,7 +168,6 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext:
170168
extension (self: Definition):
171169
def name: String = self match
172170
case self: tpd.MemberDef => self.name.toString
173-
case self: PackageDefinition => self.symbol.name.toString // TODO make PackageDefinition a MemberDef or NameTree
174171
end extension
175172
end DefinitionMethodsImpl
176173

@@ -284,29 +281,6 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext:
284281
end extension
285282
end TypeDefMethodsImpl
286283

287-
type PackageDef = PackageDefinition
288-
289-
object PackageDefTypeTest extends TypeTest[Tree, PackageDef]:
290-
def runtimeClass: Class[?] = classOf[PackageDef]
291-
override def unapply(x: Any): Option[PackageDef] = x match
292-
case x: PackageDefinition @unchecked => Some(x)
293-
case _ => None
294-
end PackageDefTypeTest
295-
296-
object PackageDef extends PackageDefModule:
297-
def unapply(tree: PackageDef): Option[(String, PackageDef)] =
298-
Some((tree.name, tree.owner))
299-
end PackageDef
300-
301-
object PackageDefMethodsImpl extends PackageDefMethods:
302-
extension (self: PackageDef):
303-
def owner: PackageDef = packageDefFromSym(self.symbol.owner)
304-
def members: List[Statement] =
305-
if (self.symbol.is(JavaDefined)) Nil // FIXME should also support java packages
306-
else self.symbol.info.decls.iterator.map(definitionFromSym).toList
307-
end extension
308-
end PackageDefMethodsImpl
309-
310284
type Term = tpd.Tree
311285

312286
object TermTypeTest extends TypeTest[Tree, Term]:
@@ -1137,13 +1111,13 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext:
11371111
def copy(original: Tree)(tpt: TypeTree, refinements: List[Definition]): Refined =
11381112
tpd.cpy.RefinedTypeTree(original)(tpt, refinements)
11391113
def unapply(x: Refined): Option[(TypeTree, List[Definition])] =
1140-
Some((x.tpt, x.refinements))
1114+
Some((x.tpt, x.refinements.asInstanceOf[List[Definition]]))
11411115
end Refined
11421116

11431117
object RefinedMethodsImpl extends RefinedMethods:
11441118
extension (self: Refined):
11451119
def tpt: TypeTree = self.tpt
1146-
def refinements: List[Definition] = self.refinements
1120+
def refinements: List[Definition] = self.refinements.asInstanceOf[List[Definition]]
11471121
end extension
11481122
end RefinedMethodsImpl
11491123

@@ -2288,6 +2262,9 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext:
22882262
case sym if isMethod(sym) => sym.asTerm
22892263
}.toList
22902264

2265+
def members: List[Symbol] =
2266+
self.typeRef.info.decls.toList
2267+
22912268
def typeMembers: List[Symbol] =
22922269
self.unforcedDecls.filter(_.isType)
22932270

compiler/src/dotty/tools/dotc/quoted/reflect/FromSymbol.scala

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,16 @@ import dotty.tools.dotc.core.Types._
1212
object FromSymbol {
1313

1414
def definitionFromSym(sym: Symbol)(using Context): tpd.Tree = {
15-
assert(sym.exists)
16-
if (sym.is(Package)) packageDefFromSym(sym)
17-
else if (sym.isClass) classDef(sym.asClass)
15+
assert(sym.exists, "Cannot get tree of no symbol")
16+
assert(!sym.is(Package), "Cannot get tree of package symbol")
17+
if (sym.isClass) classDef(sym.asClass)
1818
else if (sym.isType && sym.is(Case)) typeBindFromSym(sym.asType)
1919
else if (sym.isType) typeDefFromSym(sym.asType)
2020
else if (sym.is(Method)) defDefFromSym(sym.asTerm)
2121
else if (sym.is(Case)) bindFromSym(sym.asTerm)
2222
else valDefFromSym(sym.asTerm)
2323
}
2424

25-
def packageDefFromSym(sym: Symbol)(using Context): PackageDefinition = PackageDefinitionImpl(sym)
26-
2725
def classDef(cls: ClassSymbol)(using Context): tpd.TypeDef = cls.defTree match {
2826
case tree: tpd.TypeDef => tree
2927
case tpd.EmptyTree =>

compiler/src/dotty/tools/dotc/quoted/reflect/package.scala

Lines changed: 0 additions & 22 deletions
This file was deleted.

library/src/scala/tasty/Reflection.scala

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ import scala.tasty.reflect._
2020
*
2121
* +- Tree -+- PackageClause
2222
* +- Import
23-
* +- Statement -+- Definition --+- PackageDef
24-
* | | +- ClassDef
23+
* +- Statement -+- Definition --+- ClassDef
2524
* | | +- TypeDef
2625
* | | +- DefDef
2726
* | | +- ValDef
@@ -225,7 +224,7 @@ trait Reflection { reflection =>
225224

226225
// ----- Definitions ----------------------------------------------
227226

228-
/** Tree representing a definition in the source code. It can be `PackageDef`, `ClassDef`, `TypeDef`, `DefDef` or `ValDef` */
227+
/** Tree representing a definition in the source code. It can be `ClassDef`, `TypeDef`, `DefDef` or `ValDef` */
229228
type Definition <: Statement
230229

231230
given TypeTest[Tree, Definition] = DefinitionTypeTest
@@ -352,29 +351,6 @@ trait Reflection { reflection =>
352351
end extension
353352
end TypeDefMethods
354353

355-
// PackageDef
356-
357-
/** Tree representing a package definition. This includes definitions in all source files */
358-
type PackageDef <: Definition
359-
360-
given TypeTest[Tree, PackageDef] = PackageDefTypeTest
361-
protected val PackageDefTypeTest: TypeTest[Tree, PackageDef]
362-
363-
val PackageDef: PackageDefModule
364-
365-
trait PackageDefModule { this: PackageDef.type =>
366-
def unapply(tree: PackageDef): Option[(String, PackageDef)]
367-
}
368-
369-
given PackageDefMethods as PackageDefMethods = PackageDefMethodsImpl
370-
protected val PackageDefMethodsImpl: PackageDefMethods
371-
372-
trait PackageDefMethods:
373-
extension (self: PackageDef):
374-
def owner: PackageDef
375-
def members: List[Statement]
376-
end extension
377-
end PackageDefMethods
378354

379355
// ----- Terms ----------------------------------------------------
380356

@@ -2555,14 +2531,14 @@ trait Reflection { reflection =>
25552531
def comment: Option[Comment]
25562532

25572533
/** Tree of this definition
2558-
*
2559-
* if this symbol `isPackageDef` it will return a `PackageDef`,
2560-
* if this symbol `isClassDef` it will return a `ClassDef`,
2561-
* if this symbol `isTypeDef` it will return a `TypeDef`,
2562-
* if this symbol `isValDef` it will return a `ValDef`,
2563-
* if this symbol `isDefDef` it will return a `DefDef`
2564-
* if this symbol `isBind` it will return a `Bind`
2565-
*/
2534+
*
2535+
* If this symbol `isClassDef` it will return `a `ClassDef`,
2536+
* if this symbol `isTypeDef` it will return `a `TypeDef`,
2537+
* if this symbol `isValDef` it will return `a `ValDef`,
2538+
* if this symbol `isDefDef` it will return `a `DefDef`
2539+
* if this symbol `isBind` it will return `a `Bind`,
2540+
* else will throw
2541+
*/
25662542
def tree: Tree
25672543

25682544
/** Annotations attached to this symbol */
@@ -2626,6 +2602,9 @@ trait Reflection { reflection =>
26262602
/** Type member with the given name directly declared in the class */
26272603
def typeMember(name: String): Symbol
26282604

2605+
/** All members directly declared in the class */
2606+
def members: List[Symbol]
2607+
26292608
/** Get named non-private methods declared or inherited */
26302609
def method(name: String): List[Symbol]
26312610

library/src/scala/tasty/reflect/ExtractorsPrinter.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,6 @@ class ExtractorsPrinter[R <: Reflection & Singleton](val tasty: R) extends Print
118118
this += ", "
119119
visitList[TypeTree](derived, visitTree)
120120
this += ", " += self += ", " ++= body += ")"
121-
case PackageDef(name, owner) =>
122-
this += "PackageDef(\"" += name += "\", " += owner += ")"
123121
case Import(expr, selectors) =>
124122
this += "Import(" += expr += ", " ++= selectors += ")"
125123
case PackageClause(pid, stats) =>

library/src/scala/tasty/reflect/SourceCodePrinter.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,12 +1228,11 @@ class SourceCodePrinter[R <: Reflection & Singleton](val tasty: R)(syntaxHighlig
12281228
case RenameSelector(name, newName) => this += name += " => " += newName
12291229
}
12301230

1231-
def printDefinitionName(sym: Definition): Buffer = sym match {
1231+
def printDefinitionName(tree: Definition): Buffer = tree match {
12321232
case ValDef(name, _, _) => this += highlightValDef(name)
12331233
case DefDef(name, _, _, _, _) => this += highlightValDef(name)
12341234
case ClassDef(name, _, _, _, _, _) => this += highlightTypeDef(name.stripSuffix("$"))
12351235
case TypeDef(name, _) => this += highlightTypeDef(name)
1236-
case PackageDef(name, _) => this += highlightTypeDef(name)
12371236
}
12381237

12391238
def printAnnotation(annot: Term)(using elideThis: Option[Symbol]): Buffer = {

tests/pos-macros/i8521/Macro_1.scala

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import scala.quoted._
2+
3+
object Foo {
4+
inline def foo[T <: AnyKind]: String = ${ bar[T] }
5+
6+
def bar[T <: AnyKind : Type](using qctx: QuoteContext): Expr[String] = {
7+
import qctx.tasty.{Type => _, _}
8+
9+
def packageToName(sym: Symbol): Unit = {
10+
if sym.isPackageDef then
11+
packageToName(sym.owner)
12+
}
13+
14+
val sym = implicitly[Type[T]].unseal.symbol
15+
if (!sym.isNoSymbol) {
16+
sym.tree match {
17+
case c: ClassDef =>
18+
if (!sym.maybeOwner.isNoSymbol) {
19+
if sym.maybeOwner.isPackageDef then
20+
packageToName(sym.maybeOwner)
21+
}
22+
}
23+
}
24+
Expr("")
25+
}
26+
}

tests/pos-macros/i8521/Tes_2.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class A
2+
3+
object Test {
4+
def test = Foo.foo[A]
5+
}

0 commit comments

Comments
 (0)