From ca5561990ed6435dc9f844e2896c3e01408595d6 Mon Sep 17 00:00:00 2001 From: Abhinav Gupta Date: Thu, 5 Mar 2020 22:47:15 -0800 Subject: [PATCH] NodeKind/String: Don't panic on unknown NodeKind.String() will currently panic if called with an unknown NodeKind. This change verifies that the name of the NodeKind is known before looking it up in kindNames. If the name is unknown, a generic `NodeKind(N)` string representation is used. --- ast/ast.go | 5 ++++- ast/ast_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/ast/ast.go b/ast/ast.go index 66059e9..0f3d3e6 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -26,7 +26,10 @@ const ( type NodeKind int func (k NodeKind) String() string { - return kindNames[k] + if int(k) < len(kindNames) { + return kindNames[k] + } + return fmt.Sprintf("NodeKind(%v)", int(k)) } var kindMax NodeKind diff --git a/ast/ast_test.go b/ast/ast_test.go index 684fbc3..0a54c5d 100644 --- a/ast/ast_test.go +++ b/ast/ast_test.go @@ -73,3 +73,31 @@ func node(n Node, children ...Node) Node { } return n } + +func TestNodeKindString(t *testing.T) { + tests := []struct { + name string + give NodeKind + want string + }{ + { + name: "known", + give: KindLink, + want: "Link", + }, + { + name: "unknown", + give: NodeKind(500), + want: "NodeKind(500)", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := tt.give.String() + if tt.want != got { + t.Errorf("String() expected %q, got %q", tt.want, got) + } + }) + } +}