1
1
import Macro ._
2
+ import Macro2 ._
2
3
3
- object Test {
4
-
5
- // TODO should elems of `new Record` and `Record.fromUntypedTuple` be IArray[Object]
6
- // This would make it possible to keep the same reference to the elements when transforming a Tuple into a Record (or vice versa)
7
-
8
- case class Record (elems : (String , Any )* ) extends SelectableRecord {
9
- def selectDynamic (name : String ): Any = elems.find(_._1 == name).get._2
10
- override def toString (): String = elems.map(x => x._1 + " =" + x._2).mkString(" Record(" , " , " , " )" )
11
- }
4
+ import scala .compiletime .testing ._
12
5
13
- object Record extends SelectableRecordCompanion [Record ] {
14
- def fromUntypedTuple (elems : (String , Any )* ): Record = Record (elems : _* )
15
- }
6
+ object Test {
16
7
17
8
type Person = Record {
18
9
val name : String
@@ -22,7 +13,7 @@ object Test {
22
13
type Person2 = Person
23
14
24
15
def main (args : Array [String ]): Unit = {
25
- val person : Person = Record (" name" -> " Emma" , " age" -> 42 ). asInstanceOf [ Person ]
16
+ val person : Person = Record [ Person ] (" name" -> " Emma" , " age" -> 42 )
26
17
27
18
val res = person.toTuple
28
19
@@ -49,16 +40,11 @@ object Test {
49
40
val emptyTuple = ()
50
41
println(Record .fromTuple(emptyTuple))
51
42
52
- // println(Record.fromTuple((1, 2))) // error
53
-
54
43
val xxl : ((" field1" , Int ),(" field2" , Int ),(" field3" , Int ),(" field4" , Int ),(" field5" , Int ),(" field6" , Int ),(" field7" , Int ),(" field8" , Int ),(" field9" , Int ),(" field10" , Int ),(" field11" , Int ),(" field12" , Int ),(" field13" , Int ),(" field14" , Int ),(" field15" , Int ),(" field16" , Int ),(" field17" , Int ),(" field18" , Int ),(" field19" , Int ),(" field20" , Int ),(" field21" , Int ),(" field22" , Int ),(" field23" , Int ),(" field24" , Int ),(" field25" , Int )) = (" field1" -> 1 ," field2" -> 2 ," field3" -> 3 ," field4" -> 4 ," field5" -> 5 ," field6" -> 6 ," field7" -> 7 ," field8" -> 8 ," field9" -> 9 ," field10" -> 10 ," field11" -> 11 ," field12" -> 12 ," field13" -> 13 ," field14" -> 14 ," field15" -> 15 ," field16" -> 16 ," field17" -> 17 ," field18" -> 18 ," field19" -> 19 ," field20" -> 20 ," field21" -> 21 ," field22" -> 22 ," field23" -> 23 ," field24" -> 24 ," field25" -> 25 )
55
44
println(Record .fromTuple(xxl))
56
- // println(Record.fromTuple(("field1" -> 1,"field2" -> 2,"field3" -> 3,"field4" -> 4,"field5" -> 5,"field6" -> 6,"field7" -> 7,"field8" -> 8,"field9" -> 9,"field10" -> 10,"field11" -> 11,"field12" -> 12,"field13" -> 13,"field14" -> 14,"field15" -> 15,"field16" -> 16,"field17" -> 17,"field18" -> 18,"field19" -> 19,"field20" -> 20,"field21" -> 21,"field22" -> 22,"field23" -> 23,"field24" -> 24,"field25" -> 25)))
57
45
58
46
println(res2)
59
47
60
- // Record.fromTuple[(("name", String), ("name", Int))]("name" -> "aa", "name" -> 3) // error
61
-
62
48
res2 : Record {
63
49
val name : String
64
50
val age : Int
@@ -72,5 +58,14 @@ object Test {
72
58
val p3 : Person2 = person
73
59
74
60
p3.toTuple : ((" name" , String ), (" age" , Int ))
61
+
62
+ // Neg-tests
63
+ println(typeCheckErrors(" Record.fromTuple((1, 2))" ).head)
64
+
65
+ println(typeCheckErrors(" Record.fromTuple((\" field1\" -> 1,\" field2\" -> 2,\" field3\" -> 3,\" field4\" -> 4,\" field5\" -> 5,\" field6\" -> 6,\" field7\" -> 7,\" field8\" -> 8,\" field9\" -> 9,\" field10\" -> 10,\" field11\" -> 11,\" field12\" -> 12,\" field13\" -> 13,\" field14\" -> 14,\" field15\" -> 15,\" field16\" -> 16,\" field17\" -> 17,\" field18\" -> 18,\" field19\" -> 19,\" field20\" -> 20,\" field21\" -> 21,\" field22\" -> 22,\" field23\" -> 23,\" field24\" -> 24,\" field25\" -> 25))" ).head)
66
+
67
+ typeCheckErrors(" Record.fromTuple[((\" name\" , String), (\" name\" , Int))](\" name\" -> \" aa\" , \" name\" -> 3)" ).foreach(println)
68
+
69
+
75
70
}
76
71
}
0 commit comments