Fixed isolated file indexing

This commit is contained in:
Martino Ferrari
2026-02-02 14:26:19 +01:00
parent d4075ff809
commit ff19fef779
6 changed files with 66 additions and 9 deletions

View File

@@ -182,7 +182,13 @@ func (pt *ProjectTree) AddFile(file string, config *parser.Configuration) {
} }
if config.Package == nil { if config.Package == nil {
pt.populateNode(pt.Root, file, config) node := &ProjectNode{
Children: make(map[string]*ProjectNode),
Metadata: make(map[string]string),
Variables: make(map[string]VariableInfo),
}
pt.IsolatedFiles[file] = node
pt.populateNode(node, file, config)
return return
} }

View File

@@ -716,9 +716,16 @@ func HandleCompletion(params CompletionParams) *CompletionList {
return nil return nil
} }
func suggestGAMSignals(_ *index.ProjectNode, direction string) *CompletionList { func suggestGAMSignals(container *index.ProjectNode, direction string) *CompletionList {
var items []CompletionItem var items []CompletionItem
// Find scope root
root := container
for root.Parent != nil {
root = root.Parent
}
var walk func(*index.ProjectNode)
processNode := func(node *index.ProjectNode) { processNode := func(node *index.ProjectNode) {
if !isDataSource(node) { if !isDataSource(node) {
return return
@@ -776,7 +783,13 @@ func suggestGAMSignals(_ *index.ProjectNode, direction string) *CompletionList {
} }
} }
Tree.Walk(processNode) walk = func(n *index.ProjectNode) {
processNode(n)
for _, child := range n.Children {
walk(child)
}
}
walk(root)
if len(items) > 0 { if len(items) > 0 {
return &CompletionList{Items: items} return &CompletionList{Items: items}

38
test/isolation_test.go Normal file
View File

@@ -0,0 +1,38 @@
package integration
import (
"testing"
"github.com/marte-community/marte-dev-tools/internal/index"
"github.com/marte-community/marte-dev-tools/internal/parser"
)
func TestIsolatedFileIsolation(t *testing.T) {
pt := index.NewProjectTree()
// File 1: Project file
f1 := "#package P\n+A = { Class = C }"
p1 := parser.NewParser(f1)
c1, _ := p1.Parse()
pt.AddFile("f1.marte", c1)
// File 2: Isolated file
f2 := "+B = { Class = C }"
p2 := parser.NewParser(f2)
c2, _ := p2.Parse()
pt.AddFile("f2.marte", c2)
pt.ResolveReferences()
// Try finding A from f2
isoNode := pt.IsolatedFiles["f2.marte"]
if pt.ResolveName(isoNode, "A", nil) != nil {
t.Error("Isolated file f2 should not see global A")
}
// Try finding B from f1
pNode := pt.Root.Children["P"]
if pt.ResolveName(pNode, "B", nil) != nil {
t.Error("Project file f1 should not see isolated B")
}
}

View File

@@ -193,8 +193,8 @@ $App = {
} }
} }
} }
if !foundProjectDS { if foundProjectDS {
t.Error("Expected ProjectDS in isolated file suggestions (now shared root)") t.Error("Did not expect ProjectDS in isolated file suggestions (isolation)")
} }
// Completion in a project file // Completion in a project file

View File

@@ -45,9 +45,9 @@ func TestLSPSignalReferences(t *testing.T) {
v.ValidateProject() v.ValidateProject()
// Find definition of MySig in MyDS // Find definition of MySig in MyDS
root := idx.Root root := idx.IsolatedFiles["signal_refs.marte"]
if root == nil { if root == nil {
t.Fatal("Root node not found") t.Fatal("Root node not found (isolated)")
} }
// Traverse to MySig // Traverse to MySig

View File

@@ -194,7 +194,7 @@ func TestIsolatedFileValidation(t *testing.T) {
t.Fatal("Reference SharedObj not found in index") t.Fatal("Reference SharedObj not found in index")
} }
if ref.Target == nil { if ref.Target != nil {
t.Errorf("Expected reference in root file (iso.marte) to resolve to global SharedObj") t.Errorf("Isolation failure: reference in isolated file resolved to global object")
} }
} }