Skip to content

Commit be6bcaf

Browse files
Merge pull request #9913 from dotty-staging/fix-#8521
Fix #8521: Remove PackageDef and use Symbol directly
2 parents ab5059f + bd52edf commit be6bcaf

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 documentation: Option[Documentation]
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)