From e628c5a8e23e8d38dfecc1aa324b2d8f89e703d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Ferr=C3=A0s?= Date: Wed, 22 Jan 2025 07:38:48 +0100 Subject: [PATCH] An inline struct field written without identifier crashed server. Fixes #97 --- .gitignore | 1 + server/cmd/lsp/main.go | 2 +- server/pkg/parser/node_to_struct.go | 20 +++++++++++--------- server/pkg/parser/parse_structs_test.go | 19 +++++++++++++++++++ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 2716b0cf..d219a453 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ parser/chumsky server/internal/parser server/bin dist/ +docs/help diff --git a/server/cmd/lsp/main.go b/server/cmd/lsp/main.go index 2ef6ea93..55f26e62 100644 --- a/server/cmd/lsp/main.go +++ b/server/cmd/lsp/main.go @@ -9,7 +9,7 @@ import ( "github.com/pherrymason/c3-lsp/internal/lsp/server" ) -const version = "0.3.3" +const version = "0.3.4" const prerelease = false const appName = "C3-LSP" diff --git a/server/pkg/parser/node_to_struct.go b/server/pkg/parser/node_to_struct.go index 74603b9c..ae34974d 100644 --- a/server/pkg/parser/node_to_struct.go +++ b/server/pkg/parser/node_to_struct.go @@ -184,15 +184,17 @@ func (p *Parser) parse_struct_body(bodyNode *sitter.Node, currentModule *idx.Mod structFields = append(structFields, &structMember) } } else if isInline { - membersNeedingSubtypingResolve = append(membersNeedingSubtypingResolve, fieldType) - structMember := idx.NewInlineSubtype( - identifier, - fieldType, - currentModule.GetModuleString(), - *docId, - identifiersRange[0], - ) - structFields = append(structFields, &structMember) + if len(identifiersRange) > 0 { + membersNeedingSubtypingResolve = append(membersNeedingSubtypingResolve, fieldType) + structMember := idx.NewInlineSubtype( + identifier, + fieldType, + currentModule.GetModuleString(), + *docId, + identifiersRange[0], + ) + structFields = append(structFields, &structMember) + } } else if len(identifier) > 0 { structMember := idx.NewStructMember( identifier, diff --git a/server/pkg/parser/parse_structs_test.go b/server/pkg/parser/parse_structs_test.go index 1c4eca3d..2d55fd7f 100644 --- a/server/pkg/parser/parse_structs_test.go +++ b/server/pkg/parser/parse_structs_test.go @@ -243,6 +243,25 @@ func TestParse_struct_subtyping_members_should_be_flagged(t *testing.T) { assert.True(t, members[0].IsInlinePendingToResolve(), "Member should be flagged to be inlined") assert.Equal(t, idx.NewRange(6, 16, 6, 22), members[0].GetIdRange(), "Identifier range is wrong") }) + + t.Run("should not break when inline substruct still has no identifier written", func(t *testing.T) { + source := `module x; + struct Person { + int age; + String name; + } + struct ImportantPerson { + inline Person + }` + doc := document.NewDocument("docId", source) + parser := createParser() + + symbols, _ := parser.ParseSymbols(&doc) + module := symbols.Get("x") + + _, ok := module.Structs["ImportantPerson"] + assert.True(t, ok) + }) } func TestParse_Unions(t *testing.T) {