Skip to content

Commit bca9e31

Browse files
committed
Minor changes in ResolveReflectEval
1 parent 5a2c54a commit bca9e31

File tree

1 file changed

+27
-15
lines changed

1 file changed

+27
-15
lines changed

compiler/src/dotty/tools/debug/ResolveReflectEval.scala

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import dotty.tools.dotc.transform.MegaPhase.MiniPhase
1717
import dotty.tools.dotc.transform.ValueClasses
1818

1919
private 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

345357
private object ResolveReflectEval:
346-
val name = "resolve-reflect-eval"
358+
val name = "resolvReflectEval"

0 commit comments

Comments
 (0)