Skip to content

Commit f139a6d

Browse files
authored
update to protocompile v0.7.1; fix some incompatibilities with it (#586)
1 parent dd8b737 commit f139a6d

40 files changed

+2610
-175
lines changed

desc/protoparse/errors.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,12 @@ type ErrorWithPos = reporter.ErrorWithPos
6262
//
6363
// SourcePos should always be set and never nil.
6464
type ErrorWithSourcePos struct {
65+
// These fields are present and exported for backwards-compatibility
66+
// with v1.4 and earlier.
6567
Underlying error
6668
Pos *SourcePos
69+
70+
reporter.ErrorWithPos
6771
}
6872

6973
// Error implements the error interface
@@ -92,8 +96,9 @@ var _ ErrorWithPos = ErrorWithSourcePos{}
9296
func toErrorWithSourcePos(err ErrorWithPos) ErrorWithPos {
9397
pos := err.GetPosition()
9498
return ErrorWithSourcePos{
95-
Underlying: err.Unwrap(),
96-
Pos: &pos,
99+
ErrorWithPos: err,
100+
Underlying: err.Unwrap(),
101+
Pos: &pos,
97102
}
98103
}
99104

desc/protoparse/parser.go

+34-19
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,11 @@ func (p Parser) ParseFiles(filenames ...string) ([]*desc.FileDescriptor, error)
147147
srcInfoMode = protocompile.SourceInfoExtraComments
148148
}
149149
rep := newReporter(p.ErrorReporter, p.WarningReporter)
150-
res, srcPosAddr := p.getResolver(filenames)
150+
res, srcSpanAddr := p.getResolver(filenames)
151151

