comparison graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java @ 7858:4958cbdbf360

Fixed minor bugs in NodeFactory generation.
author Christian Humer <christian.humer@gmail.com>
date Mon, 25 Feb 2013 14:22:18 +0100
parents 6e4fb0ccebb1
children 3c68170fc9b0
comparison
equal deleted inserted replaced
7857:c8e1c5abf6ed 7858:4958cbdbf360
421 if (node.getExtensionElements() != null && !node.getExtensionElements().isEmpty()) { 421 if (node.getExtensionElements() != null && !node.getExtensionElements().isEmpty()) {
422 NodeGenFactory factory = new NodeGenFactory(context); 422 NodeGenFactory factory = new NodeGenFactory(context);
423 add(factory, node); 423 add(factory, node);
424 } 424 }
425 425
426 if (node.needsFactory() || childTypes.size() > 0) { 426 if (node.needsFactory() || node.getNodeChildren().size() > 0) {
427 add(new NodeFactoryFactory(context, childTypes), node); 427 add(new NodeFactoryFactory(context, childTypes), node);
428 } 428 }
429 } 429 }
430 430
431 private class NodeGenFactory extends ClassElementFactory<NodeData> { 431 private class NodeGenFactory extends ClassElementFactory<NodeData> {
513 clazz.getImplements().add(nodeFactory); 513 clazz.getImplements().add(nodeFactory);
514 clazz.add(createCreateNodeMethod(node, createVisibility)); 514 clazz.add(createCreateNodeMethod(node, createVisibility));
515 clazz.add(createCreateNodeSpecializedMethod(node, createVisibility)); 515 clazz.add(createCreateNodeSpecializedMethod(node, createVisibility));
516 clazz.add(createGetNodeClassMethod(node)); 516 clazz.add(createGetNodeClassMethod(node));
517 clazz.add(createGetNodeSignaturesMethod(node)); 517 clazz.add(createGetNodeSignaturesMethod(node));
518 clazz.add(createGetInstanceMethod(node, clazz.asType(), createVisibility)); 518 clazz.add(createGetInstanceMethod(node, createVisibility));
519 clazz.add(createInstanceConstant(node, clazz.asType())); 519 clazz.add(createInstanceConstant(node, clazz.asType()));
520 } 520 }
521 521
522 for (NodeData childNode : childTypes.keySet()) { 522 for (NodeData childNode : childTypes.keySet()) {
523 if (childNode.getTemplateType().getModifiers().contains(Modifier.PRIVATE)) { 523 if (childNode.getTemplateType().getModifiers().contains(Modifier.PRIVATE)) {
536 typeModifiers.add(Modifier.FINAL); 536 typeModifiers.add(Modifier.FINAL);
537 clazz.add(type); 537 clazz.add(type);
538 } 538 }
539 } 539 }
540 540
541 if (node.getParent() == null && node.getDeclaredChildren().size() > 0) { 541 List<NodeData> children = node.getNodeChildren();
542 List<NodeData> children = node.getNodeChildren(); 542 if (node.getParent() == null && children.size() > 0) {
543 List<TypeMirror> types = new ArrayList<>(); 543 clazz.add(createGetFactories(node));
544 if (node.needsFactory()) {
545 types.add(node.getNodeType());
546 }
547 for (NodeData child : children) {
548 types.add(child.getTemplateType().asType());
549 }
550 TypeMirror commonSuperType = Utils.getCommonSuperType(getContext(), types.toArray(new TypeMirror[types.size()]));
551 clazz.add(createGetFactories(node, commonSuperType));
552 } 544 }
553 545
554 } 546 }
555 547
556 private CodeExecutableElement createGetNodeClassMethod(NodeData node) { 548 private CodeExecutableElement createGetNodeClassMethod(NodeData node) {
678 } 670 }
679 671
680 return method; 672 return method;
681 } 673 }
682 674
683 private ExecutableElement createGetInstanceMethod(NodeData node, TypeMirror factoryType, Modifier visibility) { 675 private ExecutableElement createGetInstanceMethod(NodeData node, Modifier visibility) {
684 CodeExecutableElement method = new CodeExecutableElement(modifiers(), factoryType, "getInstance"); 676 Types types = getContext().getEnvironment().getTypeUtils();
677 TypeElement nodeFactoryType = Utils.fromTypeMirror(getContext().getType(NodeFactory.class));
678 TypeMirror returnType = types.getDeclaredType(nodeFactoryType, node.getNodeType());
679
680 CodeExecutableElement method = new CodeExecutableElement(modifiers(), returnType, "getInstance");
685 if (visibility != null) { 681 if (visibility != null) {
686 method.getModifiers().add(visibility); 682 method.getModifiers().add(visibility);
687 } 683 }
688 method.getModifiers().add(Modifier.STATIC); 684 method.getModifiers().add(Modifier.STATIC);
689 685
719 var.getModifiers().add(Modifier.PRIVATE); 715 var.getModifiers().add(Modifier.PRIVATE);
720 var.getModifiers().add(Modifier.STATIC); 716 var.getModifiers().add(Modifier.STATIC);
721 return var; 717 return var;
722 } 718 }
723 719
724 private ExecutableElement createGetFactories(NodeData node, TypeMirror commonSuperType) { 720 private ExecutableElement createGetFactories(NodeData node) {
721 List<NodeData> children = node.getNodeChildren();
722 if (node.needsFactory()) {
723 children.add(node);
724 }
725
726 List<TypeMirror> nodeTypesList = new ArrayList<>();
727 for (NodeData child : children) {
728 nodeTypesList.add(child.getTemplateType().asType());
729 }
730 TypeMirror commonNodeSuperType = Utils.getCommonSuperType(getContext(), nodeTypesList.toArray(new TypeMirror[nodeTypesList.size()]));
731
725 Types types = getContext().getEnvironment().getTypeUtils(); 732 Types types = getContext().getEnvironment().getTypeUtils();
726 TypeMirror classType = getContext().getType(NodeFactory.class); 733 TypeMirror factoryType = getContext().getType(NodeFactory.class);
727 TypeMirror classWithWildcards = types.getDeclaredType(Utils.fromTypeMirror(classType), types.getWildcardType(commonSuperType, null)); 734 TypeMirror baseType;
728 TypeMirror listType = types.getDeclaredType(Utils.fromTypeMirror(getContext().getType(List.class)), classWithWildcards); 735 if (children.size() == 1) {
736 baseType = types.getDeclaredType(Utils.fromTypeMirror(factoryType), commonNodeSuperType);
737 } else {
738 baseType = types.getDeclaredType(Utils.fromTypeMirror(factoryType), types.getWildcardType(commonNodeSuperType, null));
739 }
740 TypeMirror listType = types.getDeclaredType(Utils.fromTypeMirror(getContext().getType(List.class)), baseType);
729 741
730 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC, STATIC), listType, "getFactories"); 742 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC, STATIC), listType, "getFactories");
731 743
732 CodeTreeBuilder builder = method.createBuilder(); 744 CodeTreeBuilder builder = method.createBuilder();
733 builder.startReturn(); 745 builder.startReturn();
734 builder.startStaticCall(getContext().getType(Arrays.class), "asList"); 746 builder.startStaticCall(getContext().getType(Arrays.class), "asList");
735 List<NodeData> children = node.getNodeChildren();
736 if (node.needsFactory()) {
737 children.add(node);
738 }
739 747
740 for (NodeData child : children) { 748 for (NodeData child : children) {
741 builder.startGroup(); 749 builder.startGroup();
742 NodeData childNode = child; 750 NodeData childNode = child;
743 List<NodeData> factories = new ArrayList<>(); 751 List<NodeData> factories = new ArrayList<>();