From 11e8b42b682f56155da5268a3f9b87605ebded85 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Sun, 20 Feb 2022 17:54:19 +0100
Subject: [PATCH] recognize classes with method `init$children()` as AST
 classes

---
 dumpAst/src/main/jastadd/GenerationBackend.jadd   | 15 +++++++--------
 testDumper/src/main/jastadd/testDumper.relast     |  5 +++--
 .../inf/st/jastadd/testDumper/TestSimple.java     | 11 +++++++++++
 3 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/dumpAst/src/main/jastadd/GenerationBackend.jadd b/dumpAst/src/main/jastadd/GenerationBackend.jadd
index 06be208..ce550ca 100644
--- a/dumpAst/src/main/jastadd/GenerationBackend.jadd
+++ b/dumpAst/src/main/jastadd/GenerationBackend.jadd
@@ -413,12 +413,9 @@ aspect GenerationBackend {
   // --- isAstNode ---
   syn boolean DumpNode.isAstNode() {
     Class<?> clazz = getObject().getClass();
-    for (java.lang.reflect.Constructor<?> constructor : clazz.getConstructors()) {
-      for (java.lang.annotation.Annotation annotation : constructor.getAnnotations()) {
-        if (annotation.annotationType().getCanonicalName().startsWith(astNodeAnnotationPrefix()) &&
-              annotation.annotationType().getSimpleName().equals("Constructor")) {
-          return true;
-        }
+    for (java.lang.reflect.Method method : clazz.getMethods()) {
+      if ("init$Children".equals(method.getName()) && method.getParameterCount() == 0) {
+        return true;
       }
     }
     return false;
@@ -554,9 +551,11 @@ aspect GenerationBackend {
     }
 
     @Override
-    public void flush() {}
+    public void flush() {
+    }
 
     @Override
-    public void close() {}
+    public void close() {
+    }
   }
 }
diff --git a/testDumper/src/main/jastadd/testDumper.relast b/testDumper/src/main/jastadd/testDumper.relast
index cd7321f..7b66cc9 100644
--- a/testDumper/src/main/jastadd/testDumper.relast
+++ b/testDumper/src/main/jastadd/testDumper.relast
@@ -1,10 +1,11 @@
 // testcases with global inclusion/exclusion
 Nameable ::= <Name> ;
-Root : Nameable ::= A B* [C] ;
-A : Nameable ::= B MyC:C ;
+Root : Nameable ::= A B* [C];
+A : Nameable ::= B MyC:C D;
 B : Nameable ::= <OtherValue> ;
 C : Nameable ::= [A] <Unwanted:int> <RawReference:A> /Calculated:A/ /AlsoCalculated:B*/ ;
 SubC : C ::= <RawReference:A> <Unwanted:int> [A] /Calculated:A/ /AlsoCalculated:B*/ ;
+D;
 
 rel B.oneA -> A ;
 rel B.maybeC? -> C ;
diff --git a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestSimple.java b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestSimple.java
index f474274..507250f 100644
--- a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestSimple.java
+++ b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestSimple.java
@@ -2,15 +2,18 @@ package de.tudresden.inf.st.jastadd.testDumper;
 
 import de.tudresden.inf.st.jastadd.dumpAst.ast.DumpNode;
 import org.jastadd.testDumper.ast.C;
+import org.jastadd.testDumper.ast.D;
 import org.jastadd.testDumper.ast.Root;
 import org.jastadd.testDumper.ast.SubC;
 import org.junit.jupiter.api.Test;
 
 import java.util.List;
+import java.util.Optional;
 
 import static de.tudresden.inf.st.jastadd.testDumper.TestUtils.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestSimple {
 
@@ -26,6 +29,14 @@ public class TestSimple {
     assertEquals(0, actualRoot.getNumDumpRelation());
   }
 
+  @Test void testChildlessNonterminal() {
+    Root root = createRoot(createA(A_NAME, a -> a.setD(new D())), null);
+    List<DumpNode> nodes = TestUtils.dumpModel(root);
+    Optional<DumpNode> optionalCDumpNode = nodes.stream().filter(n -> n.getObject() instanceof D).findFirst();
+    assertTrue(optionalCDumpNode.isPresent());
+    assertTrue(optionalCDumpNode.get().isAstNode());
+  }
+
   @Test
   public void testOneNormalChild() {
     Root root = createRoot(createA(A_NAME), null);
-- 
GitLab