diff --git a/compiler/src/dotty/tools/dotc/quoted/PickledQuotes.scala b/compiler/src/dotty/tools/dotc/quoted/PickledQuotes.scala index b47c20b3e5cd..432e3439ea42 100644 --- a/compiler/src/dotty/tools/dotc/quoted/PickledQuotes.scala +++ b/compiler/src/dotty/tools/dotc/quoted/PickledQuotes.scala @@ -111,12 +111,18 @@ object PickledQuotes { case ExprHole.V2(evalHole) => evalHole.nn.apply(idx, reifyExprHoleV2Args(args), QuotesImpl()) + val sourceReassigner = new TreeMapWithImplicits { + def transform(innerTree: tpd.Tree) = { + if innerTree.source == ctx.source then innerTree + else innerTree.cloneIn(ctx.source).withSpan(tree.span) + } + } + val filled = PickledQuotes.quotedExprToTree(quotedExpr) // We need to make sure a hole is created with the source file of the surrounding context, even if // it filled with contents a different source file. - if filled.source == ctx.source then filled - else filled.cloneIn(ctx.source).withSpan(tree.span) + sourceReassigner.transform(filled) else // For backwards compatibility with 3.0.x and 3.1.x // In 3.2.0+ all these holes are handled by `spliceTypes` before we call `spliceTerms`. diff --git a/scaladoc-testcases/src/tests/i22265/macro.scala b/scaladoc-testcases/src/tests/i22265/macro.scala new file mode 100644 index 000000000000..039fdf40f754 --- /dev/null +++ b/scaladoc-testcases/src/tests/i22265/macro.scala @@ -0,0 +1,13 @@ +import scala.quoted._ + +object TestBuilder: + // transparent is needed + transparent inline def apply(inline expr: Unit): Any = + ${ TestBuilder.processTests('expr) } + + def processTests(using Quotes)(body: Expr[Unit]): Expr[Any] = + import quotes.reflect._ + body.asTerm match { + case Inlined(_, _, bindings) => + '{ ${bindings.asExpr}; () } + } diff --git a/scaladoc-testcases/src/tests/i22265/main.scala b/scaladoc-testcases/src/tests/i22265/main.scala new file mode 100644 index 000000000000..7642047a175b --- /dev/null +++ b/scaladoc-testcases/src/tests/i22265/main.scala @@ -0,0 +1,4 @@ +object breaks { + TestBuilder: + import List.empty +}