diff --git a/modules/unpickler/src/main/scala/ch/epfl/scala/debugadapter/internal/stacktrace/Scala3Unpickler.scala b/modules/unpickler/src/main/scala/ch/epfl/scala/debugadapter/internal/stacktrace/Scala3Unpickler.scala index a5a5fc64d..946db8e52 100644 --- a/modules/unpickler/src/main/scala/ch/epfl/scala/debugadapter/internal/stacktrace/Scala3Unpickler.scala +++ b/modules/unpickler/src/main/scala/ch/epfl/scala/debugadapter/internal/stacktrace/Scala3Unpickler.scala @@ -20,6 +20,7 @@ import scala.jdk.OptionConverters.* import scala.util.matching.Regex import tastyquery.Modifiers.TermSymbolKind import tastyquery.SourceLanguage +import scala.util.control.NonFatal class Scala3Unpickler( classpaths: Array[Path], @@ -139,7 +140,11 @@ class Scala3Unpickler( ): Seq[S] = val f = partialF.lift.andThen(_.toSeq) - def collectSymbols(tree: Tree): Seq[S] = + def isInline(tree: Ident): Boolean = + try tree.symbol.isTerm && tree.symbol.asTerm.isInline + catch case NonFatal(e) => false + + def collectSymbols(tree: Tree, inlineSet: Set[Symbol]): Seq[S] = tree.walkTree { case ValDef(_, _, _, symbol) if symbol.isLocal && (symbol.isLazyVal || symbol.isModuleVal) => f((symbol, None)) case DefDef(_, _, _, _, symbol) if symbol.isLocal => f(symbol, None) @@ -147,13 +152,15 @@ class Scala3Unpickler( case lambda: Lambda => val sym = lambda.meth.asInstanceOf[TermReferenceTree].symbol f(sym, Some(lambda.samClassSymbol)) + case tree: Ident if isInline(tree) && !inlineSet.contains(tree.symbol) => + tree.symbol.tree.toSeq.flatMap(collectSymbols(_, inlineSet + tree.symbol)) case _ => Seq.empty }(_ ++ _, Seq.empty) for decl <- cls.declarations tree <- decl.tree.toSeq - localSym <- collectSymbols(tree) + localSym <- collectSymbols(tree, Set.empty) yield localSym def formatType(t: TermType | TypeOrWildcard): String = diff --git a/modules/unpickler/src/test/scala/ch/epfl/scala/debugadapter/internal/stacktrace/Scala3UnpicklerTests.scala b/modules/unpickler/src/test/scala/ch/epfl/scala/debugadapter/internal/stacktrace/Scala3UnpicklerTests.scala index 1e1acde4c..0b641582a 100644 --- a/modules/unpickler/src/test/scala/ch/epfl/scala/debugadapter/internal/stacktrace/Scala3UnpicklerTests.scala +++ b/modules/unpickler/src/test/scala/ch/epfl/scala/debugadapter/internal/stacktrace/Scala3UnpicklerTests.scala @@ -484,6 +484,30 @@ abstract class Scala3UnpicklerTests(val scalaVersion: ScalaVersion) extends FunS debuggee.assertFormat("example.A", "example.A m()", "A.m(): A") } + test("inline def with anonymous class and method") { + val source = + """|package example + |class A + | + |inline def m: Unit = + | val f = (x : Int) => x + 1 + | val a = new A { + | println("") + | } + | if true then () else m + | + |class B : + | def n = + | m + |""".stripMargin + + val debuggee = TestingDebuggee.mainClass(source, "example.Main", scalaVersion) + debuggee.assertFormat("example.B", "int $anonfun$1(int x)", "example.m.f.$anonfun(x: Int): Int") + debuggee.assertFormat("example.B$$anon$1", "example.m.a.$anon") + // debuggee.assertFormat("example.A", "example.A m()", "A.m(): A") + + } + test("anonClass from SAM class") { val source = """|package example