changeset 17343:da1f5b9ccac6

Support private constructors on nodes.
author Roland Schatz <roland.schatz@oracle.com>
date Mon, 06 Oct 2014 10:40:55 +0200
parents a690ca62772c
children 98e60bdf6d05
files graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java
diffstat 1 files changed, 9 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java	Mon Oct 06 09:46:27 2014 +0200
+++ b/graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java	Mon Oct 06 10:40:55 2014 +0200
@@ -311,20 +311,28 @@
         genClass = new CodeTypeElement(modifiers(FINAL), ElementKind.CLASS, packageElement, genClassName);
         genClass.setSuperClass(node.asType());
 
+        boolean foundValidConstructor = false;
         for (ExecutableElement constructor : ElementFilter.constructorsIn(node.getEnclosedElements())) {
-            if (constructor.getModifiers().contains(PUBLIC)) {
+            if (constructor.getModifiers().contains(PRIVATE)) {
+                continue;
+            } else if (constructor.getModifiers().contains(PUBLIC)) {
                 throw new ElementException(constructor, "Node class constructor must not be public");
             } else if (!constructor.getModifiers().contains(PROTECTED)) {
                 throw new ElementException(constructor, "Node class constructor must be protected");
             }
 
             checkFactoryMethodExists(node, constructor);
+            foundValidConstructor = true;
 
             CodeExecutableElement subConstructor = createConstructor(genClass, constructor);
             subConstructor.getModifiers().removeAll(Arrays.asList(PUBLIC, PRIVATE, PROTECTED));
             genClass.add(subConstructor);
         }
 
+        if (!foundValidConstructor) {
+            throw new ElementException(node, "Node class must have at least one protected constructor");
+        }
+
         if (!constructorsOnly) {
             DeclaredType generatedNode = (DeclaredType) getType(GeneratedNode.class);
             genClass.getImplements().add(generatedNode);