From e3c71ab316f648520fe1ac210df9d6476f940659 Mon Sep 17 00:00:00 2001 From: Emil Valeev Date: Sat, 13 Jan 2024 03:34:39 +0600 Subject: [PATCH] fix: struct builders with sugar --- .vscode/launch.json | 9 +++++++ .vscode/settings.json | 3 ++- examples/struct_builder/with_sugar/main.neva | 2 +- internal/compiler/analyzer/component.go | 8 +++++- internal/compiler/analyzer/component_net.go | 26 ++++++++----------- internal/compiler/analyzer/component_nodes.go | 18 +++++++------ internal/compiler/compiler.go | 22 ++++++++++++++++ internal/compiler/desugarer/component.go | 3 ++- internal/runtime/event_listener.go | 1 + 9 files changed, 65 insertions(+), 27 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index a58517fa..6f7f7722 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -125,6 +125,15 @@ "cwd": "${workspaceFolder}/examples", "args": ["struct_builder/verbose"] }, + { + "name": "Interpreter: struct_builder/with_sugar", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/interpreter", + "cwd": "${workspaceFolder}/examples", + "args": ["struct_builder/with_sugar"] + }, // === Other === { "name": "antlr_000_empty.neva", diff --git a/.vscode/settings.json b/.vscode/settings.json index 58640906..c0b3f446 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -34,5 +34,6 @@ "minimap.background": "#00000000", "scrollbar.shadow": "#00000000" }, - "svg.preview.background": "dark-transparent" + "svg.preview.background": "dark-transparent", + "vsicons.presets.angular": true } diff --git a/examples/struct_builder/with_sugar/main.neva b/examples/struct_builder/with_sugar/main.neva index f521bcbf..286c8db1 100644 --- a/examples/struct_builder/with_sugar/main.neva +++ b/examples/struct_builder/with_sugar/main.neva @@ -14,7 +14,7 @@ components { Main(enter) (exit) { nodes { builder StructBuilder - print Print + print Print } net { $age -> builder.age diff --git a/internal/compiler/analyzer/component.go b/internal/compiler/analyzer/component.go index 3d31b569..d5cee0b4 100644 --- a/internal/compiler/analyzer/component.go +++ b/internal/compiler/analyzer/component.go @@ -98,7 +98,13 @@ func (a Analyzer) analyzeComponent( //nolint:funlen } } - analyzedNet, err := a.analyzeComponentNetwork(component.Net, analyzedInterface, analyzedNodes, nodesIfaces, scope) + analyzedNet, err := a.analyzeComponentNetwork( + component.Net, + analyzedInterface, + analyzedNodes, + nodesIfaces, + scope, + ) if err != nil { return src.Component{}, compiler.Error{ Location: &scope.Location, diff --git a/internal/compiler/analyzer/component_net.go b/internal/compiler/analyzer/component_net.go index 776f73e0..9742a418 100644 --- a/internal/compiler/analyzer/component_net.go +++ b/internal/compiler/analyzer/component_net.go @@ -249,12 +249,13 @@ func (a Analyzer) resolveReceiverType( return outport.TypeExpr, nil } - nodeInportType, err := a.getNodeInportType(receiverSide.PortAddr, nodes, scope) + nodeInportType, err := a.getNodeInportType(receiverSide.PortAddr, nodes, nodesIfaces, scope) if err != nil { - return ts.Expr{}, compiler.Error{ + return ts.Expr{}, &compiler.Error{ + Err: err, Location: &scope.Location, Meta: &receiverSide.PortAddr.Meta, - }.Merge(err) + } } return nodeInportType, nil @@ -263,33 +264,28 @@ func (a Analyzer) resolveReceiverType( func (a Analyzer) getNodeInportType( portAddr src.PortAddr, nodes map[string]src.Node, + nodesIfaces map[string]src.Interface, scope src.Scope, ) (ts.Expr, *compiler.Error) { node, ok := nodes[portAddr.Node] if !ok { return ts.Expr{}, &compiler.Error{ - Err: fmt.Errorf("%w '%v'", ErrNodeNotFound, portAddr.Node), + Err: fmt.Errorf("Node not found '%v'", portAddr.Node), Location: &scope.Location, Meta: &portAddr.Meta, } } - entity, location, err := scope.Entity(node.EntityRef) - if err != nil { + iface, ok := nodesIfaces[portAddr.Node] + if !ok { return ts.Expr{}, &compiler.Error{ - Err: err, + Err: fmt.Errorf("%w '%v'", ErrNodeNotFound, portAddr.Node), Location: &scope.Location, Meta: &portAddr.Meta, } } - var iface src.Interface - if entity.Kind == src.ComponentEntity { - iface = entity.Component.Interface - } else { // we assume that nodes are already validated so if it's not component then it's interface - iface = entity.Interface - } - + // TODO optimize: we can resolve every node's interface just once before processing the network typ, aerr := a.getResolvedPortType( iface.IO.In, iface.TypeParams.Params, @@ -299,7 +295,7 @@ func (a Analyzer) getNodeInportType( ) if aerr != nil { return ts.Expr{}, compiler.Error{ - Location: &location, + Location: &scope.Location, Meta: &portAddr.Meta, }.Merge(aerr) } diff --git a/internal/compiler/analyzer/component_nodes.go b/internal/compiler/analyzer/component_nodes.go index eeaff3c7..1183601a 100644 --- a/internal/compiler/analyzer/component_nodes.go +++ b/internal/compiler/analyzer/component_nodes.go @@ -184,8 +184,6 @@ func (a Analyzer) getResolvedNodeInterface( //nolint:funlen return iface, nil } - // handle struct inports directive case: - if len(iface.IO.In) != 0 { return src.Interface{}, &compiler.Error{ Err: ErrNormalInportsWithStructInportsDirective, @@ -252,14 +250,18 @@ func (a Analyzer) getResolvedNodeInterface( //nolint:funlen } } - iface = src.Interface{ + return src.Interface{ TypeParams: iface.TypeParams, IO: src.IO{ - In: inports, - Out: iface.IO.Out, + In: inports, + Out: map[string]src.Port{ + "v": { // TODO refactor (it's not good to know exact interface here) + TypeExpr: resolvedNodeArg, + IsArray: false, + Meta: iface.IO.Out["v"].Meta, + }, + }, }, Meta: iface.Meta, - } - - return iface, nil + }, nil } diff --git a/internal/compiler/compiler.go b/internal/compiler/compiler.go index 729887ef..8f0e5a87 100644 --- a/internal/compiler/compiler.go +++ b/internal/compiler/compiler.go @@ -2,6 +2,7 @@ package compiler import ( "context" + "fmt" "strings" "github.com/nevalang/neva/pkg/ir" @@ -64,6 +65,27 @@ func (c Compiler) CompileToIR( return nil, err } + // FIXME no structBuilder func call in resulting irprog + + fmt.Println( + JSONDump(parsedBuild.Modules[desugaredBuild.EntryModRef].Packages["struct_builder/with_sugar"]), + ) + fmt.Println() + fmt.Println() + fmt.Println( + JSONDump(analyzedBuild.Modules[desugaredBuild.EntryModRef].Packages["struct_builder/with_sugar"]), + ) + fmt.Println() + fmt.Println() + fmt.Println( + JSONDump(desugaredBuild.Modules[desugaredBuild.EntryModRef].Packages["struct_builder/with_sugar"]), + ) + fmt.Println() + fmt.Println() + fmt.Println( + JSONDump(irProg), + ) + return irProg, nil } diff --git a/internal/compiler/desugarer/component.go b/internal/compiler/desugarer/component.go index 3f32cd1b..c45ea0e6 100644 --- a/internal/compiler/desugarer/component.go +++ b/internal/compiler/desugarer/component.go @@ -83,7 +83,8 @@ func (d Desugarer) desugarComponent( //nolint:funlen // finally replace component ref for this current node with the ref to newly created local builder variation desugaredNodes[nodeName] = src.Node{ EntityRef: src.EntityRef{ - Name: localBuilderName, + Pkg: "builtin", + Name: "StructBuilder", }, Directives: node.Directives, TypeArgs: node.TypeArgs, diff --git a/internal/runtime/event_listener.go b/internal/runtime/event_listener.go index 91822117..709531be 100644 --- a/internal/runtime/event_listener.go +++ b/internal/runtime/event_listener.go @@ -5,6 +5,7 @@ import "fmt" type EmptyListener struct{} func (l EmptyListener) Send(event Event, msg Msg) Msg { + fmt.Println(event, msg) return msg }