Mercurial > hg > graal-jvmci-8
diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeFactoryFactory.java @ 18754:59bf50cc5a32
Truffle-DSL: implemented @GenerateNodeFactory to enable generation of factories. Factory generation is now disabled by default.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Mon, 29 Dec 2014 23:38:25 +0100 |
parents | f6b8787dc113 |
children | a665483c3881 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeFactoryFactory.java Mon Dec 29 23:38:21 2014 +0100 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeFactoryFactory.java Mon Dec 29 23:38:25 2014 +0100 @@ -29,7 +29,6 @@ import javax.lang.model.element.*; import javax.lang.model.type.*; -import javax.lang.model.util.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.dsl.processor.*; @@ -52,7 +51,7 @@ this.createdFactoryElement = createdClass; } - private static String factoryClassName(NodeData node) { + public static String factoryClassName(NodeData node) { return node.getNodeId() + "Factory"; } @@ -67,8 +66,7 @@ clazz.getModifiers().add(Modifier.FINAL); if (createdFactoryElement != null) { - createFactoryMethods(clazz, visibility); - + createFactoryMethods(context, node, clazz, createdFactoryElement, visibility); clazz.setSuperClass(nodeFactory); clazz.add(createNodeFactoryConstructor()); clazz.add(createCreateNodeMethod()); @@ -76,11 +74,6 @@ clazz.add(createInstanceConstant(clazz.asType())); } - List<NodeData> children = node.getNodeDeclaringChildren(); - if (node.getDeclaringNode() == null && children.size() > 0) { - clazz.add(createGetFactories()); - } - return clazz; } @@ -231,68 +224,14 @@ return var; } - private ExecutableElement createGetFactories() { - List<NodeData> children = node.getNodeDeclaringChildren(); - if (node.needsFactory()) { - children.add(node); - } - - List<TypeMirror> nodeTypesList = new ArrayList<>(); - TypeMirror prev = null; - boolean allSame = true; - for (NodeData child : children) { - nodeTypesList.add(child.getNodeType()); - if (prev != null && !ElementUtils.typeEquals(child.getNodeType(), prev)) { - allSame = false; - } - prev = child.getNodeType(); - } - TypeMirror commonNodeSuperType = ElementUtils.getCommonSuperType(context, nodeTypesList.toArray(new TypeMirror[nodeTypesList.size()])); - - Types types = context.getEnvironment().getTypeUtils(); - TypeMirror factoryType = context.getType(NodeFactory.class); - TypeMirror baseType; - if (allSame) { - baseType = ElementUtils.getDeclaredType(ElementUtils.fromTypeMirror(factoryType), commonNodeSuperType); - } else { - baseType = ElementUtils.getDeclaredType(ElementUtils.fromTypeMirror(factoryType), types.getWildcardType(commonNodeSuperType, null)); - } - TypeMirror listType = ElementUtils.getDeclaredType(ElementUtils.fromTypeMirror(context.getType(List.class)), baseType); - - CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC, STATIC), listType, "getFactories"); - - CodeTreeBuilder builder = method.createBuilder(); - builder.startReturn(); - builder.startStaticCall(context.getType(Arrays.class), "asList"); - - for (NodeData child : children) { - builder.startGroup(); - NodeData childNode = child; - List<NodeData> factories = new ArrayList<>(); - while (childNode.getDeclaringNode() != null) { - factories.add(childNode); - childNode = childNode.getDeclaringNode(); - } - Collections.reverse(factories); - for (NodeData nodeData : factories) { - builder.string(factoryClassName(nodeData)).string("."); - } - builder.string("getInstance()"); - builder.end(); - } - builder.end(); - builder.end(); - return method; - } - - private void createFactoryMethods(CodeTypeElement clazz, Modifier createVisibility) { + public static void createFactoryMethods(ProcessorContext context, NodeData node, CodeTypeElement clazz, CodeTypeElement createdFactoryElement, Modifier createVisibility) { List<ExecutableElement> constructors = NodeBaseFactory.findUserConstructors(createdFactoryElement.asType()); for (ExecutableElement constructor : constructors) { - clazz.add(createCreateMethod(createVisibility, constructor)); + clazz.add(createCreateMethod(context, node, createVisibility, constructor)); } } - private CodeExecutableElement createCreateMethod(Modifier visibility, ExecutableElement constructor) { + private static CodeExecutableElement createCreateMethod(ProcessorContext context, NodeData node, Modifier visibility, ExecutableElement constructor) { CodeExecutableElement method = CodeExecutableElement.clone(context.getEnvironment(), constructor); method.setSimpleName(CodeNames.of("create")); method.getModifiers().clear();