Skip to content

Commit a13f336

Browse files
committed
capture value class
1 parent 713a991 commit a13f336

File tree

3 files changed

+31
-27
lines changed

3 files changed

+31
-27
lines changed

src/main/scala/ch/epfl/scala/decoder/BinaryDecoder.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,15 @@ class BinaryDecoder(using Context, ThrowOrWarn):
141141
Seq(DecodedField.SerialVersionUID(decodedClass, defn.LongType))
142142
case Patterns.LazyValBitmap(name) =>
143143
Seq(DecodedField.LazyValBitmap(decodedClass, defn.BooleanType, name))
144+
case Patterns.AnyValCapture() =>
145+
for
146+
classSym <- decodedClass.symbolOpt.toSeq
147+
outerClass <- classSym.outerClass.toSeq
148+
if outerClass.isSubClass(defn.AnyValClass)
149+
sym <- outerClass.declarations.collect {
150+
case sym: TermSymbol if sym.isVal && !sym.isMethod => sym
151+
}
152+
yield DecodedField.Capture(decodedClass, sym)
144153
case Patterns.Capture(names) =>
145154
decodedClass.symbolOpt.toSeq
146155
.flatMap(CaptureCollector.collectCaptures)

src/main/scala/ch/epfl/scala/decoder/internal/Patterns.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ object Patterns:
140140

141141
def unapply(name: String): Option[String] =
142142
"""(.*)\$lzy\d+""".r.unapplySeq(name).map(xs => xs(0).stripSuffix("$"))
143-
144143

145144
object Module:
146145
def unapply(field: binary.Field): Boolean = field.name == "MODULE$"
@@ -155,6 +154,10 @@ object Patterns:
155154
object SerialVersionUID:
156155
def unapply(field: binary.Field): Boolean = field.name == "serialVersionUID"
157156

157+
object AnyValCapture:
158+
def unapply(field: binary.Field): Boolean =
159+
field.name.matches("\\$this\\$\\d+")
160+
158161
object Capture:
159162
def unapply(field: binary.Field): Option[Seq[String]] =
160163
field.extractFromDecodedNames("(.+)\\$\\d+".r)(xs => xs(0))

src/test/scala/ch/epfl/scala/decoder/BinaryDecoderTests.scala

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,19 @@ abstract class BinaryDecoderTests(scalaVersion: ScalaVersion) extends BinaryDeco
1212
def isScala33 = scalaVersion.isScala33
1313
def isScala34 = scalaVersion.isScala34
1414

15+
test("capture value class") {
16+
val source =
17+
"""|package example
18+
|
19+
|class A(val x: Int) extends AnyVal:
20+
| def foo =
21+
| class B:
22+
| def bar = x
23+
|""".stripMargin
24+
val decoder = TestingDecoder(source, scalaVersion)
25+
decoder.assertDecodeField("example.A$B$1", "int $this$1", "A.foo.B.x.<capture>: Int", generated = true)
26+
}
27+
1528
test("capture inline method") {
1629
val source =
1730
"""|package example
@@ -27,7 +40,6 @@ abstract class BinaryDecoderTests(scalaVersion: ScalaVersion) extends BinaryDeco
2740
| }
2841
|""".stripMargin
2942
val decoder = TestingDecoder(source, scalaVersion)
30-
decoder.showFields("example.A$B$1")
3143
decoder.assertNotFoundField("example.A$B$1", "example.C x$1$1")
3244
}
3345

@@ -39,7 +51,6 @@ abstract class BinaryDecoderTests(scalaVersion: ScalaVersion) extends BinaryDeco
3951
| lazy val (a, b) = (1, 2)
4052
|""".stripMargin
4153
val decoder = TestingDecoder(source, scalaVersion)
42-
// decoder.showFields("example.A$$anon$2")
4354
decoder.assertDecodeField("example.A", "java.lang.Object $1$$lzy1", "A.<anon>: (Int, Int)")
4455
}
4556

@@ -63,7 +74,7 @@ abstract class BinaryDecoderTests(scalaVersion: ScalaVersion) extends BinaryDeco
6374
}
6475

6576
test("lazy ref") {
66-
val source2 =
77+
val source =
6778
"""|package example
6879
|trait C
6980
|
@@ -74,26 +85,13 @@ abstract class BinaryDecoderTests(scalaVersion: ScalaVersion) extends BinaryDeco
7485
| def ct = c
7586
|}
7687
|""".stripMargin
77-
val source =
78-
"""|package example
79-
|trait C
80-
|
81-
|class A {
82-
| def foo =
83-
| given C: C = new C {}
84-
| class B:
85-
| def cc = summon[C]
86-
|}
87-
|""".stripMargin
88-
val decoder = TestingDecoder(source2, scalaVersion)
89-
decoder.showFields("example.A$B$1")
88+
val decoder = TestingDecoder(source, scalaVersion)
9089
decoder.assertDecodeField(
9190
"example.A$B$1",
9291
"scala.runtime.LazyRef c$lzy1$3",
9392
"A.foo.B.c.<capture>: C",
9493
generated = true
9594
)
96-
9795
}
9896

9997
test("ambiguous indirect captures") {
@@ -113,7 +111,6 @@ abstract class BinaryDecoderTests(scalaVersion: ScalaVersion) extends BinaryDeco
113111
|
114112
|""".stripMargin
115113
val decoder = TestingDecoder(source, scalaVersion)
116-
// decoder.showFields("example.A$B$1")
117114
decoder.assertAmbiguousField("example.A$B$1", "int x$3")
118115
decoder.assertAmbiguousField("example.A$B$1", "int x$4")
119116
}
@@ -131,7 +128,6 @@ abstract class BinaryDecoderTests(scalaVersion: ScalaVersion) extends BinaryDeco
131128
|
132129
|""".stripMargin
133130
val decoder = TestingDecoder(source, scalaVersion)
134-
// decoder.showFields("example.A$B$1")
135131
decoder.assertDecodeField("example.A$B$1", "int x$2", "A.foo.B.x.<capture>: Int", generated = true)
136132
}
137133

@@ -141,13 +137,12 @@ abstract class BinaryDecoderTests(scalaVersion: ScalaVersion) extends BinaryDeco
141137
|
142138
|trait C
143139
|
144-
|class A:
145-
| private class B (using C):
146-
| def foo = summon[C]
140+
|class B (using C):
141+
| def foo = summon[C]
147142
|
148143
|""".stripMargin
149144
val decoder = TestingDecoder(source, scalaVersion)
150-
decoder.assertDecodeField("example.A$B", "example.C x$1", "A.B.x$1: C")
145+
decoder.assertDecodeField("example.B", "example.C x$1", "B.x$1: C")
151146

152147
}
153148

@@ -389,9 +384,6 @@ abstract class BinaryDecoderTests(scalaVersion: ScalaVersion) extends BinaryDeco
389384
decoder.assertDecodeField("example.B$Y$Z", "example.B$Y $outer", "B.Y.Z.<outer>: Y", generated = true)
390385
}
391386

392-
abstract class Others(scalaVersion: ScalaVersion) extends BinaryDecoderSuite:
393-
def isScala33 = scalaVersion.isScala33
394-
def isScala34 = scalaVersion.isScala34
395387
test("mixin and static forwarders") {
396388
val source =
397389
"""|package example

0 commit comments

Comments
 (0)