Skip to content

Commit 0b05a68

Browse files
authored
fix: ensure named sprite type is nil-checked before renaming (#52)
Fixes goplus/builder#1470 Signed-off-by: Aofei Sheng <aofei@aofeisheng.com>
1 parent 6408b54 commit 0b05a68

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

internal/server/rename.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
gopast "github.com/goplus/gop/ast"
99
"github.com/goplus/goxlsw/internal/util"
10+
"github.com/goplus/goxlsw/internal/vfs"
1011
)
1112

1213
// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#textDocument_prepareRename
@@ -172,10 +173,10 @@ func (s *Server) spxRenameSpriteResource(result *compileResult, id SpxSpriteReso
172173
seenTextEdits := make(map[DocumentURI]map[TextEdit]struct{})
173174
typeInfo := getTypeInfo(result.proj)
174175
for expr, tv := range typeInfo.Types {
175-
if expr == nil || !expr.Pos().IsValid() || !tv.IsType() {
176+
if expr == nil || !expr.Pos().IsValid() || !tv.IsType() || tv.Type == nil {
176177
continue
177178
}
178-
if tv.Type.String() == "main."+id.SpriteName {
179+
if vfs.HasSpriteType(result.proj, tv.Type) && tv.Type.String() == "main."+id.SpriteName {
179180
documentURI := result.nodeDocumentURI(expr)
180181
textEdit := TextEdit{
181182
Range: result.rangeForNode(expr),

internal/server/rename_test.go

+43
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,49 @@ onStart => {
782782
require.EqualError(t, err, `sprite resource "Sprite2" already exists`)
783783
require.Nil(t, changes)
784784
})
785+
786+
// See https://github.com/goplus/builder/issues/1470.
787+
t.Run("WrongCodeWithInvalidType", func(t *testing.T) {
788+
m := map[string][]byte{
789+
"main.spx": []byte(`
790+
var (
791+
Sprite1 Sprite
792+
)
793+
794+
onStart => {
795+
invalidFunc()
796+
}
797+
798+
func invalidFunc() {
799+
invalidVar = [rand(-200,200), rand(-200,200)]
800+
}
801+
`),
802+
"MySprite.spx": []byte(``),
803+
"assets/index.json": []byte(`{}`),
804+
"assets/sprites/Sprite1/index.json": []byte(`{}`),
805+
}
806+
s := New(newMapFSWithoutModTime(m), nil, fileMapGetter(m))
807+
result, err := s.compile()
808+
require.NoError(t, err)
809+
require.True(t, result.hasErrorSeverityDiagnostic)
810+
811+
id, err := ParseSpxResourceURI(SpxResourceURI("spx://resources/sprites/Sprite1"))
812+
require.NoError(t, err)
813+
814+
changes, err := s.spxRenameSpriteResource(result, id.(SpxSpriteResourceID), "Sprite2")
815+
require.NoError(t, err)
816+
require.Len(t, changes, 1)
817+
818+
mainSpxChanges := changes[s.toDocumentURI("main.spx")]
819+
require.Len(t, mainSpxChanges, 1)
820+
assert.Contains(t, mainSpxChanges, TextEdit{
821+
Range: Range{
822+
Start: Position{Line: 2, Character: 1},
823+
End: Position{Line: 2, Character: 8},
824+
},
825+
NewText: "Sprite2",
826+
})
827+
})
785828
}
786829

787830
func TestServerSpxRenameSpriteCostumeResource(t *testing.T) {

0 commit comments

Comments
 (0)