diff --git a/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala b/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala index ae3067a894d7..a80e2bd5d626 100644 --- a/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala +++ b/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala @@ -2603,6 +2603,13 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler def declarations: List[Symbol] = self.typeRef.info.decls.toList + def allMembers: List[Symbol] = + lookupPrefix.allMembers.iterator.map(_.symbol).collect { + case sym if sym.isType => sym.asType + case sym if isMethod(sym) => sym.asTerm + case sym if isField(sym) => sym.asTerm + }.toList + def paramSymss: List[List[Symbol]] = self.denot.paramSymss def primaryConstructor: Symbol = self.denot.primaryConstructor def allOverriddenSymbols: Iterator[Symbol] = self.denot.allOverriddenSymbols diff --git a/library/src/scala/quoted/Quotes.scala b/library/src/scala/quoted/Quotes.scala index f5decee041f4..3cac1caefd48 100644 --- a/library/src/scala/quoted/Quotes.scala +++ b/library/src/scala/quoted/Quotes.scala @@ -3756,6 +3756,9 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching => /** All members directly declared in the class */ def declarations: List[Symbol] + /** All members declared or inherited */ + def allMembers: List[Symbol] + /** The symbols of each type parameter list and value parameter list of this * method, or Nil if this isn't a method. */ diff --git a/project/MiMaFilters.scala b/project/MiMaFilters.scala index 097a82ff2ef0..4478fbb1f2e6 100644 --- a/project/MiMaFilters.scala +++ b/project/MiMaFilters.scala @@ -17,6 +17,7 @@ object MiMaFilters { ProblemFilters.exclude[MissingClassProblem]("scala.compiletime.ops.float$"), ProblemFilters.exclude[MissingClassProblem]("scala.compiletime.ops.long"), ProblemFilters.exclude[MissingClassProblem]("scala.compiletime.ops.long$"), + ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#SymbolMethods.allMembers"), ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.quoted.Quotes#reflectModule#CompilationInfoModule.XmacroSettings"), ProblemFilters.exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule#CompilationInfoModule.XmacroSettings"), diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala index 31e27e234332..b0705d6221b2 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala @@ -205,7 +205,8 @@ trait ClassLikeSupport: def membersToDocument = c.body.filterNot(_.symbol.isHiddenByVisibility) def getNonTrivialInheritedMemberTrees = - c.symbol.getmembers.filterNot(s => s.isHiddenByVisibility || s.maybeOwner == c.symbol) + reflect.ClassDef.copy(c)(c.name, c.constructor, c.parents, None, c.body).symbol.allMembers + .filterNot(s => s.isHiddenByVisibility || s.maybeOwner == c.symbol) .filter(s => s.maybeOwner != defn.ObjectClass && s.maybeOwner != defn.AnyClass) .map(_.tree) diff --git a/tests/run-macros/allMembers.check b/tests/run-macros/allMembers.check new file mode 100644 index 000000000000..1cd23c1d5502 --- /dev/null +++ b/tests/run-macros/allMembers.check @@ -0,0 +1,2 @@ +List(java.lang.Object.eq, scala.Any.hashCode, java.lang.Object.synchronized, scala.Any.$isInstanceOf$, scala.Any.$asInstanceOf$, java.lang.Object.notifyAll, java.lang.Object.clone, scala.Any.!=, scala.Any.getClass, java.lang.Object.finalize, scala.Any.toString, java.lang.Object.wait, java.lang.Object.wait, java.lang.Object.wait, java.lang.Object.notify, java.lang.Object.ne, scala.Any.##, scala.Any.equals, scala.Any.isInstanceOf, scala.Any.asInstanceOf, scala.Any.==) +List(A.foo, java.lang.Object.eq, scala.Any.hashCode, java.lang.Object.synchronized, scala.Any.$isInstanceOf$, A.x, scala.Any.$asInstanceOf$, java.lang.Object.notifyAll, java.lang.Object.clone, A.X, scala.Any.!=, scala.Any.getClass, java.lang.Object.finalize, scala.Any.toString, java.lang.Object.wait, java.lang.Object.wait, java.lang.Object.wait, java.lang.Object.notify, java.lang.Object.ne, scala.Any.##, scala.Any.equals, scala.Any.isInstanceOf, scala.Any.asInstanceOf, scala.Any.==) diff --git a/tests/run-macros/allMembers/Macro_1.scala b/tests/run-macros/allMembers/Macro_1.scala new file mode 100644 index 000000000000..b4ba6d05829d --- /dev/null +++ b/tests/run-macros/allMembers/Macro_1.scala @@ -0,0 +1,8 @@ +import scala.quoted.* + +inline def allMembers[T]: List[String] = + ${ allMembersExpr[T] } + +private def allMembersExpr[T: Type](using Quotes): Expr[List[String]] = + import quotes.reflect.* + Expr(TypeRepr.of[T].typeSymbol.allMembers.map(_.fullName).toList) diff --git a/tests/run-macros/allMembers/Test_2.scala b/tests/run-macros/allMembers/Test_2.scala new file mode 100644 index 000000000000..08e81ebd906a --- /dev/null +++ b/tests/run-macros/allMembers/Test_2.scala @@ -0,0 +1,7 @@ +class A: + type X + val x: Int = 1 + def foo: Int = 1 +@main def Test: Unit = + println(allMembers[Object]) + println(allMembers[A]) \ No newline at end of file