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