blob: ad6328556f07f4f8dcc15edc2957f15f170b3c7d [file] [log] [blame]
Marcel van Lohuizen5274e982019-04-28 17:51:43 +02001// Copyright 2019 CUE Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package protobuf
16
17import (
18 "strings"
Marcel van Lohuizenfbcb3392019-06-25 11:02:21 +020019 "text/scanner"
Marcel van Lohuizen5274e982019-04-28 17:51:43 +020020
Marcel van Lohuizen5274e982019-04-28 17:51:43 +020021 "github.com/emicklei/proto"
22 "golang.org/x/xerrors"
Koichi Shiraishi30a4bee2019-12-26 03:06:48 +090023
24 "cuelang.org/go/cue/ast"
25 "cuelang.org/go/cue/token"
Marcel van Lohuizen5274e982019-04-28 17:51:43 +020026)
27
28// failf panics with a marked error that can be intercepted upon returning
29// from parsing.
Marcel van Lohuizenfbcb3392019-06-25 11:02:21 +020030func failf(pos scanner.Position, format string, args ...interface{}) {
31 panic(protoError{pos, xerrors.Errorf(format, args...)})
Marcel van Lohuizen5274e982019-04-28 17:51:43 +020032}
33
Marcel van Lohuizenfbcb3392019-06-25 11:02:21 +020034func fail(pos scanner.Position, err error) {
35 panic(protoError{pos, err})
Marcel van Lohuizen5274e982019-04-28 17:51:43 +020036}
37
38type protoError struct {
Marcel van Lohuizenfbcb3392019-06-25 11:02:21 +020039 pos scanner.Position
Marcel van Lohuizen5274e982019-04-28 17:51:43 +020040 error
41}
42
43var (
Marcel van Lohuizend094cbe2019-05-20 17:46:48 -040044 newline = token.Newline.Pos()
45 newSection = token.NewSection.Pos()
Marcel van Lohuizen5274e982019-04-28 17:51:43 +020046)
47
48func addComments(f ast.Node, i int, doc, inline *proto.Comment) bool {
49 cg := comment(doc, true)
50 if cg != nil && len(cg.List) > 0 && i > 0 {
51 cg.List[0].Slash = newSection
52 }
53 f.AddComment(cg)
54 f.AddComment(comment(inline, false))
55 return doc != nil
56}
57
58func comment(c *proto.Comment, doc bool) *ast.CommentGroup {
59 if c == nil || len(c.Lines) == 0 {
60 return nil
61 }
62 cg := &ast.CommentGroup{}
63 if doc {
64 cg.Doc = true
65 } else {
66 cg.Line = true
67 cg.Position = 10
68 }
69 for _, s := range c.Lines {
Marcel van Lohuizenb1d44392019-08-23 13:13:54 +020070 s = strings.TrimRight(s, " ")
71 cg.List = append(cg.List, &ast.Comment{Text: "//" + s})
Marcel van Lohuizen5274e982019-04-28 17:51:43 +020072 }
73 return cg
74}
75
Marcel van Lohuizen5274e982019-04-28 17:51:43 +020076func labelName(s string) string {
77 split := strings.Split(s, "_")
78 for i := 1; i < len(split); i++ {
79 split[i] = strings.Title(split[i])
80 }
81 return strings.Join(split, "")
82}