changeset 18780:f4d78e4a878d

Truffle-DSL: fixed create method should have the same visibility as its originating constructor. (GRAAL-365 #resolve)
author Christian Humer <christian.humer@gmail.com>
date Mon, 05 Jan 2015 20:23:22 +0100
parents 7ea9a39bd7cc
children 941761f6b736
files graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeFactoryFactory.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java
diffstat 3 files changed, 13 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java	Mon Jan 05 09:58:33 2015 -0800
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java	Mon Jan 05 20:23:22 2015 +0100
@@ -101,9 +101,8 @@
                     }
                 }
             }
-            Modifier templateVisibility = ElementUtils.getVisibility(node.getTemplateType().getModifiers());
-            new NodeFactoryFactory(context, node, second).createFactoryMethods(first, templateVisibility);
-            ElementUtils.setVisibility(first.getModifiers(), templateVisibility);
+            new NodeFactoryFactory(context, node, second).createFactoryMethods(first);
+            ElementUtils.setVisibility(first.getModifiers(), ElementUtils.getVisibility(node.getTemplateType().getModifiers()));
             for (ExecutableElement constructor : ElementFilter.constructorsIn(first.getEnclosedElements())) {
                 ElementUtils.setVisibility(((CodeExecutableElement) constructor).getModifiers(), Modifier.PRIVATE);
             }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeFactoryFactory.java	Mon Jan 05 09:58:33 2015 -0800
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeFactoryFactory.java	Mon Jan 05 20:23:22 2015 +0100
@@ -71,12 +71,12 @@
         clazz.getModifiers().add(Modifier.FINAL);
 
         if (createdFactoryElement != null) {
-            createFactoryMethods(clazz, visibility);
             clazz.setSuperClass(nodeFactory);
             clazz.add(createNodeFactoryConstructor());
             clazz.add(createCreateNodeMethod());
             clazz.add(createGetInstanceMethod(visibility));
             clazz.add(createInstanceConstant(clazz.asType()));
+            createFactoryMethods(clazz);
         }
 
         return clazz;
@@ -229,14 +229,18 @@
         return var;
     }
 
-    public void createFactoryMethods(CodeTypeElement clazz, Modifier createVisibility) {
+    public void createFactoryMethods(CodeTypeElement clazz) {
         List<ExecutableElement> constructors = NodeBaseFactory.findUserConstructors(createdFactoryElement.asType());
         for (ExecutableElement constructor : constructors) {
-            clazz.add(createCreateMethod(createVisibility, constructor));
+            clazz.add(createCreateMethod(constructor));
+            if (constructor instanceof CodeExecutableElement) {
+                ElementUtils.setVisibility(constructor.getModifiers(), Modifier.PRIVATE);
+            }
         }
     }
 
-    private CodeExecutableElement createCreateMethod(Modifier visibility, ExecutableElement constructor) {
+    private CodeExecutableElement createCreateMethod(ExecutableElement constructor) {
+        Modifier visibility = ElementUtils.getVisibility(constructor.getModifiers());
         CodeExecutableElement method = CodeExecutableElement.clone(context.getEnvironment(), constructor);
         method.setSimpleName(CodeNames.of("create"));
         method.getModifiers().clear();
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java	Mon Jan 05 09:58:33 2015 -0800
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java	Mon Jan 05 20:23:22 2015 +0100
@@ -151,16 +151,7 @@
             }
         }
 
-        List<? extends ExecutableElement> superConstructors = ElementFilter.constructorsIn(node.getTemplateType().getEnclosedElements());
-        for (ExecutableElement superConstructor : superConstructors) {
-            if (getVisibility(superConstructor.getModifiers()) == PRIVATE) {
-                continue;
-            }
-            if (superConstructors.size() > 1 && superConstructor.getParameters().size() > 0 &&
-                            ElementUtils.typeEquals(superConstructor.getEnclosingElement().asType(), superConstructor.getParameters().get(0).asType())) {
-                // constructor is copy constructor
-                continue;
-            }
+        for (ExecutableElement superConstructor : NodeBaseFactory.findUserConstructors(node.getTemplateType().asType())) {
             clazz.add(createNodeConstructor(clazz, superConstructor));
         }
 
@@ -207,7 +198,8 @@
     }
 
     private CodeExecutableElement createNodeConstructor(CodeTypeElement clazz, ExecutableElement superConstructor) {
-        CodeExecutableElement constructor = GeneratorUtils.createConstructorUsingFields(modifiers(PUBLIC), clazz, superConstructor);
+        CodeExecutableElement constructor = GeneratorUtils.createConstructorUsingFields(modifiers(), clazz, superConstructor);
+        ElementUtils.setVisibility(constructor.getModifiers(), ElementUtils.getVisibility(superConstructor.getModifiers()));
 
         List<CodeVariableElement> childParameters = new ArrayList<>();
         for (NodeChildData child : node.getChildren()) {