Skip to content

Commit 54db0e5

Browse files
authored
Merge pull request #97 from yoheimuta/yoheimuta/issue96
Fix parsing error in buf validate proto file
2 parents 6048c2a + e7794c7 commit 54db0e5

File tree

2 files changed

+73
-7
lines changed

2 files changed

+73
-7
lines changed

parser/reserved.go

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ func (p *Parser) parseRange() (*Range, error) {
163163

164164
// fieldNames = fieldName { "," fieldName }
165165
// See https://developers.google.com/protocol-buffers/docs/reference/proto3-spec#reserved
166+
// Note: While the spec requires commas between field names, this parser also supports
167+
// field names separated by whitespace without commas, which is not mentioned in the spec
168+
// but is supported by protoc and other parsers.
166169
func (p *Parser) parseFieldNames() ([]string, error) {
167170
var fieldNames []string
168171

@@ -173,17 +176,29 @@ func (p *Parser) parseFieldNames() ([]string, error) {
173176
fieldNames = append(fieldNames, fieldName)
174177

175178
for {
179+
// Check if next token is a comma
176180
p.lex.Next()
177-
if p.lex.Token != scanner.TCOMMA {
181+
if p.lex.Token == scanner.TCOMMA {
182+
// If it's a comma, parse the next field name
183+
fieldName, err = p.parseFieldName()
184+
if err != nil {
185+
return nil, err
186+
}
187+
fieldNames = append(fieldNames, fieldName)
188+
} else {
189+
// If it's not a comma, put it back and try to parse another field name
178190
p.lex.UnNext()
179-
break
180-
}
181191

182-
fieldName, err = p.parseFieldName()
183-
if err != nil {
184-
return nil, err
192+
// Try to parse another field name
193+
nextFieldName, err := p.parseFieldName()
194+
if err != nil {
195+
// If parsing fails, we're done with field names
196+
break
197+
}
198+
199+
// Successfully parsed another field name
200+
fieldNames = append(fieldNames, nextFieldName)
185201
}
186-
fieldNames = append(fieldNames, fieldName)
187202
}
188203
return fieldNames, nil
189204
}

parser/reserved_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,57 @@ func TestParser_ParseReserved(t *testing.T) {
130130
},
131131
},
132132
},
133+
{
134+
name: "parsing field names on separate lines without commas. See #96",
135+
input: `reserved
136+
"skipped"
137+
"ignore_empty"
138+
;`,
139+
wantReserved: &parser.Reserved{
140+
FieldNames: []string{
141+
`"skipped"`,
142+
`"ignore_empty"`,
143+
},
144+
Meta: meta.Meta{
145+
Pos: meta.Position{
146+
Offset: 0,
147+
Line: 1,
148+
Column: 1,
149+
},
150+
LastPos: meta.Position{
151+
Offset: 36,
152+
Line: 4,
153+
Column: 1,
154+
},
155+
},
156+
},
157+
},
158+
{
159+
name: "parsing a mix of comma-separated and whitespace-separated field names",
160+
input: `reserved "field1",
161+
"field2"
162+
"field3", "field4";`,
163+
wantReserved: &parser.Reserved{
164+
FieldNames: []string{
165+
`"field1"`,
166+
`"field2"`,
167+
`"field3"`,
168+
`"field4"`,
169+
},
170+
Meta: meta.Meta{
171+
Pos: meta.Position{
172+
Offset: 0,
173+
Line: 1,
174+
Column: 1,
175+
},
176+
LastPos: meta.Position{
177+
Offset: 49,
178+
Line: 3,
179+
Column: 20,
180+
},
181+
},
182+
},
183+
},
133184
}
134185

135186
for _, test := range tests {

0 commit comments

Comments
 (0)