comparison 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
comparison
equal deleted inserted replaced
18752:1acaa69ff61b 18753:f6b8787dc113
24 24
25 import java.util.*; 25 import java.util.*;
26 26
27 import javax.lang.model.element.*; 27 import javax.lang.model.element.*;
28 28
29 import com.oracle.truffle.dsl.processor.*;
29 import com.oracle.truffle.dsl.processor.java.model.*; 30 import com.oracle.truffle.dsl.processor.java.model.*;
30 import com.oracle.truffle.dsl.processor.model.*; 31 import com.oracle.truffle.dsl.processor.model.*;
31 32
32 public class NodeCodeGenerator extends AbstractCompilationUnitFactory<NodeData> { 33 public class NodeCodeGenerator extends CodeTypeElementFactory<NodeData> {
33 34
34 @Override 35 @Override
35 @SuppressWarnings("unchecked") 36 public CodeTypeElement create(ProcessorContext context, NodeData node) {
36 protected void createChildren(NodeData node) { 37 List<CodeTypeElement> enclosedTypes = new ArrayList<>();
37 List<CodeTypeElement> casts = new ArrayList<>(getElement().getEnclosedElements()); 38 for (NodeData childNode : node.getEnclosingNodes()) {
38 getElement().getEnclosedElements().clear(); 39 CodeTypeElement type = create(context, childNode);
40 if (type != null) {
41 enclosedTypes.add(type);
42 }
43 }
44 List<CodeTypeElement> generatedNodes = generateNodes(context, node);
39 45
40 Map<NodeData, List<TypeElement>> childTypes = new LinkedHashMap<>(); 46 if (!generatedNodes.isEmpty() || !enclosedTypes.isEmpty()) {
41 for (NodeData nodeChild : node.getEnclosingNodes()) { 47 CodeTypeElement type = wrapGeneratedNodes(context, node, generatedNodes);
42 NodeCodeGenerator generator = new NodeCodeGenerator();
43 childTypes.put(nodeChild, generator.process(null, nodeChild).getEnclosedElements());
44 }
45 48
46 if (node.needsFactory() || node.getNodeDeclaringChildren().size() > 0) { 49 for (CodeTypeElement enclosedFactory : enclosedTypes) {
47 NodeFactoryFactory factory = new NodeFactoryFactory(childTypes); 50 Set<Modifier> modifiers = enclosedFactory.getModifiers();
48 add(factory, node); 51 if (!modifiers.contains(Modifier.STATIC)) {
49 factory.getElement().getEnclosedElements().addAll(casts); 52 modifiers.add(Modifier.STATIC);
53 }
54 type.add(enclosedFactory);
55 }
56 return type;
57 } else {
58 return null;
50 } 59 }
51 } 60 }
61
62 private static CodeTypeElement wrapGeneratedNodes(ProcessorContext context, NodeData node, List<CodeTypeElement> generatedNodes) {
63 // wrap all types into a generated factory
64 CodeTypeElement factoryElement = new NodeFactoryFactory(context, node, generatedNodes.isEmpty() ? null : generatedNodes.get(0)).create();
65 for (CodeTypeElement generatedNode : generatedNodes) {
66 factoryElement.add(generatedNode);
67 }
68 return factoryElement;
69 }
70
71 private static List<CodeTypeElement> generateNodes(ProcessorContext context, NodeData node) {
72 if (!node.needsFactory()) {
73 return Collections.emptyList();
74 }
75 List<CodeTypeElement> nodeTypes = new ArrayList<>();
76 SpecializationData generic = node.getGenericSpecialization() == null ? node.getSpecializations().get(0) : node.getGenericSpecialization();
77 CodeTypeElement baseNode = new NodeBaseFactory(context, node, generic).create();
78 nodeTypes.add(baseNode);
79
80 for (SpecializationData specialization : node.getSpecializations()) {
81 if (!specialization.isReachable() || specialization.isGeneric()) {
82 continue;
83 }
84 if (specialization.isPolymorphic() && node.isPolymorphic(context)) {
85 nodeTypes.add(new PolymorphicNodeFactory(context, node, specialization, baseNode).create());
86 continue;
87 }
88
89 nodeTypes.add(new SpecializedNodeFactory(context, node, specialization, baseNode).create());
90 }
91 return nodeTypes;
92 }
93
52 } 94 }