Mercurial > hg > truffle
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(); |