Skip to content

Commit d5f9781

Browse files
committed
fix: prevent duplicate references for auto-binding resources
Fixes goplus/builder#1471 Signed-off-by: Aofei Sheng <aofei@aofeisheng.com>
1 parent b7fefde commit d5f9781

File tree

2 files changed

+67
-18
lines changed

2 files changed

+67
-18
lines changed

internal/server/compile.go

+8
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,10 @@ func (s *Server) inspectSpxSpriteResourceRefAtExpr(result *compileResult, expr g
12451245
if _, ok := result.spxSpriteResourceAutoBindings[obj]; !ok {
12461246
return nil
12471247
}
1248+
defIdent := result.defIdentFor(obj)
1249+
if defIdent == ident {
1250+
return nil
1251+
}
12481252
spxSpriteName = obj.Name()
12491253
spxResourceRefKind = SpxResourceRefKindAutoBindingReference
12501254
}
@@ -1418,6 +1422,10 @@ func (s *Server) inspectSpxSoundResourceRefAtExpr(result *compileResult, expr go
14181422
if _, ok := result.spxSoundResourceAutoBindings[obj]; !ok {
14191423
return nil
14201424
}
1425+
defIdent := result.defIdentFor(obj)
1426+
if defIdent == ident {
1427+
return nil
1428+
}
14211429
spxSoundName = obj.Name()
14221430
spxResourceRefKind = SpxResourceRefKindAutoBindingReference
14231431
default:

internal/server/document_test.go

+59-18
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,9 @@ onStart => {
3636
}
3737
s := New(newMapFSWithoutModTime(m), nil, fileMapGetter(m))
3838

39-
paramsForMainSpx := &DocumentLinkParams{
39+
linksForMainSpx, err := s.textDocumentDocumentLink(&DocumentLinkParams{
4040
TextDocument: TextDocumentIdentifier{URI: "file:///main.spx"},
41-
}
42-
linksForMainSpx, err := s.textDocumentDocumentLink(paramsForMainSpx)
41+
})
4342
require.NoError(t, err)
4443
require.Len(t, linksForMainSpx, 14)
4544
assert.Contains(t, linksForMainSpx, DocumentLink{
@@ -153,10 +152,9 @@ onStart => {
153152
Target: toURI("gop:github.com/goplus/spx?Game.Title"),
154153
})
155154

156-
paramsForMySpriteSpx := &DocumentLinkParams{
155+
linksForMySpriteSpx, err := s.textDocumentDocumentLink(&DocumentLinkParams{
157156
TextDocument: TextDocumentIdentifier{URI: "file:///MySprite.spx"},
158-
}
159-
linksForMySpriteSpx, err := s.textDocumentDocumentLink(paramsForMySpriteSpx)
157+
})
160158
require.NoError(t, err)
161159
require.Len(t, linksForMySpriteSpx, 21)
162160
assert.Contains(t, linksForMySpriteSpx, DocumentLink{
@@ -263,22 +261,20 @@ onStart => {
263261
"main.gop": []byte(`echo "Hello, Go+!"`),
264262
}
265263
s := New(newMapFSWithoutModTime(m), nil, fileMapGetter(m))
266-
params := &DocumentLinkParams{
267-
TextDocument: TextDocumentIdentifier{URI: "file:///main.gop"},
268-
}
269264

270-
links, err := s.textDocumentDocumentLink(params)
265+
links, err := s.textDocumentDocumentLink(&DocumentLinkParams{
266+
TextDocument: TextDocumentIdentifier{URI: "file:///main.gop"},
267+
})
271268
assert.EqualError(t, err, `file "main.gop" does not have .spx extension`)
272269
assert.Nil(t, links)
273270
})
274271

275272
t.Run("FileNotFound", func(t *testing.T) {
276273
s := New(newMapFSWithoutModTime(map[string][]byte{}), nil, fileMapGetter(map[string][]byte{}))
277-
params := &DocumentLinkParams{
278-
TextDocument: TextDocumentIdentifier{URI: "file:///notexist.spx"},
279-
}
280274

281-
links, err := s.textDocumentDocumentLink(params)
275+
links, err := s.textDocumentDocumentLink(&DocumentLinkParams{
276+
TextDocument: TextDocumentIdentifier{URI: "file:///notexist.spx"},
277+
})
282278
assert.ErrorIs(t, err, errNoMainSpxFile)
283279
assert.Nil(t, links)
284280
})
@@ -294,11 +290,10 @@ var (
294290
"assets/sounds/MySound/index.json": []byte(`{}`),
295291
}
296292
s := New(newMapFSWithoutModTime(m), nil, fileMapGetter(m))
297-
params := &DocumentLinkParams{
298-
TextDocument: TextDocumentIdentifier{URI: "file:///main.spx"},
299-
}
300293

301-
links, err := s.textDocumentDocumentLink(params)
294+
links, err := s.textDocumentDocumentLink(&DocumentLinkParams{
295+
TextDocument: TextDocumentIdentifier{URI: "file:///main.spx"},
296+
})
302297
require.NoError(t, err)
303298
require.Len(t, links, 3)
304299
assert.Contains(t, links, DocumentLink{
@@ -326,4 +321,50 @@ var (
326321
Target: toURI("gop:github.com/goplus/spx?Sound"),
327322
})
328323
})
324+
325+
t.Run("AutoBindingSpriteAsEmbeddedField", func(t *testing.T) {
326+
m := map[string][]byte{
327+
"main.spx": []byte(`
328+
var (
329+
MySprite
330+
)
331+
`),
332+
"MySprite.spx": []byte(``),
333+
"assets/sprites/MySprite/index.json": []byte(`{}`),
334+
}
335+
s := New(newMapFSWithoutModTime(m), nil, fileMapGetter(m))
336+
337+
links, err := s.textDocumentDocumentLink(&DocumentLinkParams{
338+
TextDocument: TextDocumentIdentifier{URI: "file:///main.spx"},
339+
})
340+
require.NoError(t, err)
341+
require.Len(t, links, 3)
342+
assert.Contains(t, links, DocumentLink{
343+
Range: Range{
344+
Start: Position{Line: 2, Character: 1},
345+
End: Position{Line: 2, Character: 9},
346+
},
347+
Target: toURI("spx://resources/sprites/MySprite"),
348+
Data: SpxResourceRefDocumentLinkData{
349+
Kind: SpxResourceRefKindAutoBinding,
350+
},
351+
})
352+
assert.NotContains(t, links, DocumentLink{
353+
Range: Range{
354+
Start: Position{Line: 2, Character: 1},
355+
End: Position{Line: 2, Character: 9},
356+
},
357+
Target: toURI("spx://resources/sprites/MySprite"),
358+
Data: SpxResourceRefDocumentLinkData{
359+
Kind: SpxResourceRefKindAutoBindingReference,
360+
},
361+
})
362+
assert.Contains(t, links, DocumentLink{
363+
Range: Range{
364+
Start: Position{Line: 2, Character: 1},
365+
End: Position{Line: 2, Character: 9},
366+
},
367+
Target: toURI("gop:main?Game.MySprite"),
368+
})
369+
})
329370
}

0 commit comments

Comments
 (0)