From d1fcb557a8368ab8579504653d977dba312dec93 Mon Sep 17 00:00:00 2001 From: Redshore Date: Thu, 23 Jul 2026 21:14:37 +0900 Subject: [PATCH] fix: keep blank lines from resetting the indentation stack in Parse Co-Authored-By: Claude Fable 5 --- internal/analysis/yaml/yaml.go | 6 ++++++ internal/analysis/yaml/yaml_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/internal/analysis/yaml/yaml.go b/internal/analysis/yaml/yaml.go index 65a4fd5..d64d66e 100644 --- a/internal/analysis/yaml/yaml.go +++ b/internal/analysis/yaml/yaml.go @@ -88,6 +88,12 @@ func Parse(r io.Reader) (Document, error) { line := parseLine(scanner.Bytes(), lineNum) document.Lines = append(document.Lines, line.line) + // A blank line parses as indent 0, which would reset the parent + // stack and orphan everything below it in the same mapping. + if len(bytes.TrimSpace(scanner.Bytes())) == 0 { + continue + } + for len(parentStack) > 0 && parentStack[len(parentStack)-1].indent >= line.indent { parentStack = parentStack[:len(parentStack)-1] } diff --git a/internal/analysis/yaml/yaml_test.go b/internal/analysis/yaml/yaml_test.go index a8e9825..cd74926 100644 --- a/internal/analysis/yaml/yaml_test.go +++ b/internal/analysis/yaml/yaml_test.go @@ -323,6 +323,30 @@ components: } } +func TestRefs_BlankLineBetweenSchemas(t *testing.T) { + document, err := Parse(bytes.NewReader([]byte(`openapi: 3.0.0 +components: + schemas: + Foo: + type: object + + Bar: + type: object +`))) + if err != nil { + t.Fatal(err) + } + + for _, ref := range []string{ + "#/components/schemas/Foo", + "#/components/schemas/Bar", + } { + if document.Locate(ref) == nil { + t.Errorf("could not locate %s", ref) + } + } +} + func TestParse_PetStore(t *testing.T) { f, err := os.Open("testdata/petstore.yaml") if err != nil {