Skip to content

Commit 4cdd19b

Browse files
authored
Support inline overrides in value classes (scala#16523)
Fixes scala#15725 Three fixes: - Don't make extension method copies of inline methods - Make retainedBody methods discoverable by entering them in their parent scope, so that they get an extension method - But strip the retainedBody in the extension method
2 parents d99d9bf + ac10053 commit 4cdd19b

File tree

5 files changed

+18
-5
lines changed

5 files changed

+18
-5
lines changed

compiler/src/dotty/tools/dotc/inlines/Inlines.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@ object Inlines:
229229

230230
val retainer = meth.copy(
231231
name = BodyRetainerName(meth.name),
232-
flags = meth.flags &~ (Inline | Macro | Override) | Private,
233-
coord = mdef.rhs.span.startPos).asTerm
232+
flags = (meth.flags &~ (Inline | Macro | Override | AbsOverride)) | Private,
233+
coord = mdef.rhs.span.startPos).asTerm.entered
234234
retainer.deriveTargetNameAnnotation(meth, name => BodyRetainerName(name.asTermName))
235235
DefDef(retainer, prefss =>
236236
inlineCall(

compiler/src/dotty/tools/dotc/transform/ExtensionMethods.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import core._
1313
import Types._, Contexts._, Names._, Flags._, DenotTransformers._, Phases._
1414
import SymDenotations._, Symbols._, StdNames._, Denotations._
1515
import TypeErasure.{ valueErasure, ErasedValueType }
16-
import NameKinds.ExtMethName
16+
import NameKinds.{ExtMethName, BodyRetainerName}
1717
import Decorators._
1818
import TypeUtils._
1919

@@ -79,7 +79,7 @@ class ExtensionMethods extends MiniPhase with DenotTransformer with FullParamete
7979
// because it adds extension methods before pickling.
8080
if (!(valueClass.is(Scala2x)))
8181
for (decl <- valueClass.classInfo.decls)
82-
if (isMethodWithExtension(decl))
82+
if isMethodWithExtension(decl) then
8383
enterInModuleClass(createExtensionMethod(decl, moduleClassSym.symbol))
8484

8585
// Create synthetic methods to cast values between the underlying type
@@ -179,7 +179,10 @@ object ExtensionMethods {
179179

180180
/** Name of the extension method that corresponds to given instance method `meth`. */
181181
def extensionName(imeth: Symbol)(using Context): TermName =
182-
ExtMethName(imeth.name.asTermName)
182+
ExtMethName(
183+
imeth.name.asTermName match
184+
case BodyRetainerName(name) => name
185+
case name => name)
183186

184187
/** Return the extension method that corresponds to given instance method `meth`. */
185188
def extensionMethod(imeth: Symbol)(using Context): TermSymbol =

compiler/src/dotty/tools/dotc/transform/ValueClasses.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ object ValueClasses {
2929
isDerivedValueClass(d.owner) &&
3030
!d.isConstructor &&
3131
!d.symbol.isSuperAccessor &&
32+
!d.isInlineMethod &&
3233
!d.is(Macro)
3334
}
3435

tests/run/i15725.check

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2 meters

tests/run/i15725.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class ToString(d: Int) extends AnyVal :
2+
inline override def toString():String = s"$d meters"
3+
4+
@main def Test =
5+
val ts = ToString(2)
6+
val a: Any = ts
7+
println(a)
8+

0 commit comments

Comments
 (0)