@@ -11,9 +11,8 @@ object Macros {
11
11
val annotatedMethodsWithMainAnnotations = allMethods.flatMap { methodSymbol =>
12
12
methodSymbol.getAnnotation(mainAnnotation).map(methodSymbol -> _)
13
13
}.sortBy(_._1.pos.map(_.start))
14
- val mainDatas = Expr .ofList(annotatedMethodsWithMainAnnotations.map {
15
- (annotatedMethod, mainAnnotationInstance) =>
16
- createMainData[Any , B ](annotatedMethod, mainAnnotationInstance)
14
+ val mainDatas = Expr .ofList(annotatedMethodsWithMainAnnotations.map { (annotatedMethod, mainAnnotationInstance) =>
15
+ createMainData[Any , B ](annotatedMethod, mainAnnotationInstance)
17
16
})
18
17
19
18
' {
@@ -27,7 +26,7 @@ object Macros {
27
26
import quotes .reflect ._
28
27
val typeReprOfB = TypeRepr .of[B ]
29
28
val companionModule = typeReprOfB match {
30
- case TypeRef (a, b) => TermRef (a, b)
29
+ case TypeRef (a,b) => TermRef (a,b)
31
30
}
32
31
val typeSymbolOfB = typeReprOfB.typeSymbol
33
32
val companionModuleType = typeSymbolOfB.companionModule.tree.asInstanceOf [ValDef ].tpt.tpe.asType
@@ -52,36 +51,31 @@ object Macros {
52
51
' { new ParserForClass [B ]($ { mainData }, () => $ { Ident (companionModule).asExpr }) }
53
52
}
54
53
55
- def createMainData [T : Type , B : Type ](using
56
- Quotes
57
- )( method : quotes.reflect. Symbol , mainAnnotation : quotes.reflect.Term ): Expr [MainData [T , B ]] = {
54
+ def createMainData [T : Type , B : Type ](using Quotes )
55
+ ( method : quotes.reflect. Symbol ,
56
+ mainAnnotation : quotes.reflect.Term ): Expr [MainData [T , B ]] = {
58
57
createMainData[T , B ](method, mainAnnotation, method.paramSymss)
59
58
}
60
59
61
- def createMainData [T : Type , B : Type ](using Quotes )(
62
- method : quotes.reflect.Symbol ,
63
- mainAnnotation : quotes.reflect.Term ,
64
- annotatedParamsLists : List [List [quotes.reflect.Symbol ]]
65
- ): Expr [MainData [T , B ]] = {
60
+ def createMainData [T : Type , B : Type ](using Quotes )
61
+ (method : quotes.reflect.Symbol ,
62
+ mainAnnotation : quotes.reflect.Term ,
63
+ annotatedParamsLists : List [List [quotes.reflect.Symbol ]]): Expr [MainData [T , B ]] = {
66
64
67
65
import quotes .reflect .*
68
- val params = method.paramSymss.headOption.getOrElse(
69
- report.throwError(" Multiple parameter lists not supported" )
70
- )
66
+ val params = method.paramSymss.headOption.getOrElse(report.throwError(" Multiple parameter lists not supported" ))
71
67
val defaultParams = getDefaultParams(method)
72
68
val argSigsExprs = params.zip(annotatedParamsLists.flatten).map { paramAndAnnotParam =>
73
69
val param = paramAndAnnotParam._1
74
70
val annotParam = paramAndAnnotParam._2
75
71
val paramTree = param.tree.asInstanceOf [ValDef ]
76
72
val paramTpe = paramTree.tpt.tpe
77
- val arg = annotParam.getAnnotation(argAnnotation).map(_.asExprOf[mainargs.arg]).getOrElse(' {
78
- new mainargs.arg()
79
- })
73
+ val arg = annotParam.getAnnotation(argAnnotation).map(_.asExprOf[mainargs.arg]).getOrElse(' { new mainargs.arg() })
80
74
val paramType = paramTpe.asType
81
75
paramType match
82
76
case ' [t] =>
83
77
val defaultParam : Expr [Option [B => t]] = defaultParams.get(param) match {
84
- case Some (' { $v : `t` }) => ' { Some (((_ : B ) => $v)) }
78
+ case Some (' { $v : `t`}) => ' { Some (((_ : B ) => $v)) }
85
79
case None => ' { None }
86
80
}
87
81
val tokensReader = Expr .summon[mainargs.TokensReader [t]].getOrElse {
@@ -90,10 +84,7 @@ object Macros {
90
84
param.pos.get
91
85
)
92
86
}
93
- ' {
94
- (ArgSig .create[t, B ]($ { Expr (param.name) }, $ { arg }, $ { defaultParam })(using
95
- $ { tokensReader }))
96
- }
87
+ ' { (ArgSig .create[t, B ]($ { Expr (param.name) }, $ { arg }, $ { defaultParam })(using $ { tokensReader })) }
97
88
}
98
89
val argSigs = Expr .ofList(argSigsExprs)
99
90
@@ -104,35 +95,28 @@ object Macros {
104
95
105
96
' { (b : B , params : Seq [Any ]) => $ { callOf(' b , ' params ) } }
106
97
}
107
- ' {
108
- MainData .create[T , B ](
109
- $ { Expr (method.name) },
110
- $ { mainAnnotation.asExprOf[mainargs.main] },
111
- $argSigs,
112
- $invokeRaw
113
- )
114
- }
98
+ ' { MainData .create[T , B ]($ { Expr (method.name) }, $ { mainAnnotation.asExprOf[mainargs.main] }, $ { argSigs }, $ { invokeRaw }) }
115
99
}
116
100
117
- /**
118
- * Call a method given by its symbol.
119
- *
120
- * E.g.
121
- *
122
- * assuming:
123
- *
124
- * def foo(x: Int, y: String)(z: Int)
125
- *
126
- * val argss: List[List[Any]] = ???
127
- *
128
- * then:
129
- *
130
- * call(<symbol of foo>, '{argss})
131
- *
132
- * will expand to:
133
- *
134
- * foo(argss(0)(0), argss(0)(1))(argss(1)(0))
135
- */
101
+ /** Call a method given by its symbol.
102
+ *
103
+ * E.g.
104
+ *
105
+ * assuming:
106
+ *
107
+ * def foo(x: Int, y: String)(z: Int)
108
+ *
109
+ * val argss: List[List[Any]] = ???
110
+ *
111
+ * then:
112
+ *
113
+ * call(<symbol of foo>, '{argss})
114
+ *
115
+ * will expand to:
116
+ *
117
+ * foo(argss(0)(0), argss(0)(1))(argss(1)(0))
118
+ *
119
+ */
136
120
private def call (using Quotes )(
137
121
methodOwner : Expr [Any ],
138
122
method : quotes.reflect.Symbol ,
@@ -151,17 +135,16 @@ object Macros {
151
135
for (j <- paramss(i).indices.toList) yield {
152
136
val tpe = paramss(i)(j).tree.asInstanceOf [ValDef ].tpt.tpe
153
137
tpe.asType match
154
- case ' [t] => ' { $argss($ { Expr (i) })($ { Expr (j) }).asInstanceOf [t] }.asTerm
138
+ case ' [t] => ' { $argss($ {Expr (i)})($ {Expr (j)}).asInstanceOf [t] }.asTerm
155
139
}
156
140
}
157
141
158
142
methodOwner.asTerm.select(method).appliedToArgss(accesses).asExpr
159
143
}
144
+
160
145
161
146
/** Lookup default values for a method's parameters. */
162
- private def getDefaultParams (using
163
- Quotes
164
- )(method : quotes.reflect.Symbol ): Map [quotes.reflect.Symbol , Expr [Any ]] = {
147
+ private def getDefaultParams (using Quotes )(method : quotes.reflect.Symbol ): Map [quotes.reflect.Symbol , Expr [Any ]] = {
165
148
// Copy pasted from Cask.
166
149
// https://github.com/com-lihaoyi/cask/blob/65b9c8e4fd528feb71575f6e5ef7b5e2e16abbd9/cask/src-3/cask/router/Macros.scala#L38
167
150
import quotes .reflect ._
@@ -174,7 +157,7 @@ object Macros {
174
157
175
158
val idents = method.owner.tree.asInstanceOf [ClassDef ].body
176
159
177
- idents.foreach {
160
+ idents.foreach{
178
161
case deff @ DefDef (Name (idx), _, _, _) =>
179
162
val expr = Ref (deff.symbol).asExpr
180
163
defaults += (params(idx.toInt - 1 ) -> expr)
0 commit comments