diff --git a/internal/extgen/classparser.go b/internal/extgen/classparser.go index caef0ea23..46a141ea5 100644 --- a/internal/extgen/classparser.go +++ b/internal/extgen/classparser.go @@ -212,7 +212,7 @@ func (cp *classParser) parseMethods(filename string) (methods []phpClassMethod, defer func() { e := file.Close() - if err != nil { + if err == nil { err = e } }() diff --git a/internal/extgen/classparser_test.go b/internal/extgen/classparser_test.go index 11454c48e..af46e211d 100644 --- a/internal/extgen/classparser_test.go +++ b/internal/extgen/classparser_test.go @@ -118,6 +118,26 @@ func SetUserAge(u *UserStruct, age int) { } } +func TestClassParserOrphanMethodDirective(t *testing.T) { + input := `package main + +//export_php:class User +type UserStruct struct { + name string +} + +//export_php:method User::getName(): string +` + tmpDir := t.TempDir() + fileName := filepath.Join(tmpDir, "orphan.go") + require.NoError(t, os.WriteFile(fileName, []byte(input), 0644)) + + parser := classParser{} + _, err := parser.parse(fileName) + require.Error(t, err) + assert.Contains(t, err.Error(), "is not followed by a function declaration") +} + func TestClassMethods(t *testing.T) { var input = []byte(`package main