Mercurial > hg > graal-jvmci-8
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<>(); |