Skip to content

Commit e4c0ead

Browse files
joroKr21tgodzik
authored andcommitted
Also fix asQuotes implicit context for methods
1 parent 3b718fb commit e4c0ead

File tree

5 files changed

+28
-6
lines changed

5 files changed

+28
-6
lines changed

compiler/src/dotty/tools/dotc/core/SymDenotations.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,13 @@ object SymDenotations {
338338

339339
def recurWithoutParamss(info: Type): List[List[Symbol]] = info match
340340
case info: LambdaType =>
341-
val params = info.paramNames.lazyZip(info.paramInfos).map((pname, ptype) =>
342-
newSymbol(symbol, pname, SyntheticParam, ptype))
341+
val commonFlags =
342+
if info.isContextualMethod then Given | SyntheticParam
343+
else if info.isImplicitMethod then Implicit | SyntheticParam
344+
else SyntheticParam
345+
val params = info.paramNames.lazyZip(info.paramInfos).map: (pname, ptype) =>
346+
val flags = if ptype.hasAnnotation(defn.ErasedParamAnnot) then commonFlags | Erased else commonFlags
347+
newSymbol(symbol, pname, flags, ptype)
343348
val prefs = params.map(_.namedType)
344349
for param <- params do
345350
param.info = param.info.substParams(info, prefs)

compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import dotty.tools.dotc.core.Contexts.*
1111
import dotty.tools.dotc.core.Decorators.*
1212
import dotty.tools.dotc.core.NameKinds
1313
import dotty.tools.dotc.core.NameOps.*
14+
import dotty.tools.dotc.core.Scopes.*
1415
import dotty.tools.dotc.core.StdNames.*
1516
import dotty.tools.dotc.core.Types
1617
import dotty.tools.dotc.NoCompilationUnit
@@ -2579,7 +2580,7 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
25792580
modFlags | dotc.core.Flags.ModuleValCreationFlags,
25802581
clsFlags | dotc.core.Flags.ModuleClassCreationFlags,
25812582
parents,
2582-
dotc.core.Scopes.newScope,
2583+
newScope,
25832584
privateWithin)
25842585
val cls = mod.moduleClass.asClass
25852586
cls.enter(dotc.core.Symbols.newConstructor(cls, dotc.core.Flags.Synthetic, Nil, Nil))
@@ -2592,7 +2593,9 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
25922593
xCheckMacroAssert(!privateWithin.exists || privateWithin.isType, "privateWithin must be a type symbol or `Symbol.noSymbol`")
25932594
val privateWithin1 = if privateWithin.isTerm then Symbol.noSymbol else privateWithin
25942595
checkValidFlags(flags.toTermFlags, Flags.validMethodFlags)
2595-
dotc.core.Symbols.newSymbol(owner, name.toTermName, flags | dotc.core.Flags.Method, tpe, privateWithin1)
2596+
val method = dotc.core.Symbols.newSymbol(owner, name.toTermName, flags | dotc.core.Flags.Method, tpe, privateWithin1)
2597+
method.setParamss(method.paramSymss)
2598+
method
25962599
def newVal(owner: Symbol, name: String, tpe: TypeRepr, flags: Flags, privateWithin: Symbol): Symbol =
25972600
xCheckMacroAssert(!privateWithin.exists || privateWithin.isType, "privateWithin must be a type symbol or `Symbol.noSymbol`")
25982601
val privateWithin1 = if privateWithin.isTerm then Symbol.noSymbol else privateWithin
@@ -2807,7 +2810,11 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
28072810

28082811
def asQuotes: Nested =
28092812
assert(self.ownersIterator.contains(ctx.owner), s"$self is not owned by ${ctx.owner}")
2810-
new QuotesImpl(using ctx.withOwner(self))
2813+
val newCtx = if ctx.owner eq self then ctx else
2814+
val newCtx = ctx.fresh.setOwner(self)
2815+
if !self.flags.is(Flags.Method) then newCtx
2816+
else newCtx.setScope(newScopeWith(self.paramSymss.flatten*))
2817+
new QuotesImpl(using newCtx)
28112818

28122819
end extension
28132820

tests/run-macros/i22260.check

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
42
33
42
44
42
5+
42
56
42

tests/run-macros/i22260/Macros_1.scala

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
import scala.quoted.*
22

33
object Macros:
4+
inline def crMethod: Int = ${ createMethod }
45
inline def inMethod: Int = ${ insideMethod }
56
inline def usMethod: Int = ${ usingMethod }
67
inline def inObject: Int = ${ insideObject }
78
inline def inClass: Int = ${ insideClass }
89
inline def usClass: Int = ${ usingClass }
910

1011
def summon(using Quotes) =
11-
Expr.summon[Int].getOrElse('{ 0 })
12+
Expr.summon[Int].getOrElse('{0})
13+
14+
def createMethod(using Quotes): Expr[Int] =
15+
import quotes.reflect.*
16+
val tpe = MethodType(MethodTypeKind.Contextual)("x" :: Nil)(_ => TypeRepr.of[Int] :: Nil, _ => TypeRepr.of[Int])
17+
val sym = Symbol.newMethod(Symbol.spliceOwner, "foo", tpe)
18+
val method = DefDef(sym, _ => Some(summon(using sym.asQuotes).asTerm))
19+
Block(method :: Nil, Apply(Ref(sym), '{42}.asTerm :: Nil)).asExprOf[Int]
1220

1321
def insideMethod(using Quotes): Expr[Int] = '{
1422
def foo =

tests/run-macros/i22260/Test_2.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
@main def Test =
2+
println(Macros.crMethod)
23
println(Macros.inMethod)
34
println(Macros.usMethod)
45
println(Macros.inObject)

0 commit comments

Comments
 (0)