Skip to content

Commit da58cde

Browse files
committed
[base3;uri3] convert StringBuilder usage to fluent-style
from block-style Mostly to satisfy `-Wnonunit-statement`, added to scala 3.3 compiler options by sbt-tpolecat v0.5.1, but also because popping the return value and loading the variable is unnecessary work, and not doing this should be more efficient, or at least have a smaller code size
1 parent 041dd0e commit da58cde

File tree

2 files changed

+25
-29
lines changed

2 files changed

+25
-29
lines changed

Base/src/main/scala-3/typeclass/VersionSpecificRepeated.scala

+9-10
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,15 @@ trait VersionSpecificRepeated {
1717
object AccZero extends Acc
1818
final class AccOne(val elem: Expr[String]) extends Acc
1919
final class AccMany extends Acc {
20-
val builder: Builder[Expr[String], Expr[String]] = List.newBuilder.mapResult(stat =>
21-
val accumulator:Expr[StringBuilder] = '{new scala.collection.mutable.StringBuilder}
22-
import quotes.reflect.*
23-
val retval = ValDef.let(Symbol.spliceOwner, "builder$", accumulator.asTerm): accumulatorRef =>
24-
val accumulatorRefExpr = accumulatorRef.asExprOf[StringBuilder]
25-
Block(
26-
stat.map(addend => '{$accumulatorRefExpr.append($addend)}.asTerm),
27-
Apply(Select.unique(accumulatorRef, "result"), Nil),
28-
)
29-
retval.asExprOf[String]
20+
val builder: Builder[Expr[String], Expr[String]] = List.newBuilder.mapResult(parts =>
21+
'{
22+
${
23+
parts.foldLeft
24+
('{new scala.collection.mutable.StringBuilder})
25+
({(builder, part) => '{$builder.append($part)}})
26+
}
27+
.result
28+
}
3029
)
3130
}
3231

UriParser/src/main/scala-3/MacroImpl.scala

+16-19
Original file line numberDiff line numberDiff line change
@@ -135,38 +135,35 @@ object MacroImpl {
135135
val Arbitrary = (ofType[String] <|> uriChar.repeat(1).mapToExpr)
136136
.repeat()(using typeclass.Repeated.quotedConcatenateString)
137137
val Mapping = {
138-
class StringExpr private (val isEmpty: Boolean, private val direct: Option[Expr[String]], private val accStats: List[Expr[StringBuilder] => Expr[Unit]]) {
138+
class StringExpr private (val isEmpty: Boolean, private val direct: Option[Expr[String]], private val parts: List[Expr[StringBuilder] => Expr[StringBuilder]]) {
139139
def ++(other: StringExpr): StringExpr = {
140140
if (this.isEmpty) {
141141
other
142142
} else if (other.isEmpty) {
143143
this
144144
} else {
145-
new StringExpr(false, None, this.accStats ++: other.accStats)
145+
new StringExpr(false, None, this.parts ++: other.parts)
146146
}
147147
}
148148
def result: Expr[String] = {
149149
this.direct match {
150150
case Some(x) => x
151-
case None => {
152-
val accumulator:Expr[StringBuilder] = '{new scala.collection.mutable.StringBuilder}
153-
import quotes.reflect.*
154-
val retval = ValDef.let(Symbol.spliceOwner, "builder$", accumulator.asTerm): accumulatorRef =>
155-
val accumulatorRefExpr = accumulatorRef.asExprOf[StringBuilder]
156-
Block(
157-
accStats.map(accStat => accStat(accumulatorRefExpr).asTerm),
158-
Apply(Select.unique(accumulatorRef, "toString"), Nil),
159-
)
160-
retval.asExprOf[String]
151+
case None => '{
152+
${
153+
parts.foldLeft
154+
('{new scala.collection.mutable.StringBuilder})
155+
({(builder, part) => part(builder)})
156+
}
157+
.result
161158
}
162159
}
163160
}
164161
}
165162
object StringExpr {
166163
def empty: StringExpr = new StringExpr(true, Option(Expr("")), Nil)
167-
def single(direct: Expr[String]): StringExpr = new StringExpr(false, Some(direct), List(acc => '{$acc.append($direct); ()}))
168-
def single(direct: Expr[String], accStats: List[Expr[StringBuilder] => Expr[Unit]]): StringExpr = new StringExpr(false, Some(direct), accStats)
169-
def multiple(accStats: List[Expr[StringBuilder] => Expr[Unit]]): StringExpr = new StringExpr(false, None, accStats)
164+
def single(direct: Expr[String]): StringExpr = new StringExpr(false, Some(direct), List(acc => '{$acc.append($direct)}))
165+
def single(direct: Expr[String], accStats: List[Expr[StringBuilder] => Expr[StringBuilder]]): StringExpr = new StringExpr(false, Some(direct), accStats)
166+
def multiple(accStats: List[Expr[StringBuilder] => Expr[StringBuilder]]): StringExpr = new StringExpr(false, None, accStats)
170167
}
171168

172169
implicit def AndThenStringExpr: typeclass.Sequenced[StringExpr, StringExpr, StringExpr] = (a:StringExpr, b:StringExpr) => a ++ b
@@ -197,9 +194,9 @@ object MacroImpl {
197194
.map(x =>
198195
StringExpr.multiple(
199196
List(
200-
(sb: Expr[StringBuilder]) => '{ $sb.append($x._1); () },
201-
(sb: Expr[StringBuilder]) => '{ $sb.append("="); () },
202-
(sb: Expr[StringBuilder]) => '{ $sb.append($x._2); () },
197+
(sb: Expr[StringBuilder]) => '{ $sb.append($x._1) },
198+
(sb: Expr[StringBuilder]) => '{ $sb.append("=") },
199+
(sb: Expr[StringBuilder]) => '{ $sb.append($x._2) },
203200
)
204201
)
205202
)
@@ -209,7 +206,7 @@ object MacroImpl {
209206
val map:Interpolator[StringExpr] = ofType[scala.collection.Map[String, String]]
210207
.map(m => StringExpr.single(
211208
'{ $m.map($tupleConcatFun).mkString("&") },
212-
List((sb: Expr[StringBuilder]) => '{$m.map($tupleConcatFun).addString($sb, "&"); ()})
209+
List((sb: Expr[StringBuilder]) => '{$m.map($tupleConcatFun).addString($sb, "&")})
213210
))
214211

215212
val mapOrPair:Interpolator[StringExpr] = map <|> pair

0 commit comments

Comments
 (0)