diff --git a/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala b/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala index ae3067a894d7..920092084e33 100644 --- a/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala +++ b/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala @@ -247,6 +247,11 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler optional(self.rhs.asInstanceOf[tpd.Template].self) def body: List[Statement] = self.rhs.asInstanceOf[tpd.Template].body + def baseTypes: List[TypeRepr] = self.symbol match + case cls: dotc.core.Symbols.ClassSymbol => + val ref = cls.classDenot.classInfo.appliedRef + ref.baseClasses.map(ref.baseType(_)) + case _ => List() end extension end ClassDefMethods diff --git a/library/src/scala/quoted/Quotes.scala b/library/src/scala/quoted/Quotes.scala index f5decee041f4..779eccb92b05 100644 --- a/library/src/scala/quoted/Quotes.scala +++ b/library/src/scala/quoted/Quotes.scala @@ -502,6 +502,11 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching => * @syntax markdown */ def body: List[Statement] + + /** Base types of the class */ + @experimental + def baseTypes: List[TypeRepr] + end extension end ClassDefMethods diff --git a/project/MiMaFilters.scala b/project/MiMaFilters.scala index 097a82ff2ef0..11985676aed4 100644 --- a/project/MiMaFilters.scala +++ b/project/MiMaFilters.scala @@ -19,6 +19,8 @@ object MiMaFilters { ProblemFilters.exclude[MissingClassProblem]("scala.compiletime.ops.long$"), ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#CompilationInfoModule.XmacroSettings"), ProblemFilters.exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule#CompilationInfoModule.XmacroSettings"), + ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#ClassDefMethods.baseTypes"), + ProblemFilters.exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule#ClassDefMethods.baseTypes"), // Should have been added in 3.1.0 // These are only allowed on imports and therefore should not be present in binaries emitted before diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala index 31e27e234332..7cb9a2c90a40 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala @@ -79,6 +79,7 @@ trait ClassLikeSupport: else Seq(link -> superLink) ++ getSupertypesGraph(superLink, nextTo) } + // TODO use classDef.baseTypes val supertypes = getSupertypes(using qctx)(classDef) .filterNot((s, t) => s.isHiddenByVisibility) .map { diff --git a/tests/run-macros/baseTypes.check b/tests/run-macros/baseTypes.check new file mode 100644 index 000000000000..1a12b47c4f0c --- /dev/null +++ b/tests/run-macros/baseTypes.check @@ -0,0 +1,3 @@ +List(scala.Int, scala.AnyVal, scala.Matchable, scala.Any) +List(java.lang.Object, scala.Matchable, scala.Any) +List(scala.Some[Some.this.A], scala.Option[Some.this.A], java.io.Serializable, scala.Product, scala.Equals, scala.collection.IterableOnce[Some.this.A], java.lang.Object, scala.Matchable, scala.Any) diff --git a/tests/run-macros/baseTypes/Macro_1.scala b/tests/run-macros/baseTypes/Macro_1.scala new file mode 100644 index 000000000000..175e8fd638cb --- /dev/null +++ b/tests/run-macros/baseTypes/Macro_1.scala @@ -0,0 +1,10 @@ +import scala.quoted.* + +inline def baseTypes[T]: List[String] = + ${ baseTypesExpr[T] } + +private def baseTypesExpr[T: Type](using Quotes): Expr[List[String]] = + import quotes.reflect.* + TypeRepr.of[T].typeSymbol.tree match + case cdef: ClassDef => Expr(cdef.baseTypes.map(_.show)) + case _ => Expr(Nil) diff --git a/tests/run-macros/baseTypes/Test_2.scala b/tests/run-macros/baseTypes/Test_2.scala new file mode 100644 index 000000000000..b4682433e9cd --- /dev/null +++ b/tests/run-macros/baseTypes/Test_2.scala @@ -0,0 +1,4 @@ +@main def Test: Unit = + println(baseTypes[Int]) + println(baseTypes[Object]) + println(baseTypes[Some[Int]])