|
1 | 1 | package desugarer
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "errors" |
4 | 5 | "fmt"
|
5 | 6 |
|
6 | 7 | "github.com/nevalang/neva/internal/compiler"
|
@@ -238,7 +239,7 @@ func (d *Desugarer) desugarSingleReceiver(
|
238 | 239 | }, nil
|
239 | 240 | }
|
240 | 241 |
|
241 |
| - firstInportName, err := scope.GetFirstInportName(nodes, *receiver.PortAddr) |
| 242 | + firstInportName, err := d.getFirstInportName(scope, nodes, *receiver.PortAddr) |
242 | 243 | if err != nil {
|
243 | 244 | return desugarReceiverResult{}, fmt.Errorf("get first inport name: %w", err)
|
244 | 245 | }
|
@@ -441,7 +442,7 @@ func (d *Desugarer) desugarChainedConnection(
|
441 | 442 | chainHeadPort = chainHead.PortAddr.Port
|
442 | 443 | if chainHeadPort == "" {
|
443 | 444 | var err error
|
444 |
| - chainHeadPort, err = scope.GetFirstInportName(nodes, *chainHead.PortAddr) |
| 445 | + chainHeadPort, err = d.getFirstInportName(scope, nodes, *chainHead.PortAddr) |
445 | 446 | if err != nil {
|
446 | 447 | return desugarConnectionResult{}, fmt.Errorf("get first inport name: %w", err)
|
447 | 448 | }
|
@@ -688,7 +689,7 @@ func (d *Desugarer) desugarSingleSender(
|
688 | 689 | if sender.PortAddr != nil {
|
689 | 690 | portName := sender.PortAddr.Port
|
690 | 691 | if sender.PortAddr.Port == "" {
|
691 |
| - firstOutportName, err := scope.GetFirstOutportName(nodes, *sender.PortAddr) |
| 692 | + firstOutportName, err := d.getFirstOutportName(scope, nodes, *sender.PortAddr) |
692 | 693 | if err != nil {
|
693 | 694 | return desugarSenderResult{}, fmt.Errorf("get first outport name: %w", err)
|
694 | 695 | }
|
@@ -842,6 +843,42 @@ func (d *Desugarer) desugarSingleSender(
|
842 | 843 | }, nil
|
843 | 844 | }
|
844 | 845 |
|
| 846 | +func (d *Desugarer) getFirstInportName( |
| 847 | + scope Scope, |
| 848 | + nodes map[string]src.Node, |
| 849 | + portAddr src.PortAddr, |
| 850 | +) (string, error) { |
| 851 | + io, err := scope.GetNodeIOByPortAddr(nodes, portAddr) |
| 852 | + if err != nil { |
| 853 | + return "", err |
| 854 | + } |
| 855 | + for inport := range io.In { |
| 856 | + return inport, nil |
| 857 | + } |
| 858 | + return "", errors.New("first inport not found") |
| 859 | +} |
| 860 | + |
| 861 | +func (d *Desugarer) getFirstOutportName( |
| 862 | + scope Scope, |
| 863 | + nodes map[string]src.Node, |
| 864 | + portAddr src.PortAddr, |
| 865 | +) (string, error) { |
| 866 | + io, err := scope.GetNodeIOByPortAddr(nodes, portAddr) |
| 867 | + if err != nil { |
| 868 | + return "", err |
| 869 | + } |
| 870 | + |
| 871 | + // important: skip `err` outport if node has err guard |
| 872 | + for outport := range io.Out { |
| 873 | + if outport == "err" && nodes[portAddr.Node].ErrGuard { |
| 874 | + continue |
| 875 | + } |
| 876 | + return outport, nil |
| 877 | + } |
| 878 | + |
| 879 | + return "", errors.New("first outport not found") |
| 880 | +} |
| 881 | + |
845 | 882 | var newComponentRef = core.EntityRef{
|
846 | 883 | Pkg: "builtin",
|
847 | 884 | Name: "New",
|
|
0 commit comments