You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pekko.apache.org by jr...@apache.org on 2022/11/03 11:23:35 UTC
[incubator-pekko-http] 05/47: parsing: port Akka HTTP version of DynamicRuleDispatchMacro
This is an automated email from the ASF dual-hosted git repository.
jrudolph pushed a commit to branch scala-3
in repository https://gitbox.apache.org/repos/asf/incubator-pekko-http.git
commit 1cf775772611f430bc96756d7eccd821399e83bc
Author: Johannes Rudolph <jo...@gmail.com>
AuthorDate: Thu Sep 9 12:14:09 2021 +0200
parsing: port Akka HTTP version of DynamicRuleDispatchMacro
---
.../akka/parboiled2/DynamicRuleDispatchMacro.scala | 42 +++++++++-------------
.../akka/parboiled2/DynamicRuleDispatch.scala | 2 +-
2 files changed, 18 insertions(+), 26 deletions(-)
diff --git a/akka-parsing/src/main/scala-3/akka/parboiled2/DynamicRuleDispatchMacro.scala b/akka-parsing/src/main/scala-3/akka/parboiled2/DynamicRuleDispatchMacro.scala
index 77a33bc85..89f686b76 100644
--- a/akka-parsing/src/main/scala-3/akka/parboiled2/DynamicRuleDispatchMacro.scala
+++ b/akka-parsing/src/main/scala-3/akka/parboiled2/DynamicRuleDispatchMacro.scala
@@ -37,40 +37,32 @@ trait DynamicRuleDispatchMacro { self: DynamicRuleDispatch.type =>
def __create[P <: Parser: Type, L <: HList: Type](
ruleNames: Expr[Seq[String]]
)(using Quotes): Expr[(DynamicRuleDispatch[P, L], immutable.Seq[String])] = {
+ import quotes.reflect._
+
val names: Seq[String] = ruleNames match {
case Varargs(Exprs(args)) => args.sorted
}
- def dispatcher(handler: Expr[DynamicRuleHandler[P, L]], ruleName: Expr[String]): Expr[Any] = {
- import quotes.reflect._
- def ruleExpr(name: String): Expr[RuleN[L]] = Select.unique('{ $handler.parser }.asTerm, name).asExprOf[RuleN[L]]
- def rec(start: Int, end: Int): Expr[Any] =
- if (start <= end) {
- val mid = (start + end) >>> 1
- val name = names(mid)
-
- '{
- val c = ${ Expr(name) } compare $ruleName
- if (c < 0) ${ rec(mid + 1, end) }
- else if (c > 0) ${ rec(start, mid - 1) }
- else {
- val p = $handler.parser
- p.__run[L](${ ruleExpr(name) })($handler)
- }
- }
- } else '{ $handler.ruleNotFound($ruleName) }
-
- rec(0, names.length - 1)
+ def ruleEntry(name: String): Expr[(String, RuleRunner[P, L])] = '{
+ val runner = new RuleRunner[P, L] {
+ def apply(handler: DynamicRuleHandler[P, L]): handler.Result = {
+ val p = handler.parser
+ p.__run[L](${Select.unique('{ handler.parser }.asTerm, name).asExprOf[RuleN[L]]})(handler)
+ }
+ }
+ (${Expr(name)}, runner)
}
+ val ruleEntries: Expr[Seq[(String, RuleRunner[P, L])]] = Expr.ofSeq(names.map(ruleEntry(_)))
'{
- val dispatch: DynamicRuleDispatch[P, L] =
- new DynamicRuleDispatch[P, L] {
- def apply(handler: DynamicRuleHandler[P, L], ruleName: String): handler.Result =
- ${ dispatcher('handler, 'ruleName).asInstanceOf[Expr[handler.Result]] }
+ val map: Map[String, RuleRunner[P, L]] = Map($ruleEntries*)
+ val drd =
+ new akka.parboiled2.DynamicRuleDispatch[P, L] {
+ def lookup(ruleName: String): Option[RuleRunner[P, L]] =
+ map.get(ruleName)
}
- (dispatch, $ruleNames)
+ (drd, $ruleNames)
}
}
}
diff --git a/akka-parsing/src/main/scala/akka/parboiled2/DynamicRuleDispatch.scala b/akka-parsing/src/main/scala/akka/parboiled2/DynamicRuleDispatch.scala
index 5cbdd29ca..77fc3e763 100644
--- a/akka-parsing/src/main/scala/akka/parboiled2/DynamicRuleDispatch.scala
+++ b/akka-parsing/src/main/scala/akka/parboiled2/DynamicRuleDispatch.scala
@@ -35,7 +35,7 @@ trait DynamicRuleHandler[P <: Parser, L <: HList] extends Parser.DeliveryScheme[
*/
trait DynamicRuleDispatch[P <: Parser, L <: HList] {
def apply(handler: DynamicRuleHandler[P, L], ruleName: String): handler.Result =
- lookup(ruleName).map(_(handler)).getOrElse(handler.ruleNotFound(ruleName))
+ lookup(ruleName).map(_(handler)).getOrElse(handler.ruleNotFound(ruleName)).asInstanceOf[handler.Result] // FIXME: something wrong with Scala 3 type inference
def lookup(ruleName: String): Option[RuleRunner[P, L]]
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pekko.apache.org
For additional commands, e-mail: commits-help@pekko.apache.org