Mercurial > hg > truffle
diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java @ 18753:f6b8787dc113
Truffle-DSL: replace complex factory system with a much simpler version
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Mon, 29 Dec 2014 23:38:21 +0100 |
parents | 1acaa69ff61b |
children | 59bf50cc5a32 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java Mon Dec 29 23:38:16 2014 +0100 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java Mon Dec 29 23:38:21 2014 +0100 @@ -26,27 +26,69 @@ import javax.lang.model.element.*; +import com.oracle.truffle.dsl.processor.*; import com.oracle.truffle.dsl.processor.java.model.*; import com.oracle.truffle.dsl.processor.model.*; -public class NodeCodeGenerator extends AbstractCompilationUnitFactory<NodeData> { +public class NodeCodeGenerator extends CodeTypeElementFactory<NodeData> { @Override - @SuppressWarnings("unchecked") - protected void createChildren(NodeData node) { - List<CodeTypeElement> casts = new ArrayList<>(getElement().getEnclosedElements()); - getElement().getEnclosedElements().clear(); + public CodeTypeElement create(ProcessorContext context, NodeData node) { + List<CodeTypeElement> enclosedTypes = new ArrayList<>(); + for (NodeData childNode : node.getEnclosingNodes()) { + CodeTypeElement type = create(context, childNode); + if (type != null) { + enclosedTypes.add(type); + } + } + List<CodeTypeElement> generatedNodes = generateNodes(context, node); - Map<NodeData, List<TypeElement>> childTypes = new LinkedHashMap<>(); - for (NodeData nodeChild : node.getEnclosingNodes()) { - NodeCodeGenerator generator = new NodeCodeGenerator(); - childTypes.put(nodeChild, generator.process(null, nodeChild).getEnclosedElements()); - } + if (!generatedNodes.isEmpty() || !enclosedTypes.isEmpty()) { + CodeTypeElement type = wrapGeneratedNodes(context, node, generatedNodes); - if (node.needsFactory() || node.getNodeDeclaringChildren().size() > 0) { - NodeFactoryFactory factory = new NodeFactoryFactory(childTypes); - add(factory, node); - factory.getElement().getEnclosedElements().addAll(casts); + for (CodeTypeElement enclosedFactory : enclosedTypes) { + Set<Modifier> modifiers = enclosedFactory.getModifiers(); + if (!modifiers.contains(Modifier.STATIC)) { + modifiers.add(Modifier.STATIC); + } + type.add(enclosedFactory); + } + return type; + } else { + return null; } } + + private static CodeTypeElement wrapGeneratedNodes(ProcessorContext context, NodeData node, List<CodeTypeElement> generatedNodes) { + // wrap all types into a generated factory + CodeTypeElement factoryElement = new NodeFactoryFactory(context, node, generatedNodes.isEmpty() ? null : generatedNodes.get(0)).create(); + for (CodeTypeElement generatedNode : generatedNodes) { + factoryElement.add(generatedNode); + } + return factoryElement; + } + + private static List<CodeTypeElement> generateNodes(ProcessorContext context, NodeData node) { + if (!node.needsFactory()) { + return Collections.emptyList(); + } + List<CodeTypeElement> nodeTypes = new ArrayList<>(); + SpecializationData generic = node.getGenericSpecialization() == null ? node.getSpecializations().get(0) : node.getGenericSpecialization(); + CodeTypeElement baseNode = new NodeBaseFactory(context, node, generic).create(); + nodeTypes.add(baseNode); + + for (SpecializationData specialization : node.getSpecializations()) { + if (!specialization.isReachable() || specialization.isGeneric()) { + continue; + } + if (specialization.isPolymorphic() && node.isPolymorphic(context)) { + nodeTypes.add(new PolymorphicNodeFactory(context, node, specialization, baseNode).create()); + continue; + } + + nodeTypes.add(new SpecializedNodeFactory(context, node, specialization, baseNode).create()); + } + return nodeTypes; + } + }