Skip to content

Commit 67878ec

Browse files
committed
Trivia index
1 parent 5d0deec commit 67878ec

9 files changed

Lines changed: 624 additions & 200 deletions

File tree

experimental/ast/printer/decl.go

Lines changed: 65 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package printer
1717
import (
1818
"github.com/bufbuild/protocompile/experimental/ast"
1919
"github.com/bufbuild/protocompile/experimental/dom"
20-
"github.com/bufbuild/protocompile/experimental/seq"
2120
)
2221

2322
// printDecl dispatches to the appropriate printer based on declaration kind.
@@ -182,13 +181,15 @@ func (p *printer) printSignature(sig ast.Signature) {
182181
inputs := sig.Inputs()
183182
if !inputs.Brackets().IsZero() {
184183
p.withGroup(func(p *printer) {
185-
p.printFusedBrackets(inputs.Brackets(), gapNone, func(p *printer) {
186-
p.withIndent(func(indented *printer) {
187-
indented.push(dom.TextIf(dom.Broken, "\n"))
188-
indented.printTypeListContents(inputs)
189-
p.push(dom.TextIf(dom.Broken, "\n"))
190-
})
184+
openTok, closeTok := inputs.Brackets().StartEnd()
185+
slots := p.trivia.scopeSlots(inputs.Brackets().ID())
186+
p.printToken(openTok, gapNone)
187+
p.withIndent(func(indented *printer) {
188+
indented.push(dom.TextIf(dom.Broken, "\n"))
189+
indented.printTypeListContents(inputs, slots)
190+
p.push(dom.TextIf(dom.Broken, "\n"))
191191
})
192+
p.printToken(closeTok, gapNone)
192193
})
193194
}
194195

@@ -197,45 +198,56 @@ func (p *printer) printSignature(sig ast.Signature) {
197198
outputs := sig.Outputs()
198199
if !outputs.Brackets().IsZero() {
199200
p.withGroup(func(p *printer) {
200-
p.printFusedBrackets(outputs.Brackets(), gapSpace, func(p *printer) {
201-
p.withIndent(func(indented *printer) {
202-
indented.push(dom.TextIf(dom.Broken, "\n"))
203-
indented.printTypeListContents(outputs)
204-
p.push(dom.TextIf(dom.Broken, "\n"))
205-
})
201+
openTok, closeTok := outputs.Brackets().StartEnd()
202+
slots := p.trivia.scopeSlots(outputs.Brackets().ID())
203+
p.printToken(openTok, gapSpace)
204+
p.withIndent(func(indented *printer) {
205+
indented.push(dom.TextIf(dom.Broken, "\n"))
206+
indented.printTypeListContents(outputs, slots)
207+
p.push(dom.TextIf(dom.Broken, "\n"))
206208
})
209+
p.printToken(closeTok, gapNone)
207210
})
208211
}
209212
}
210213
}
211214

212-
func (p *printer) printTypeListContents(list ast.TypeList) {
215+
func (p *printer) printTypeListContents(list ast.TypeList, slots []slot) {
213216
gap := gapNone
214217
for i := range list.Len() {
218+
p.emitSlot(slots, i)
215219
if i > 0 {
216220
p.printToken(list.Comma(i-1), gapNone)
217-
// Use Softline here so args break onto new lines if needed
218221
gap = gapSoftline
219222
}
220223
p.printType(list.At(i), gap)
221224
}
225+
p.emitSlot(slots, list.Len())
222226
}
223227

224228
func (p *printer) printBody(body ast.DeclBody) {
225229
if body.IsZero() {
226230
return
227231
}
228232

229-
p.printFusedBrackets(body.Braces(), gapSpace, func(child *printer) {
230-
if body.Decls().Len() > 0 {
231-
child.withIndent(func(indented *printer) {
232-
for d := range seq.Values(body.Decls()) {
233-
indented.printDecl(d)
234-
}
235-
indented.printRemaining()
236-
})
237-
}
238-
})
233+
braces := body.Braces()
234+
if braces.IsZero() {
235+
return
236+
}
237+
238+
openTok, closeTok := braces.StartEnd()
239+
slots := p.trivia.scopeSlots(braces.ID())
240+
241+
p.printToken(openTok, gapSpace)
242+
243+
closeGap := gapNone
244+
if body.Decls().Len() > 0 || len(slots) > 0 {
245+
closeGap = gapNewline
246+
p.withIndent(func(indented *printer) {
247+
indented.printScopeDecls(slots, body.Decls())
248+
})
249+
}
250+
p.printToken(closeTok, closeGap)
239251
}
240252

241253
func (p *printer) printRange(r ast.DeclRange) {
@@ -258,25 +270,36 @@ func (p *printer) printCompactOptions(co ast.CompactOptions) {
258270
if co.IsZero() {
259271
return
260272
}
273+
274+
brackets := co.Brackets()
275+
if brackets.IsZero() {
276+
return
277+
}
278+
279+
openTok, closeTok := brackets.StartEnd()
280+
slots := p.trivia.scopeSlots(brackets.ID())
281+
261282
p.withGroup(func(p *printer) {
262-
p.printFusedBrackets(co.Brackets(), gapSpace, func(p *printer) {
263-
entries := co.Entries()
264-
p.withIndent(func(indented *printer) {
265-
for i := range entries.Len() {
266-
if i > 0 {
267-
indented.printToken(entries.Comma(i-1), gapNone)
268-
indented.printPath(entries.At(i).Path, gapSoftline)
269-
} else {
270-
indented.printPath(entries.At(i).Path, gapNone)
271-
}
272-
273-
opt := entries.At(i)
274-
if !opt.Equals.IsZero() {
275-
indented.printToken(opt.Equals, gapSpace)
276-
indented.printExpr(opt.Value, gapSpace)
277-
}
283+
p.printToken(openTok, gapSpace)
284+
entries := co.Entries()
285+
p.withIndent(func(indented *printer) {
286+
for i := range entries.Len() {
287+
indented.emitSlot(slots, i)
288+
if i > 0 {
289+
indented.printToken(entries.Comma(i-1), gapNone)
290+
indented.printPath(entries.At(i).Path, gapSoftline)
291+
} else {
292+
indented.printPath(entries.At(i).Path, gapNone)
278293
}
279-
})
294+
295+
opt := entries.At(i)
296+
if !opt.Equals.IsZero() {
297+
indented.printToken(opt.Equals, gapSpace)
298+
indented.printExpr(opt.Value, gapSpace)
299+
}
300+
}
301+
p.emitSlot(slots, entries.Len())
280302
})
303+
p.printToken(closeTok, gapNone)
281304
})
282305
}

experimental/ast/printer/expr.go

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -63,34 +63,55 @@ func (p *printer) printArray(expr ast.ExprArray, gap gapStyle) {
6363
return
6464
}
6565

66-
p.printFusedBrackets(expr.Brackets(), gap, func(child *printer) {
67-
elements := expr.Elements()
68-
for i := range elements.Len() {
69-
elemGap := gapNone
70-
if i > 0 {
71-
child.printToken(elements.Comma(i-1), gapNone)
72-
elemGap = gapSpace
73-
}
74-
child.printExpr(elements.At(i), elemGap)
66+
brackets := expr.Brackets()
67+
if brackets.IsZero() {
68+
return
69+
}
70+
71+
openTok, closeTok := brackets.StartEnd()
72+
slots := p.trivia.scopeSlots(brackets.ID())
73+
74+
p.printToken(openTok, gap)
75+
elements := expr.Elements()
76+
for i := range elements.Len() {
77+
p.emitSlot(slots, i)
78+
elemGap := gapNone
79+
if i > 0 {
80+
p.printToken(elements.Comma(i-1), gapNone)
81+
elemGap = gapSpace
7582
}
76-
})
83+
p.printExpr(elements.At(i), elemGap)
84+
}
85+
p.emitSlot(slots, elements.Len())
86+
p.printToken(closeTok, gapNone)
7787
}
7888

7989
func (p *printer) printDict(expr ast.ExprDict, gap gapStyle) {
8090
if expr.IsZero() {
8191
return
8292
}
8393

84-
p.printFusedBrackets(expr.Braces(), gap, func(child *printer) {
85-
elements := expr.Elements()
86-
if elements.Len() > 0 {
87-
child.withIndent(func(indented *printer) {
88-
for i := range elements.Len() {
89-
indented.printExprField(elements.At(i), gapNewline)
90-
}
91-
})
92-
}
93-
})
94+
braces := expr.Braces()
95+
if braces.IsZero() {
96+
return
97+
}
98+
99+
openTok, closeTok := braces.StartEnd()
100+
slots := p.trivia.scopeSlots(braces.ID())
101+
102+
p.printToken(openTok, gap)
103+
elements := expr.Elements()
104+
if elements.Len() > 0 || len(slots) > 0 {
105+
p.withIndent(func(indented *printer) {
106+
for i := range elements.Len() {
107+
indented.emitSlot(slots, i)
108+
indented.printExprField(elements.At(i), gapNewline)
109+
}
110+
indented.emitSlot(slots, elements.Len())
111+
})
112+
}
113+
114+
p.printToken(closeTok, gapSoftline)
94115
}
95116

96117
func (p *printer) printExprField(expr ast.ExprField, gap gapStyle) {

experimental/ast/printer/path.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,17 @@ func (p *printer) printPath(path ast.Path, gap gapStyle) {
3838
}
3939

4040
if extn := pc.AsExtension(); !extn.IsZero() {
41-
// Extension path component like (foo.bar)
42-
p.printFusedBrackets(pc.Name(), componentGap, func(child *printer) {
43-
child.printPath(extn, gapNone)
44-
})
41+
// Extension path component like (foo.bar).
42+
// The parens are a scope.
43+
parens := pc.Name()
44+
openTok, closeTok := parens.StartEnd()
45+
slots := p.trivia.scopeSlots(parens.ID())
46+
47+
p.printToken(openTok, componentGap)
48+
p.emitSlot(slots, 0)
49+
p.printPath(extn, gapNone)
50+
p.emitSlot(slots, 1)
51+
p.printToken(closeTok, gapNone)
4552
} else {
4653
// Simple identifier
4754
p.printToken(pc.Name(), componentGap)

0 commit comments

Comments
 (0)