From 12ed4cfbd2ce43a2954c44e49d453a86c51f2a86 Mon Sep 17 00:00:00 2001 From: Martino Ferrari Date: Sun, 25 Jan 2026 00:18:40 +0100 Subject: [PATCH] reverse symbol renaming for signals --- internal/lsp/server.go | 7 ++- test/lsp_rename_implicit_test.go | 89 ++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 test/lsp_rename_implicit_test.go diff --git a/internal/lsp/server.go b/internal/lsp/server.go index 92dab00..46f2a5b 100644 --- a/internal/lsp/server.go +++ b/internal/lsp/server.go @@ -1131,9 +1131,12 @@ func HandleRename(params RenameParams) *WorkspaceEdit { var targetNode *index.ProjectNode var targetField *parser.Field - if res.Node != nil { - targetNode = res.Node + if res.Node.Target != nil { + targetNode = res.Node.Target + } else { + targetNode = res.Node + } } else if res.Field != nil { targetField = res.Field } else if res.Reference != nil { diff --git a/test/lsp_rename_implicit_test.go b/test/lsp_rename_implicit_test.go new file mode 100644 index 0000000..fce9cfb --- /dev/null +++ b/test/lsp_rename_implicit_test.go @@ -0,0 +1,89 @@ +package integration + +import ( + "testing" + + "github.com/marte-community/marte-dev-tools/internal/index" + "github.com/marte-community/marte-dev-tools/internal/lsp" + "github.com/marte-community/marte-dev-tools/internal/parser" + "github.com/marte-community/marte-dev-tools/internal/validator" +) + +func TestRenameImplicitToDefinition(t *testing.T) { + // Setup + lsp.Tree = index.NewProjectTree() + lsp.Documents = make(map[string]string) + + content := ` ++DS = { + Class = FileReader + +Signals = { + Sig1 = { Type = uint32 } + } +} ++GAM = { + Class = IOGAM + +InputSignals = { + // Implicit usage + Sig1 = { DataSource = DS } + } +} +` + uri := "file://rename_imp.marte" + lsp.Documents[uri] = content + p := parser.NewParser(content) + cfg, err := p.Parse() + if err != nil { + t.Fatal(err) + } + lsp.Tree.AddFile("rename_imp.marte", cfg) + lsp.Tree.ResolveReferences() + + // Run validator to link targets + v := validator.NewValidator(lsp.Tree, ".") + v.ValidateProject() + + // Rename Implicit Sig1 (Line 11, 0-based 11) + // Line 11: " Sig1 = { DataSource = DS }" + params := lsp.RenameParams{ + TextDocument: lsp.TextDocumentIdentifier{URI: uri}, + Position: lsp.Position{Line: 11, Character: 9}, + NewName: "NewSig", + } + + edit := lsp.HandleRename(params) + if edit == nil { + t.Fatal("Expected edits") + } + + edits := edit.Changes[uri] + + // Expect: + // 1. Rename Implicit Sig1 (Line 9) -> NewSig + // 2. Rename Definition Sig1 (Line 4) -> NewSig + + if len(edits) != 2 { + t.Errorf("Expected 2 edits, got %d", len(edits)) + for _, e := range edits { + t.Logf("Edit at line %d", e.Range.Start.Line) + } + } + + foundDef := false + foundImp := false + for _, e := range edits { + if e.Range.Start.Line == 4 { + foundDef = true + } + if e.Range.Start.Line == 11 { + foundImp = true + } + } + + if !foundDef { + t.Error("Definition not renamed") + } + if !foundImp { + t.Error("Implicit usage not renamed") + } +}