This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a commit to branch NLPCRAFT-500
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 2cb43ff69e4508c63ea086ff373b198506caa8e6
Author: Sergey Kamov <[email protected]>
AuthorDate: Wed Aug 24 12:17:19 2022 +0300

    IDL fragments related fixes.
---
 .../examples/pizzeria/PizzeriaModelSpec.scala      |  0
 .../pizzeria/cli/PizzeriaModelClientCli.scala      |  0
 .../pizzeria/cli/PizzeriaModelServer.scala         |  0
 .../nlpcraft/internal/impl/NCModelScanner.scala    | 37 ++++++++++++++++------
 4 files changed, 28 insertions(+), 9 deletions(-)

diff --git 
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
 
b/nlpcraft-examples/pizzeria/src/test/scala/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
similarity index 100%
rename from 
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
rename to 
nlpcraft-examples/pizzeria/src/test/scala/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
diff --git 
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelClientCli.scala
 
b/nlpcraft-examples/pizzeria/src/test/scala/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelClientCli.scala
similarity index 100%
rename from 
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelClientCli.scala
rename to 
nlpcraft-examples/pizzeria/src/test/scala/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelClientCli.scala
diff --git 
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
 
b/nlpcraft-examples/pizzeria/src/test/scala/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
similarity index 100%
rename from 
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
rename to 
nlpcraft-examples/pizzeria/src/test/scala/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala
index 5312b372..563045e2 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala
@@ -429,10 +429,31 @@ object NCModelScanner extends LazyLogging:
             if intentsMtds.contains(mtd) then E(s"The callback cannot have 
more one intent [$z, callback=${method2Str(mtd)}]")
             intentsMtds += mtd -> IntentHolder(cfg, intent, obj, mtd)
 
+        /**
+          *  It is done such way because intents can contain references to 
'fragments',
+          *  but annotations can be received via java reflection in inordered 
way.
+          */
+        def addIntent2Phases(anns: scala.Array[NCIntent], origin: String): 
Iterable[NCIDLIntent] =
+            val errAnns = mutable.ArrayBuffer.empty[NCIntent]
+            val intents = mutable.ArrayBuffer.empty[NCIDLIntent]
+
+            def addIntents(ann: NCIntent) = intents ++= 
NCIDLCompiler.compile(ann.value, cfg, origin)
+
+            // 1. First pass.
+            for (ann <- anns) try addIntents(ann)
+            catch case _: NCException => errAnns += ann
+
+            // 2. Second pass.
+            for (ann <- errAnns) addIntents(ann)
+
+            // Process all compiled intents.
+            for (intent <- intents) addDecl(intent)
+
+            intents
+
         def processClassAnnotations(cls: Class[_]): Unit =
             if cls != null && processed.add(cls) then
-                for (ann <- cls.getAnnotationsByType(CLS_INTENT); intent <- 
NCIDLCompiler.compile(ann.value, cfg, class2Str(cls)))
-                    addDecl(intent)
+                addIntent2Phases(cls.getAnnotationsByType(CLS_INTENT), 
class2Str(cls))
 
                 processClassAnnotations(cls.getSuperclass)
                 cls.getInterfaces.foreach(processClassAnnotations)
@@ -446,13 +467,11 @@ object NCModelScanner extends LazyLogging:
             val methods = getAllMethods(obj)
 
             // // Collects intents for each method.
-            for (
-                mtd <- methods;
-                ann <- mtd.getAnnotationsByType(CLS_INTENT);
-                intent <- NCIDLCompiler.compile(ann.value, cfg, 
method2Str(mtd))
-            )
-                addDecl(intent)
-                addIntent(intent, mtd, obj)
+            for (mtd <- methods)
+                val anns = mtd.getAnnotationsByType(CLS_INTENT)
+                val intents = addIntent2Phases(anns, method2Str(mtd))
+
+                for (intent <- intents) addIntent(intent, mtd, obj)
 
             // Scans annotated fields.
             for (f <- getAllFields(obj) if 
f.isAnnotationPresent(CLS_INTENT_OBJ)) scan(getFieldObject(cfg, f, obj))

Reply via email to