From f3d974f94fe0978feb690fe130c2fae096c2a65c Mon Sep 17 00:00:00 2001 From: Alon Krymgand Date: Fri, 2 Aug 2024 16:56:58 +0300 Subject: [PATCH] Added String requirement to Nodes --- parse/node.go | 4 ++++ parse/type.go | 4 ++++ parse/type_test.go | 9 +++++++++ 3 files changed, 17 insertions(+) diff --git a/parse/node.go b/parse/node.go index b000e26..a35efd7 100644 --- a/parse/node.go +++ b/parse/node.go @@ -12,7 +12,11 @@ type UnmanagedTokenView = view.UnmanagedView[lex.Token, uint32] type TokenViewContext = view.ViewContext[lex.Token] type Node interface { + // Return a reference to the node substring in the source code View() source.UnmanagedSourceView + + // Regenerate ("format") the code to a unique, single representation. + String(ctx source.SourceContext) string } type NodeParser[T any] interface { diff --git a/parse/type.go b/parse/type.go index 7cb9616..8a634ce 100644 --- a/parse/type.go +++ b/parse/type.go @@ -13,6 +13,10 @@ func (n TypeNode) View() source.UnmanagedSourceView { return n.view } +func (n TypeNode) String(ctx source.SourceContext) string { + return string(n.view.Raw(ctx)) +} + type TypeParser struct{} func (TypeParser) Parse(v *TokenView) (node TypeNode, err ParsingError) { diff --git a/parse/type_test.go b/parse/type_test.go index f02e502..7def4b3 100644 --- a/parse/type_test.go +++ b/parse/type_test.go @@ -10,6 +10,15 @@ import ( "github.com/stretchr/testify/assert" ) +func TestTypeNodeStringer(t *testing.T) { + typView, ctx := source.NewSourceView("$i32").Detach() + typTok := lex.Token{Type: lex.TypToken, View: typView} + tkns := view.NewView[lex.Token, uint32]([]lex.Token{typTok}) + node, err := parse.TypeParser{}.Parse(&tkns) + assert.Nil(t, err) + assert.Equal(t, "$i32", node.String(ctx)) +} + func TestTypeParserSimpleCase(t *testing.T) { typView, ctx := source.NewSourceView("$i32").Detach() typTkn := lex.Token{Type: lex.TypToken, View: typView}