@@ -17,6 +17,8 @@ import dotty.tools.dotc.transform.MegaPhase.MiniPhase
1717import dotty .tools .dotc .transform .ValueClasses
1818
1919private class ResolveReflectEval (config : ExpressionCompilerConfig , expressionStore : ExpressionStore ) extends MiniPhase :
20+ private val reflectEvalName = termName(" reflectEval" )
21+ private val elemName = termName(" elem" )
2022 override def phaseName : String = ResolveReflectEval .name
2123
2224 override def transformTypeDef (tree : TypeDef )(using Context ): Tree =
@@ -29,7 +31,7 @@ private class ResolveReflectEval(config: ExpressionCompilerConfig, expressionSto
2931 // unbox the result of the `evaluate` method if it is a value class
3032 val gen = new Gen (
3133 Apply (
32- Select (This (config.expressionClass), termName( " reflectEval " ) ),
34+ Select (This (config.expressionClass), reflectEvalName ),
3335 List (nullLiteral, nullLiteral, nullLiteral)
3436 )
3537 )
@@ -44,25 +46,28 @@ private class ResolveReflectEval(config: ExpressionCompilerConfig, expressionSto
4446 case ReflectEvalStrategy .This (cls) => gen.getThisObject
4547 case ReflectEvalStrategy .LocalOuter (cls) => gen.getLocalValue(" $outer" )
4648 case ReflectEvalStrategy .Outer (outerCls) => gen.getOuter(qualifier, outerCls)
49+
4750 case ReflectEvalStrategy .LocalValue (variable, isByName) =>
4851 val variableName = JavaEncoding .encode(variable.name)
4952 val rawLocalValue = gen.getLocalValue(variableName)
5053 val localValue = if isByName then gen.evaluateByName(rawLocalValue) else rawLocalValue
5154 val derefLocalValue = gen.derefCapturedVar(localValue, variable)
5255 gen.boxIfValueClass(variable, derefLocalValue)
56+
5357 case ReflectEvalStrategy .LocalValueAssign (variable) =>
5458 val value = gen.unboxIfValueClass(variable, args.head)
5559 val typeSymbol = variable.info.typeSymbol.asType
5660 val variableName = JavaEncoding .encode(variable.name)
5761 JavaEncoding .encode(typeSymbol) match
5862 case s " scala.runtime. ${_}Ref " =>
59- val elemField = typeSymbol.info.decl(termName( " elem " ) ).symbol
63+ val elemField = typeSymbol.info.decl(elemName ).symbol
6064 gen.setField(tree)(
6165 gen.getLocalValue(variableName),
6266 elemField.asTerm,
6367 value
6468 )
6569 case _ => gen.setLocalValue(variableName, value)
70+
6671 case ReflectEvalStrategy .ClassCapture (variable, cls, isByName) =>
6772 val rawCapture = gen
6873 .getClassCapture(tree)(qualifier, variable.name, cls)
@@ -73,6 +78,7 @@ private class ResolveReflectEval(config: ExpressionCompilerConfig, expressionSto
7378 val capture = if isByName then gen.evaluateByName(rawCapture) else rawCapture
7479 val capturedValue = gen.derefCapturedVar(capture, variable)
7580 gen.boxIfValueClass(variable, capturedValue)
81+
7682 case ReflectEvalStrategy .ClassCaptureAssign (variable, cls) =>
7783 val capture = gen
7884 .getClassCapture(tree)(qualifier, variable.name, cls)
@@ -82,8 +88,9 @@ private class ResolveReflectEval(config: ExpressionCompilerConfig, expressionSto
8288 }
8389 val value = gen.unboxIfValueClass(variable, args.head)
8490 val typeSymbol = variable.info.typeSymbol
85- val elemField = typeSymbol.info.decl(termName( " elem " ) ).symbol
91+ val elemField = typeSymbol.info.decl(elemName ).symbol
8692 gen.setField(tree)(capture, elemField.asTerm, value)
93+
8794 case ReflectEvalStrategy .MethodCapture (variable, method, isByName) =>
8895 val rawCapture = gen
8996 .getMethodCapture(method, variable.name)
@@ -94,6 +101,7 @@ private class ResolveReflectEval(config: ExpressionCompilerConfig, expressionSto
94101 val capture = if isByName then gen.evaluateByName(rawCapture) else rawCapture
95102 val capturedValue = gen.derefCapturedVar(capture, variable)
96103 gen.boxIfValueClass(variable, capturedValue)
104+
97105 case ReflectEvalStrategy .MethodCaptureAssign (variable, method) =>
98106 val capture = gen
99107 .getMethodCapture(method, variable.name)
@@ -103,9 +111,11 @@ private class ResolveReflectEval(config: ExpressionCompilerConfig, expressionSto
103111 }
104112 val value = gen.unboxIfValueClass(variable, args.head)
105113 val typeSymbol = variable.info.typeSymbol
106- val elemField = typeSymbol.info.decl(termName( " elem " ) ).symbol
114+ val elemField = typeSymbol.info.decl(elemName ).symbol
107115 gen.setField(tree)(capture, elemField.asTerm, value)
116+
108117 case ReflectEvalStrategy .StaticObject (obj) => gen.getStaticObject(obj)
118+
109119 case ReflectEvalStrategy .Field (field, isByName) =>
110120 // if the field is lazy, if it is private in a value class or a trait
111121 // then we must call the getter method
@@ -116,17 +126,19 @@ private class ResolveReflectEval(config: ExpressionCompilerConfig, expressionSto
116126 val rawValue = gen.getField(tree)(qualifier, field)
117127 if isByName then gen.evaluateByName(rawValue) else rawValue
118128 gen.boxIfValueClass(field, fieldValue)
129+
119130 case ReflectEvalStrategy .FieldAssign (field) =>
120131 val arg = gen.unboxIfValueClass(field, args.head)
121132 if field.owner.is(Trait ) then
122133 gen.callMethod(tree)(qualifier, field.setter.asTerm, List (arg))
123134 else gen.setField(tree)(qualifier, field, arg)
135+
124136 case ReflectEvalStrategy .MethodCall (method) => gen.callMethod(tree)(qualifier, method, args)
125- case ReflectEvalStrategy .ConstructorCall (ctr , cls) => gen.callConstructor(tree)(qualifier, ctr , args)
137+ case ReflectEvalStrategy .ConstructorCall (ctor , cls) => gen.callConstructor(tree)(qualifier, ctor , args)
126138 case _ => super .transform(tree)
127139
128140 private def isReflectEval (symbol : Symbol )(using Context ): Boolean =
129- symbol.name == termName( " reflectEval " ) && symbol.owner == config.expressionClass
141+ symbol.name == reflectEvalName && symbol.owner == config.expressionClass
130142
131143 class Gen (reflectEval : Apply )(using Context ):
132144 private val expressionThis = reflectEval.fun.asInstanceOf [Select ].qualifier
@@ -135,7 +147,7 @@ private class ResolveReflectEval(config: ExpressionCompilerConfig, expressionSto
135147 val typeSymbol = term.info.typeSymbol.asType
136148 JavaEncoding .encode(typeSymbol) match
137149 case s " scala.runtime. ${_}Ref " =>
138- val elemField = typeSymbol.info.decl(termName( " elem " ) ).symbol
150+ val elemField = typeSymbol.info.decl(elemName ).symbol
139151 getField(tree)(tree, elemField.asTerm)
140152 case _ => tree
141153
@@ -166,7 +178,7 @@ private class ResolveReflectEval(config: ExpressionCompilerConfig, expressionSto
166178 callMethod(tree)(tree, unboxMethod, Nil )
167179
168180 def getThisObject : Tree =
169- Apply (Select (expressionThis, termName(" getThisObject" )), List .empty )
181+ Apply (Select (expressionThis, termName(" getThisObject" )), Nil )
170182
171183 def getLocalValue (name : String ): Tree =
172184 Apply (
@@ -284,27 +296,27 @@ private class ResolveReflectEval(config: ExpressionCompilerConfig, expressionSto
284296 case _ => result
285297 end callMethod
286298
287- def callConstructor (tree : Tree )(qualifier : Tree , ctr : TermSymbol , args : List [Tree ]): Tree =
288- val methodType = ctr .info.asInstanceOf [MethodType ]
299+ def callConstructor (tree : Tree )(qualifier : Tree , ctor : TermSymbol , args : List [Tree ]): Tree =
300+ val methodType = ctor .info.asInstanceOf [MethodType ]
289301 val paramTypesNames = methodType.paramInfos.map(JavaEncoding .encode)
290302 val clsName = JavaEncoding .encode(methodType.resType)
291303
292304 val capturedArgs =
293305 methodType.paramNames.dropRight(args.size).map {
294- case outer if outer.toString == " $outer " => qualifier
306+ case outer if outer == nme. OUTER => qualifier
295307 case name @ DerivedName (underlying, _) =>
296308 // if derived then probably a capture
297- capturedValue(tree : Tree )(ctr .owner, underlying)
309+ capturedValue(tree : Tree )(ctor .owner, underlying)
298310 .getOrElse {
299- report.error(s " Unknown captured variable $name in $ctr of ${ctr .owner}" , reflectEval.srcPos)
311+ report.error(s " Unknown captured variable $name in $ctor of ${ctor .owner}" , reflectEval.srcPos)
300312 ref(defn.Predef_undefined )
301313 }
302314 case name =>
303315 val paramName = JavaEncoding .encode(name)
304316 getLocalValue(paramName)
305317 }
306318
307- val erasedCtrInfo = atPhase(Phases .elimErasedValueTypePhase)(ctr .info)
319+ val erasedCtrInfo = atPhase(Phases .elimErasedValueTypePhase)(ctor .info)
308320 .asInstanceOf [MethodType ]
309321 val unboxedArgs = erasedCtrInfo.paramInfos.takeRight(args.size).zip(args).map {
310322 case (tpe : ErasedValueType , arg) => unboxValueClass(arg, tpe)
@@ -343,4 +355,4 @@ private class ResolveReflectEval(config: ExpressionCompilerConfig, expressionSto
343355 getClassCapture(tree : Tree )(qualifier, originalName, cls)
344356
345357private object ResolveReflectEval :
346- val name = " resolve-reflect-eval "
358+ val name = " resolvReflectEval "
0 commit comments