152152
if p.InferImportPaths {
153153
// we must first compile everything to protos
154-
results, err := parseToProtosRecursive(res, filenames, reporter.NewHandler(rep), srcPosAddr)
154+
results, err := parseToProtosRecursive(res, filenames, reporter.NewHandler(rep), srcSpanAddr)
155155
if err != nil {
156156
return nil, err
157157
}
@@ -375,17 +375,17 @@ func parseToProtos(res protocompile.Resolver, filenames []string, rep *reporter.
375375
return results, nil
376376
}
377377

378-
func parseToProtosRecursive(res protocompile.Resolver, filenames []string, rep *reporter.Handler, srcPosAddr *SourcePos) (map[string]parser.Result, error) {
378+
func parseToProtosRecursive(res protocompile.Resolver, filenames []string, rep *reporter.Handler, srcSpanAddr *ast2.SourceSpan) (map[string]parser.Result, error) {
379379
results := make(map[string]parser.Result, len(filenames))
380380
for _, filename := range filenames {
381-
if err := parseToProtoRecursive(res, filename, rep, srcPosAddr, results); err != nil {
381+
if err := parseToProtoRecursive(res, filename, rep, srcSpanAddr, results); err != nil {
382382
return results, err
383383
}
384384
}
385385
return results, rep.Error()
386386
}
387387

388-
func parseToProtoRecursive(res protocompile.Resolver, filename string, rep *reporter.Handler, srcPosAddr *SourcePos, results map[string]parser.Result) error {
388+
func parseToProtoRecursive(res protocompile.Resolver, filename string, rep *reporter.Handler, srcSpanAddr *ast2.SourceSpan, results map[string]parser.Result) error {
389389
if _, ok := results[filename]; ok {
390390
// already processed this one
391391
return nil
@@ -412,13 +412,13 @@ func parseToProtoRecursive(res protocompile.Resolver, filename string, rep *repo
412412
continue
413413
}
414414
err := func() error {
415-
orig := *srcPosAddr
416-
*srcPosAddr = astRoot.NodeInfo(imp.Name).Start()
415+
orig := *srcSpanAddr
416+
*srcSpanAddr = astRoot.NodeInfo(imp.Name)
417417
defer func() {
418-
*srcPosAddr = orig
418+
*srcSpanAddr = orig
419419
}()
420420

421-
return parseToProtoRecursive(res, imp.Name.AsString(), rep, srcPosAddr, results)
421+
return parseToProtoRecursive(res, imp.Name.AsString(), rep, srcSpanAddr, results)
422422
}()
423423
if err != nil {
424424
return err
@@ -433,27 +433,42 @@ func parseToProtoRecursive(res protocompile.Resolver, filename string, rep *repo
433433
for i, dep := range fd.Dependency {
434434
path := []int32{internal.File_dependencyTag, int32(i)}
435435
err := func() error {
436-
orig := *srcPosAddr
436+
orig := *srcSpanAddr
437437
found := false
438438
for _, loc := range fd.GetSourceCodeInfo().GetLocation() {
439439
if pathsEqual(loc.Path, path) {
440-
*srcPosAddr = SourcePos{
440+
start := SourcePos{
441441
Filename: dep,
442442
Line: int(loc.Span[0]),
443443
Col: int(loc.Span[1]),
444444
}
445+
var end SourcePos
446+
if len(loc.Span) > 3 {
447+
end = SourcePos{
448+
Filename: dep,
449+
Line: int(loc.Span[2]),
450+
Col: int(loc.Span[3]),
451+
}
452+
} else {
453+
end = SourcePos{
454+
Filename: dep,
455+
Line: int(loc.Span[0]),
456+
Col: int(loc.Span[2]),
457+
}
458+
}
459+
*srcSpanAddr = ast2.NewSourceSpan(start, end)
445460
found = true
446461
break
447462
}
448463
}
449464
if !found {
450-
*srcPosAddr = *ast.UnknownPos(dep)
465+
*srcSpanAddr = ast2.UnknownSpan(dep)
451466
}
452467
defer func() {
453-
*srcPosAddr = orig
468+
*srcSpanAddr = orig
454469
}()
455470

456-
return parseToProtoRecursive(res, dep, rep, srcPosAddr, results)
471+
return parseToProtoRecursive(res, dep, rep, srcSpanAddr, results)
457472
}()
458473
if err != nil {
459474
return err
@@ -496,8 +511,8 @@ func newReporter(errRep ErrorReporter, warnRep WarningReporter) reporter.Reporte
496511
return reporter.NewReporter(errRep, warnRep)
497512
}
498513

499-
func (p Parser) getResolver(filenames []string) (protocompile.Resolver, *SourcePos) {
500-
var srcPos SourcePos
514+
func (p Parser) getResolver(filenames []string) (protocompile.Resolver, *ast2.SourceSpan) {
515+
var srcSpan ast2.SourceSpan
501516
accessor := p.Accessor
502517
if accessor == nil {
503518
accessor = func(name string) (io.ReadCloser, error) {
@@ -512,8 +527,8 @@ func (p Parser) getResolver(filenames []string) (protocompile.Resolver, *SourceP
512527
// errors that don't include the filename that failed are no bueno
513528
err = errorWithFilename{filename: filename, underlying: err}
514529
}
515-
if srcPos.Filename != "" {
516-
err = reporter.Error(srcPos, err)
530+
if srcSpan != nil {
531+
err = reporter.Error(srcSpan, err)
517532
}
518533
}
519534
return in, err
@@ -552,7 +567,7 @@ func (p Parser) getResolver(filenames []string) (protocompile.Resolver, *SourceP
552567
}
553568
return backupResolver.FindFileByPath(path)
554569
}),
555-
}, &srcPos
570+
}, &srcSpan
556571
}
557572

558573
func fixupFilenames(protos map[string]parser.Result) (revisedProtos map[string]parser.Result, rewrittenPaths map[string]string) {

desc/protoparse/reporting_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func TestErrorReporting(t *testing.T) {
5757
`,
5858
},
5959
expectedErrs: []string{
60-
"test.proto:5:41: syntax error: unexpected \"enum\", expecting ';' or '.'",
60+
"test.proto:5:41: expected ';'",
6161
"test.proto:5:69: syntax error: unexpected ';', expecting '='",
6262
"test.proto:7:53: syntax error: unexpected '='",
6363
},
@@ -132,14 +132,14 @@ func TestErrorReporting(t *testing.T) {
132132
`,
133133
},
134134
expectedErrs: []string{
135-
"test2.proto:7:49: syntax error: unexpected identifier, expecting \"option\" or \"rpc\" or ';' or '}'",
135+
"test2.proto:7:49: syntax error: unexpected identifier, expecting \"option\" or \"rpc\" or '}'",
136136
"test1.proto:5:62: syntax error: unexpected '-', expecting int literal",
137137
"test1.proto:8:62: syntax error: unexpected ';', expecting \"returns\"",
138138
},
139139
expectedErrsAlt: []string{
140140
"test1.proto:5:62: syntax error: unexpected '-', expecting int literal",
141141
"test1.proto:8:62: syntax error: unexpected ';', expecting \"returns\"",
142-
"test2.proto:7:49: syntax error: unexpected identifier, expecting \"option\" or \"rpc\" or ';' or '}'",
142+
"test2.proto:7:49: syntax error: unexpected identifier, expecting \"option\" or \"rpc\" or '}'",
143143
},
144144
},
145145
{

desc/protoparse/validate_test.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@ func TestBasicValidation(t *testing.T) {
107107
},
108108
{
109109
contents: `message Foo { option map_entry = true; }`,
110-
errMsg: `test.proto:1:34: message Foo: map_entry option should not be set explicitly; use map type instead`,
110+
errMsg: `test.proto:1:22: message Foo: map_entry option should not be set explicitly; use map type instead`,
111111
},
112112
{
113113
contents: `message Foo { option map_entry = false; }`,
114-
succeeds: true, // okay if explicit setting is false
114+
errMsg: `test.proto:1:22: message Foo: map_entry option should not be set explicitly; use map type instead`,
115115
},
116116
{
117117
contents: `syntax = "proto2"; message Foo { string s = 1; }`,
@@ -131,15 +131,15 @@ func TestBasicValidation(t *testing.T) {
131131
},
132132
{
133133
contents: `syntax = "proto3"; message Foo { required string s = 1; }`,
134-
errMsg: `test.proto:1:34: field Foo.s: label 'required' is not allowed in proto3`,
134+
errMsg: `test.proto:1:34: field Foo.s: label 'required' is not allowed in proto3 or editions`,
135135
},
136136
{
137137
contents: `message Foo { extensions 1 to max; } extend Foo { required string sss = 100; }`,
138-
errMsg: `test.proto:1:51: field sss: extension fields cannot be 'required'`,
138+
errMsg: `test.proto:1:51: extension sss: extension fields cannot be 'required'`,
139139
},
140140
{
141141
contents: `syntax = "proto3"; message Foo { optional group Grp = 1 { } }`,
142-
errMsg: `test.proto:1:43: field Foo.grp: groups are not allowed in proto3`,
142+
errMsg: `test.proto:1:43: field Foo.grp: groups are not allowed in proto3 or editions`,
143143
},
144144
{
145145
contents: `syntax = "proto3"; message Foo { extensions 1 to max; }`,
@@ -247,11 +247,11 @@ func TestBasicValidation(t *testing.T) {
247247
},
248248
{
249249
contents: `message Foo { reserved "foo", "foo"; }`,
250-
errMsg: `test.proto:1:31: name "foo" is reserved multiple times`,
250+
errMsg: `test.proto:1:31: name "foo" is already reserved at test.proto:1:24`,
251251
},
252252
{
253253
contents: `message Foo { reserved "foo"; reserved "foo"; }`,
254-
errMsg: `test.proto:1:40: name "foo" is reserved multiple times`,
254+
errMsg: `test.proto:1:40: name "foo" is already reserved at test.proto:1:24`,
255255
},
256256
{
257257
contents: `message Foo { reserved "foo"; optional string foo = 1; }`,
@@ -279,7 +279,7 @@ func TestBasicValidation(t *testing.T) {
279279
},
280280
{
281281
contents: `enum Foo { reserved = 1; }`,
282-
errMsg: `test.proto:1:21: syntax error: unexpected '=', expecting string literal or int literal or '-'`,
282+
errMsg: `test.proto:1:21: syntax error: unexpected '='`,
283283
},
284284
{
285285
contents: `syntax = "proto3"; enum message { unset = 0; } message Foo { message bar = 1; }`,
@@ -291,7 +291,7 @@ func TestBasicValidation(t *testing.T) {
291291
},
292292
{
293293
contents: `syntax = "proto3"; enum reserved { unset = 0; } message Foo { reserved bar = 1; }`,
294-
errMsg: `test.proto:1:72: syntax error: unexpected identifier, expecting string literal or int literal`,
294+
errMsg: `test.proto:1:76: expected ';'`,
295295
},
296296
{
297297
contents: `syntax = "proto3"; enum extend { unset = 0; } message Foo { extend bar = 1; }`,

0 commit comments

Comments
 (0)