comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java @ 11742:85b846b31690

Truffle-DSL: automatically generate copy constructor if super constructor expects only SourceSection parameter.
author Andreas Woess <andreas.woess@jku.at>
date Fri, 20 Sep 2013 16:30:18 +0200
parents 152b4146f05b
children c287d13cb8b0
comparison
equal deleted inserted replaced
11735:9c9683970656 11742:85b846b31690
1100 1100
1101 } 1101 }
1102 1102
1103 private void createConstructors(NodeData node, CodeTypeElement clazz) { 1103 private void createConstructors(NodeData node, CodeTypeElement clazz) {
1104 List<ExecutableElement> constructors = findUserConstructors(node.getNodeType()); 1104 List<ExecutableElement> constructors = findUserConstructors(node.getNodeType());
1105 ExecutableElement sourceSectionConstructor = null;
1105 if (constructors.isEmpty()) { 1106 if (constructors.isEmpty()) {
1106 clazz.add(createUserConstructor(clazz, null)); 1107 clazz.add(createUserConstructor(clazz, null));
1107 } else { 1108 } else {
1108 for (ExecutableElement constructor : constructors) { 1109 for (ExecutableElement constructor : constructors) {
1109 clazz.add(createUserConstructor(clazz, constructor)); 1110 clazz.add(createUserConstructor(clazz, constructor));
1111 if (NodeParser.isSourceSectionConstructor(context, constructor)) {
1112 sourceSectionConstructor = constructor;
1113 }
1110 } 1114 }
1111 } 1115 }
1112 if (node.needsRewrites(getContext())) { 1116 if (node.needsRewrites(getContext())) {
1113 clazz.add(createCopyConstructor(clazz, findCopyConstructor(node.getNodeType()))); 1117 clazz.add(createCopyConstructor(clazz, findCopyConstructor(node.getNodeType()), sourceSectionConstructor));
1114 } 1118 }
1115 } 1119 }
1116 1120
1117 private CodeExecutableElement createUserConstructor(CodeTypeElement type, ExecutableElement superConstructor) { 1121 private CodeExecutableElement createUserConstructor(CodeTypeElement type, ExecutableElement superConstructor) {
1118 CodeExecutableElement method = new CodeExecutableElement(null, type.getSimpleName().toString()); 1122 CodeExecutableElement method = new CodeExecutableElement(null, type.getSimpleName().toString());
1197 builder.end(); 1201 builder.end();
1198 builder.end().string("}"); 1202 builder.end().string("}");
1199 return builder.getRoot(); 1203 return builder.getRoot();
1200 } 1204 }
1201 1205
1202 private CodeExecutableElement createCopyConstructor(CodeTypeElement type, ExecutableElement superConstructor) { 1206 private CodeExecutableElement createCopyConstructor(CodeTypeElement type, ExecutableElement superConstructor, ExecutableElement sourceSectionConstructor) {
1203 CodeExecutableElement method = new CodeExecutableElement(null, type.getSimpleName().toString()); 1207 CodeExecutableElement method = new CodeExecutableElement(null, type.getSimpleName().toString());
1204 CodeTreeBuilder builder = method.createBuilder(); 1208 CodeTreeBuilder builder = method.createBuilder();
1205 method.getParameters().add(new CodeVariableElement(type.asType(), "copy")); 1209 method.getParameters().add(new CodeVariableElement(type.asType(), "copy"));
1206 1210
1207 if (superConstructor != null) { 1211 if (superConstructor != null) {
1208 builder.startStatement().startSuperCall().string("copy").end().end(); 1212 builder.startStatement().startSuperCall().string("copy").end().end();
1213 } else if (sourceSectionConstructor != null) {
1214 builder.startStatement().startSuperCall().string("copy.getSourceSection()").end().end();
1209 } 1215 }
1210 1216
1211 for (VariableElement var : type.getFields()) { 1217 for (VariableElement var : type.getFields()) {
1212 builder.startStatement(); 1218 builder.startStatement();
1213 final String varName = var.getSimpleName().toString(); 1219 final String varName = var.getSimpleName().toString();