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))
