diff --git a/doc/print.go b/doc/print.go index 4d6b043..df4ce3f 100644 --- a/doc/print.go +++ b/doc/print.go @@ -104,6 +104,11 @@ type printer struct { groupMode map[int]mode lineSuffix []command shouldRemeasure bool + + // fits scratch: the width check is called for every line candidate + // and would otherwise allocate a builder and a command stack per call. + fitOutput strings.Builder + fitCommands []command } func (p *printer) write(s string) { @@ -314,9 +319,11 @@ func (p *printer) fits(next command, rest []command, remainingWidth int, hasLine hasPendingSpace := false // output is only used for width counting because trim needs to look // backwards for spaces. - var output strings.Builder + p.fitOutput.Reset() + output := &p.fitOutput - commands := []command{next} + p.fitCommands = p.fitCommands[:0] + commands := append(p.fitCommands, next) for remainingWidth >= 0 { if p.fitsDBG { diff --git a/formatter/bench_test.go b/formatter/bench_test.go new file mode 100644 index 0000000..4902900 --- /dev/null +++ b/formatter/bench_test.go @@ -0,0 +1,29 @@ +package formatter + +import ( + "os" + "testing" + + "github.com/karitham/thrift-ls/syntax" +) + +var benchSrc = func() []byte { + b, err := os.ReadFile("../syntax/testdata/bench.thrift") + if err != nil { + panic(err) + } + return b +}() + +func BenchmarkParseFormat(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + doc, errs := syntax.Parse(benchSrc) + if len(errs) > 0 { + b.Fatal(errs) + } + if _, err := Format(doc, Options{}); err != nil { + b.Fatal(err) + } + } +} diff --git a/formatter/body.go b/formatter/body.go index 3710d2d..ffeee27 100644 --- a/formatter/body.go +++ b/formatter/body.go @@ -13,7 +13,7 @@ func (f *formatter) structLike(v *syntax.Struct) doc.Doc { close := f.scanKind(open+1, v.TokEnd(), syntax.TokenRBrace) parts := []doc.Doc{ - f.emitTokens(v.TokStart(), open, emitOpts{skipText: map[int]bool{open: true}, breakSkip: true}), + f.emitTokens(v.TokStart(), open, emitOpts{skipText: []int{open}, breakSkip: true}), f.bracedBody(v.Fields, open, close, close != v.TokEnd(), f.constructOf(v.Kind)), } if v.Annotations != nil { @@ -32,7 +32,7 @@ func (f *formatter) enum(v *syntax.Enum) doc.Doc { close := f.scanKind(open+1, v.TokEnd(), syntax.TokenRBrace) parts := []doc.Doc{ - f.emitTokens(v.TokStart(), open, emitOpts{skipText: map[int]bool{open: true}, breakSkip: true}), + f.emitTokens(v.TokStart(), open, emitOpts{skipText: []int{open}, breakSkip: true}), f.bracedEnumBody(v.Values, open, close, close != v.TokEnd()), } if v.Annotations != nil { @@ -135,7 +135,7 @@ func (f *formatter) bracedEnumBody(values []*syntax.EnumValue, open, close int, func (f *formatter) closingTriviaAt(close int) []doc.Doc { tok := f.token(close) - var parts []doc.Doc + parts := make([]doc.Doc, 0, 8) if len(tok.Leading) > 0 { parts = append(parts, doc.HardLine) @@ -160,7 +160,7 @@ func (f *formatter) closingTriviaAt(close int) []doc.Doc { func (f *formatter) openTriviaAt(open int) []doc.Doc { tok := f.token(open) - var parts []doc.Doc + parts := make([]doc.Doc, 0, 8) if len(tok.Trailing) > 0 { for _, c := range tok.Trailing { @@ -179,7 +179,7 @@ func (f *formatter) service(v *syntax.Service) doc.Doc { open := f.scanKind(v.TokStart(), v.TokEnd(), syntax.TokenLBrace) close := f.scanKind(open+1, v.TokEnd(), syntax.TokenRBrace) - var parts []doc.Doc + parts := make([]doc.Doc, 0, 8) for i, fn := range v.Functions { if i > 0 { @@ -213,7 +213,7 @@ func (f *formatter) service(v *syntax.Service) doc.Doc { } out := []doc.Doc{ - f.emitTokens(v.TokStart(), open, emitOpts{skipText: map[int]bool{open: true}, breakSkip: true}), + f.emitTokens(v.TokStart(), open, emitOpts{skipText: []int{open}, breakSkip: true}), body, } if v.Annotations != nil { @@ -245,7 +245,7 @@ func (f *formatter) functionBody(v *syntax.Function) doc.Doc { // The open paren's text is emitted by the args group; its trailing // trivia belongs to openTrivia. open := f.scanKind(v.TokStart(), v.TokEnd(), syntax.TokenLParen) - header := f.emitTokens(v.TokStart(), open, emitOpts{skipText: map[int]bool{open: true}, breakSkip: true}) + header := f.emitTokens(v.TokStart(), open, emitOpts{skipText: []int{open}, breakSkip: true}) // Comments or blank lines in the arguments force the multiline layout: // the flat argument group would drop them. @@ -391,7 +391,7 @@ func (f *formatter) functionBrokenArgs(v *syntax.Function, header doc.Doc) doc.D // annotations, and any stray tokens lenient sources leave — everything the // structural layout does not emit itself. open is the args open paren. func (f *formatter) functionTail(v *syntax.Function, open int) doc.Doc { - var parts []doc.Doc + parts := make([]doc.Doc, 0, 8) argsClose := parenClose(v.Args, open) if argsClose < v.TokEnd() { @@ -451,7 +451,7 @@ func (f *formatter) tailAfter(idx int) []doc.Doc { // separator per the sepMode option. Comments and blank lines inside // the list are preserved. func (f *formatter) brokenFields(fields []*syntax.Field, sepMode SeparatorMode) doc.Doc { - var parts []doc.Doc + parts := make([]doc.Doc, 0, 8) for i, field := range fields { if i > 0 { diff --git a/formatter/field.go b/formatter/field.go index 79ddf53..c59d6ce 100644 --- a/formatter/field.go +++ b/formatter/field.go @@ -14,7 +14,7 @@ import ( // the body to break. Column alignment applies per blank-line group, // matching the previous formatter. func (f *formatter) fieldList(fields []*syntax.Field, bodyID int, sepMode SeparatorMode) doc.Doc { - var parts []doc.Doc + parts := make([]doc.Doc, 0, 8) for i, field := range fields { if i > 0 { @@ -63,7 +63,7 @@ func sepText(prevSep syntax.TokenKind, mode SeparatorMode) string { // enumValueList formats enum bodies with the same layout as fieldList. func (f *formatter) enumValueList(values []*syntax.EnumValue, bodyID int) doc.Doc { - var parts []doc.Doc + parts := make([]doc.Doc, 0, 8) for i, value := range values { if i > 0 { @@ -350,7 +350,7 @@ func (f *formatter) fieldContent(v *syntax.Field, align *columnAlign, padded boo o := emitOpts{breakTrailing: true} if v.Sep != 0 { - o.skipText = map[int]bool{v.TokEnd(): true} + o.skipText = []int{v.TokEnd()} o.breakSkip = sepEmits(v.Sep, sepMode) } @@ -365,7 +365,7 @@ func (f *formatter) fieldContent(v *syntax.Field, align *columnAlign, padded boo // when the field carries comments that make the padded widths unknowable. // The prefix is the leading padding of a field without an id whose // requiredness column is empty. -func (f *formatter) fieldPads(v *syntax.Field, a *columnAlign) (map[int]string, string) { +func (f *formatter) fieldPads(v *syntax.Field, a *columnAlign) ([]padEntry, string) { start, end := v.TokStart(), v.TokEnd() if v.Sep != 0 { end-- @@ -383,19 +383,19 @@ func (f *formatter) fieldPads(v *syntax.Field, a *columnAlign) (map[int]string, } } - pads := map[int]string{} + var pads []padEntry if v.FieldID != nil { - pads[v.TokStart()+1] = padRight("", a.idWidth-len(v.FieldID.Text)-1) + pads = append(pads, padEntry{v.TokStart() + 1, padRight("", a.idWidth-len(v.FieldID.Text)-1)}) } if v.Req != 0 { - pads[v.Type.TokStart()-1] = padRight("", a.reqWidth-len(v.Req.String())) + pads = append(pads, padEntry{v.Type.TokStart() - 1, padRight("", a.reqWidth-len(v.Req.String()))}) } else if a.hasReq { // The empty requiredness column: extend the id pad by one column // plus the missing req width, or lead the field with it when there // is no id token to pad after. if v.FieldID != nil { - pads[v.TokStart()+1] += padRight("", a.reqWidth+1) + pads = append(pads, padEntry{v.TokStart() + 1, padRight("", a.reqWidth+1)}) } else { return nil, padRight("", a.reqWidth+1) } @@ -407,11 +407,11 @@ func (f *formatter) fieldPads(v *syntax.Field, a *columnAlign) (map[int]string, end = v.Type.Annotations.TokStart() - 1 } - pads[end] = padRight("", a.typeWidth-len(typeText(v.Type))) + pads = append(pads, padEntry{end, padRight("", a.typeWidth-len(typeText(v.Type)))}) } if v.Value != nil && a.nameWidth > 0 { - pads[v.Name.TokStart()] = padRight("", a.nameWidth-len(v.Name.Text)) + pads = append(pads, padEntry{v.Name.TokStart(), padRight("", a.nameWidth-len(v.Name.Text))}) } return pads, "" @@ -440,12 +440,12 @@ func (f *formatter) enumValueContent(v *syntax.EnumValue, align *columnAlign, pa o := emitOpts{breakTrailing: true} if v.Sep != 0 { - o.skipText = map[int]bool{v.TokEnd(): true} + o.skipText = []int{v.TokEnd()} o.breakSkip = sepEmits(v.Sep, sepMode) } if padded && align.enumAssign && align.nameWidth > 0 { - o.pads = map[int]string{v.Name.TokStart(): padRight("", align.nameWidth-len(v.Name.Text))} + o.pads = []padEntry{{v.Name.TokStart(), padRight("", align.nameWidth-len(v.Name.Text))}} } return f.emitWithAnnotations(v.TokStart(), v.TokEnd(), v.Annotations, o) diff --git a/formatter/format.go b/formatter/format.go index b7246c1..b010962 100644 --- a/formatter/format.go +++ b/formatter/format.go @@ -267,14 +267,45 @@ func (f *formatter) token(i int) syntax.Token { // emitOpts controls token emission. type emitOpts struct { - leading bool // emit the first token's leading trivia - trailing bool // emit the last token's trailing trivia - breakTrailing bool // line-comment trailing forces groups to break - skipText map[int]bool // tokens whose text and gap are suppressed - breakSkip bool // hard line before a skipped token whose text + leading bool // emit the first token's leading trivia + trailing bool // emit the last token's trailing trivia + breakTrailing bool // line-comment trailing forces groups to break + skipText []int // token indexes whose text and gap are suppressed + breakSkip bool // hard line before a skipped token whose text // the caller emits (separators) - pads map[int]string // spaces inserted after a token, before its gap - prefix string // spaces emitted before the first token + pads []padEntry // spaces inserted after a token, before its gap + prefix string // spaces emitted before the first token +} + +// padEntry is one alignment pad at a token index. +type padEntry struct { + idx int + text string +} + +// containsInt reports whether xs contains v. +func containsInt(xs []int, v int) bool { + for _, x := range xs { + if x == v { + return true + } + } + + return false +} + +// padAt returns the combined pads for the token index, or "". Multiple +// entries at the same index (id pad + requiredness column) concatenate. +func padAt(pads []padEntry, idx int) string { + var out string + + for _, p := range pads { + if p.idx == idx { + out += p.text + } + } + + return out } // emitTokens renders the tokens in [start, end] with their trivia, joined @@ -283,7 +314,7 @@ type emitOpts struct { // corresponding flag is set. skipText suppresses separator tokens that the // structural layout emits itself; pads widen alignment columns. func (f *formatter) emitTokens(start, end int, o emitOpts) doc.Doc { - var parts []doc.Doc + parts := make([]doc.Doc, 0, 8) if o.prefix != "" { parts = append(parts, doc.Text(o.prefix)) } @@ -291,7 +322,7 @@ func (f *formatter) emitTokens(start, end int, o emitOpts) doc.Doc { for i := start; i <= end; i++ { tok := f.token(i) - skipped := o.skipText[i] + skipped := containsInt(o.skipText, i) if i > start { if skipped { // Leading trivia always forces a hard line; a trailing @@ -328,7 +359,7 @@ func (f *formatter) emitTokens(start, end int, o emitOpts) doc.Doc { } if !skipped && o.pads != nil { - if pad, ok := o.pads[i]; ok && pad != "" { + if pad := padAt(o.pads, i); pad != "" { parts = append(parts, doc.Text(pad)) } } @@ -448,7 +479,7 @@ func (f *formatter) leadingComments(n syntax.Node) []doc.Doc { return nil } - var parts []doc.Doc + parts := make([]doc.Doc, 0, 8) prevBlank := 0 for _, c := range tok.Leading { @@ -469,7 +500,7 @@ func (f *formatter) leadingComments(n syntax.Node) []doc.Doc { // the separator already ends with a line comment, these comments cannot // share the line and get their own lines instead. func (f *formatter) trailingComments(n syntax.Node, sepEmitted bool) []doc.Doc { - var parts []doc.Doc + parts := make([]doc.Doc, 0, 8) // Comments attached to a separator share the separator's own line, // unless the separator is not emitted (the mode drops it): then a line // comment before it would swallow them, and they need their own lines. @@ -543,7 +574,7 @@ func (f *formatter) nodeBody(n syntax.Node) doc.Doc { // document assembles the whole file: top-level nodes separated by hard // lines, blank lines preserved, and trailing comments. func (f *formatter) document() doc.Doc { - var parts []doc.Doc + parts := make([]doc.Doc, 0, 8) for i, n := range f.doc.Nodes { if i > 0 { diff --git a/syntax/bench_test.go b/syntax/bench_test.go new file mode 100644 index 0000000..e87dcc4 --- /dev/null +++ b/syntax/bench_test.go @@ -0,0 +1,28 @@ +package syntax + +import ( + "os" + "testing" +) + +var benchSrc = func() []byte { + b, err := os.ReadFile("testdata/bench.thrift") + if err != nil { + panic(err) + } + return b +}() + +func BenchmarkParse(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _, _ = Parse(benchSrc) + } +} + +func BenchmarkLex(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _, _ = Lex(benchSrc) + } +} diff --git a/syntax/lexer.go b/syntax/lexer.go index 26bd4a2..605af0a 100644 --- a/syntax/lexer.go +++ b/syntax/lexer.go @@ -260,7 +260,10 @@ type srcPos struct { func (l *lexer) run() ([]Token, []Error) { l.line, l.col = 1, 1 - var tokens []Token + // A thrift token averages roughly six source bytes. Sizing the slice + // up front avoids repeated growth reallocs, which dominate lexing cost + // (each realloc zeroes a large backing array). + tokens := make([]Token, 0, len(l.src)/6+8) for { prevLine := -1 diff --git a/syntax/testdata/bench.thrift b/syntax/testdata/bench.thrift new file mode 100644 index 0000000..b813151 --- /dev/null +++ b/syntax/testdata/bench.thrift @@ -0,0 +1,718 @@ +namespace go federation +include "mobile_suit.zeon.thrift" + +struct FederationUnit0 { + 1: required binary field_0 (api_field = "field_0") + 2: required i64 field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required i32 field_3 (api_field = "field_3") + 5: required binary field_4 (api_field = "field_4") + 6: required string field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required double field_7 (api_field = "field_7") +} + +struct FederationUnit1 { + 1: required double field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required string field_2 (api_field = "field_2") + 4: required bool field_3 (api_field = "field_3") + 5: required i64 field_4 (api_field = "field_4") + 6: required double field_5 (api_field = "field_5") + 7: required binary field_6 (api_field = "field_6") + 8: required uuid field_7 (api_field = "field_7") +} + +struct FederationUnit2 { + 1: required bool field_0 (api_field = "field_0") + 2: required uuid field_1 (api_field = "field_1") + 3: required bool field_2 (api_field = "field_2") + 4: required binary field_3 (api_field = "field_3") + 5: required binary field_4 (api_field = "field_4") + 6: required string field_5 (api_field = "field_5") + 7: required binary field_6 (api_field = "field_6") + 8: required string field_7 (api_field = "field_7") +} + +struct FederationUnit3 { + 1: required double field_0 (api_field = "field_0") + 2: required string field_1 (api_field = "field_1") + 3: required string field_2 (api_field = "field_2") + 4: required i64 field_3 (api_field = "field_3") + 5: required i64 field_4 (api_field = "field_4") + 6: required uuid field_5 (api_field = "field_5") + 7: required string field_6 (api_field = "field_6") + 8: required i64 field_7 (api_field = "field_7") +} + +struct FederationUnit4 { + 1: required bool field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required i32 field_2 (api_field = "field_2") + 4: required i32 field_3 (api_field = "field_3") + 5: required string field_4 (api_field = "field_4") + 6: required double field_5 (api_field = "field_5") + 7: required bool field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit5 { + 1: required double field_0 (api_field = "field_0") + 2: required binary field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required i64 field_3 (api_field = "field_3") + 5: required i64 field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required i32 field_6 (api_field = "field_6") + 8: required uuid field_7 (api_field = "field_7") +} + +struct FederationUnit6 { + 1: required string field_0 (api_field = "field_0") + 2: required string field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required binary field_3 (api_field = "field_3") + 5: required bool field_4 (api_field = "field_4") + 6: required uuid field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required uuid field_7 (api_field = "field_7") +} + +struct FederationUnit7 { + 1: required bool field_0 (api_field = "field_0") + 2: required uuid field_1 (api_field = "field_1") + 3: required i64 field_2 (api_field = "field_2") + 4: required uuid field_3 (api_field = "field_3") + 5: required double field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required double field_6 (api_field = "field_6") + 8: required binary field_7 (api_field = "field_7") +} + +struct FederationUnit8 { + 1: required bool field_0 (api_field = "field_0") + 2: required uuid field_1 (api_field = "field_1") + 3: required string field_2 (api_field = "field_2") + 4: required string field_3 (api_field = "field_3") + 5: required i32 field_4 (api_field = "field_4") + 6: required uuid field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required double field_7 (api_field = "field_7") +} + +struct FederationUnit9 { + 1: required string field_0 (api_field = "field_0") + 2: required double field_1 (api_field = "field_1") + 3: required string field_2 (api_field = "field_2") + 4: required double field_3 (api_field = "field_3") + 5: required string field_4 (api_field = "field_4") + 6: required double field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit10 { + 1: required string field_0 (api_field = "field_0") + 2: required string field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required bool field_3 (api_field = "field_3") + 5: required bool field_4 (api_field = "field_4") + 6: required string field_5 (api_field = "field_5") + 7: required binary field_6 (api_field = "field_6") + 8: required i64 field_7 (api_field = "field_7") +} + +struct FederationUnit11 { + 1: required binary field_0 (api_field = "field_0") + 2: required string field_1 (api_field = "field_1") + 3: required uuid field_2 (api_field = "field_2") + 4: required bool field_3 (api_field = "field_3") + 5: required double field_4 (api_field = "field_4") + 6: required binary field_5 (api_field = "field_5") + 7: required binary field_6 (api_field = "field_6") + 8: required i64 field_7 (api_field = "field_7") +} + +struct FederationUnit12 { + 1: required bool field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required string field_3 (api_field = "field_3") + 5: required double field_4 (api_field = "field_4") + 6: required double field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required double field_7 (api_field = "field_7") +} + +struct FederationUnit13 { + 1: required uuid field_0 (api_field = "field_0") + 2: required i64 field_1 (api_field = "field_1") + 3: required i64 field_2 (api_field = "field_2") + 4: required string field_3 (api_field = "field_3") + 5: required i32 field_4 (api_field = "field_4") + 6: required binary field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required uuid field_7 (api_field = "field_7") +} + +struct FederationUnit14 { + 1: required uuid field_0 (api_field = "field_0") + 2: required string field_1 (api_field = "field_1") + 3: required bool field_2 (api_field = "field_2") + 4: required string field_3 (api_field = "field_3") + 5: required i32 field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required binary field_6 (api_field = "field_6") + 8: required uuid field_7 (api_field = "field_7") +} + +struct FederationUnit15 { + 1: required bool field_0 (api_field = "field_0") + 2: required double field_1 (api_field = "field_1") + 3: required uuid field_2 (api_field = "field_2") + 4: required bool field_3 (api_field = "field_3") + 5: required string field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required double field_6 (api_field = "field_6") + 8: required string field_7 (api_field = "field_7") +} + +struct FederationUnit16 { + 1: required uuid field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required bool field_2 (api_field = "field_2") + 4: required double field_3 (api_field = "field_3") + 5: required bool field_4 (api_field = "field_4") + 6: required double field_5 (api_field = "field_5") + 7: required bool field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit17 { + 1: required double field_0 (api_field = "field_0") + 2: required double field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required uuid field_3 (api_field = "field_3") + 5: required double field_4 (api_field = "field_4") + 6: required binary field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required string field_7 (api_field = "field_7") +} + +struct FederationUnit18 { + 1: required double field_0 (api_field = "field_0") + 2: required binary field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required i32 field_3 (api_field = "field_3") + 5: required string field_4 (api_field = "field_4") + 6: required double field_5 (api_field = "field_5") + 7: required i64 field_6 (api_field = "field_6") + 8: required binary field_7 (api_field = "field_7") +} + +struct FederationUnit19 { + 1: required i32 field_0 (api_field = "field_0") + 2: required uuid field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required double field_3 (api_field = "field_3") + 5: required double field_4 (api_field = "field_4") + 6: required uuid field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit20 { + 1: required i64 field_0 (api_field = "field_0") + 2: required i32 field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required double field_3 (api_field = "field_3") + 5: required bool field_4 (api_field = "field_4") + 6: required uuid field_5 (api_field = "field_5") + 7: required i32 field_6 (api_field = "field_6") + 8: required i32 field_7 (api_field = "field_7") +} + +struct FederationUnit21 { + 1: required i64 field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required uuid field_2 (api_field = "field_2") + 4: required bool field_3 (api_field = "field_3") + 5: required i32 field_4 (api_field = "field_4") + 6: required binary field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required binary field_7 (api_field = "field_7") +} + +struct FederationUnit22 { + 1: required binary field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required i32 field_2 (api_field = "field_2") + 4: required uuid field_3 (api_field = "field_3") + 5: required double field_4 (api_field = "field_4") + 6: required string field_5 (api_field = "field_5") + 7: required bool field_6 (api_field = "field_6") + 8: required i64 field_7 (api_field = "field_7") +} + +struct FederationUnit23 { + 1: required string field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required binary field_2 (api_field = "field_2") + 4: required bool field_3 (api_field = "field_3") + 5: required string field_4 (api_field = "field_4") + 6: required binary field_5 (api_field = "field_5") + 7: required binary field_6 (api_field = "field_6") + 8: required uuid field_7 (api_field = "field_7") +} + +struct FederationUnit24 { + 1: required double field_0 (api_field = "field_0") + 2: required i64 field_1 (api_field = "field_1") + 3: required string field_2 (api_field = "field_2") + 4: required i64 field_3 (api_field = "field_3") + 5: required i32 field_4 (api_field = "field_4") + 6: required string field_5 (api_field = "field_5") + 7: required string field_6 (api_field = "field_6") + 8: required string field_7 (api_field = "field_7") +} + +struct FederationUnit25 { + 1: required binary field_0 (api_field = "field_0") + 2: required double field_1 (api_field = "field_1") + 3: required i64 field_2 (api_field = "field_2") + 4: required double field_3 (api_field = "field_3") + 5: required i32 field_4 (api_field = "field_4") + 6: required uuid field_5 (api_field = "field_5") + 7: required string field_6 (api_field = "field_6") + 8: required i32 field_7 (api_field = "field_7") +} + +struct FederationUnit26 { + 1: required binary field_0 (api_field = "field_0") + 2: required uuid field_1 (api_field = "field_1") + 3: required binary field_2 (api_field = "field_2") + 4: required double field_3 (api_field = "field_3") + 5: required bool field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required i64 field_6 (api_field = "field_6") + 8: required i64 field_7 (api_field = "field_7") +} + +struct FederationUnit27 { + 1: required string field_0 (api_field = "field_0") + 2: required string field_1 (api_field = "field_1") + 3: required uuid field_2 (api_field = "field_2") + 4: required i64 field_3 (api_field = "field_3") + 5: required double field_4 (api_field = "field_4") + 6: required i32 field_5 (api_field = "field_5") + 7: required double field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit28 { + 1: required i64 field_0 (api_field = "field_0") + 2: required i32 field_1 (api_field = "field_1") + 3: required binary field_2 (api_field = "field_2") + 4: required uuid field_3 (api_field = "field_3") + 5: required string field_4 (api_field = "field_4") + 6: required i32 field_5 (api_field = "field_5") + 7: required double field_6 (api_field = "field_6") + 8: required i64 field_7 (api_field = "field_7") +} + +struct FederationUnit29 { + 1: required binary field_0 (api_field = "field_0") + 2: required double field_1 (api_field = "field_1") + 3: required uuid field_2 (api_field = "field_2") + 4: required i64 field_3 (api_field = "field_3") + 5: required bool field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required i64 field_6 (api_field = "field_6") + 8: required i32 field_7 (api_field = "field_7") +} + +struct FederationUnit30 { + 1: required bool field_0 (api_field = "field_0") + 2: required binary field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required binary field_3 (api_field = "field_3") + 5: required bool field_4 (api_field = "field_4") + 6: required i32 field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required i32 field_7 (api_field = "field_7") +} + +struct FederationUnit31 { + 1: required uuid field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required bool field_2 (api_field = "field_2") + 4: required i32 field_3 (api_field = "field_3") + 5: required uuid field_4 (api_field = "field_4") + 6: required binary field_5 (api_field = "field_5") + 7: required i64 field_6 (api_field = "field_6") + 8: required binary field_7 (api_field = "field_7") +} + +struct FederationUnit32 { + 1: required double field_0 (api_field = "field_0") + 2: required i64 field_1 (api_field = "field_1") + 3: required string field_2 (api_field = "field_2") + 4: required binary field_3 (api_field = "field_3") + 5: required i32 field_4 (api_field = "field_4") + 6: required string field_5 (api_field = "field_5") + 7: required bool field_6 (api_field = "field_6") + 8: required binary field_7 (api_field = "field_7") +} + +struct FederationUnit33 { + 1: required i64 field_0 (api_field = "field_0") + 2: required i64 field_1 (api_field = "field_1") + 3: required binary field_2 (api_field = "field_2") + 4: required i32 field_3 (api_field = "field_3") + 5: required double field_4 (api_field = "field_4") + 6: required i32 field_5 (api_field = "field_5") + 7: required bool field_6 (api_field = "field_6") + 8: required i32 field_7 (api_field = "field_7") +} + +struct FederationUnit34 { + 1: required string field_0 (api_field = "field_0") + 2: required i32 field_1 (api_field = "field_1") + 3: required bool field_2 (api_field = "field_2") + 4: required string field_3 (api_field = "field_3") + 5: required i64 field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required i64 field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit35 { + 1: required double field_0 (api_field = "field_0") + 2: required i64 field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required bool field_3 (api_field = "field_3") + 5: required binary field_4 (api_field = "field_4") + 6: required uuid field_5 (api_field = "field_5") + 7: required i32 field_6 (api_field = "field_6") + 8: required double field_7 (api_field = "field_7") +} + +struct FederationUnit36 { + 1: required binary field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required binary field_2 (api_field = "field_2") + 4: required uuid field_3 (api_field = "field_3") + 5: required bool field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required i64 field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit37 { + 1: required string field_0 (api_field = "field_0") + 2: required i64 field_1 (api_field = "field_1") + 3: required binary field_2 (api_field = "field_2") + 4: required double field_3 (api_field = "field_3") + 5: required i64 field_4 (api_field = "field_4") + 6: required double field_5 (api_field = "field_5") + 7: required i64 field_6 (api_field = "field_6") + 8: required binary field_7 (api_field = "field_7") +} + +struct FederationUnit38 { + 1: required uuid field_0 (api_field = "field_0") + 2: required uuid field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required string field_3 (api_field = "field_3") + 5: required binary field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required bool field_6 (api_field = "field_6") + 8: required string field_7 (api_field = "field_7") +} + +struct FederationUnit39 { + 1: required i64 field_0 (api_field = "field_0") + 2: required i32 field_1 (api_field = "field_1") + 3: required uuid field_2 (api_field = "field_2") + 4: required binary field_3 (api_field = "field_3") + 5: required string field_4 (api_field = "field_4") + 6: required binary field_5 (api_field = "field_5") + 7: required i32 field_6 (api_field = "field_6") + 8: required i32 field_7 (api_field = "field_7") +} + +struct FederationUnit40 { + 1: required double field_0 (api_field = "field_0") + 2: required string field_1 (api_field = "field_1") + 3: required i64 field_2 (api_field = "field_2") + 4: required bool field_3 (api_field = "field_3") + 5: required string field_4 (api_field = "field_4") + 6: required i32 field_5 (api_field = "field_5") + 7: required i32 field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit41 { + 1: required string field_0 (api_field = "field_0") + 2: required double field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required string field_3 (api_field = "field_3") + 5: required uuid field_4 (api_field = "field_4") + 6: required double field_5 (api_field = "field_5") + 7: required i32 field_6 (api_field = "field_6") + 8: required string field_7 (api_field = "field_7") +} + +struct FederationUnit42 { + 1: required uuid field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required i32 field_2 (api_field = "field_2") + 4: required i32 field_3 (api_field = "field_3") + 5: required i64 field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required bool field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit43 { + 1: required string field_0 (api_field = "field_0") + 2: required string field_1 (api_field = "field_1") + 3: required i64 field_2 (api_field = "field_2") + 4: required i64 field_3 (api_field = "field_3") + 5: required uuid field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required i32 field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit44 { + 1: required i32 field_0 (api_field = "field_0") + 2: required double field_1 (api_field = "field_1") + 3: required uuid field_2 (api_field = "field_2") + 4: required double field_3 (api_field = "field_3") + 5: required string field_4 (api_field = "field_4") + 6: required uuid field_5 (api_field = "field_5") + 7: required i64 field_6 (api_field = "field_6") + 8: required uuid field_7 (api_field = "field_7") +} + +struct FederationUnit45 { + 1: required string field_0 (api_field = "field_0") + 2: required uuid field_1 (api_field = "field_1") + 3: required binary field_2 (api_field = "field_2") + 4: required bool field_3 (api_field = "field_3") + 5: required bool field_4 (api_field = "field_4") + 6: required uuid field_5 (api_field = "field_5") + 7: required i32 field_6 (api_field = "field_6") + 8: required i32 field_7 (api_field = "field_7") +} + +struct FederationUnit46 { + 1: required bool field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required i64 field_2 (api_field = "field_2") + 4: required string field_3 (api_field = "field_3") + 5: required i32 field_4 (api_field = "field_4") + 6: required bool field_5 (api_field = "field_5") + 7: required i32 field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit47 { + 1: required double field_0 (api_field = "field_0") + 2: required double field_1 (api_field = "field_1") + 3: required binary field_2 (api_field = "field_2") + 4: required i64 field_3 (api_field = "field_3") + 5: required bool field_4 (api_field = "field_4") + 6: required string field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit48 { + 1: required double field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required i64 field_2 (api_field = "field_2") + 4: required bool field_3 (api_field = "field_3") + 5: required binary field_4 (api_field = "field_4") + 6: required i32 field_5 (api_field = "field_5") + 7: required string field_6 (api_field = "field_6") + 8: required i64 field_7 (api_field = "field_7") +} + +struct FederationUnit49 { + 1: required string field_0 (api_field = "field_0") + 2: required double field_1 (api_field = "field_1") + 3: required binary field_2 (api_field = "field_2") + 4: required uuid field_3 (api_field = "field_3") + 5: required i64 field_4 (api_field = "field_4") + 6: required string field_5 (api_field = "field_5") + 7: required string field_6 (api_field = "field_6") + 8: required string field_7 (api_field = "field_7") +} + +struct FederationUnit50 { + 1: required i32 field_0 (api_field = "field_0") + 2: required binary field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required i64 field_3 (api_field = "field_3") + 5: required i64 field_4 (api_field = "field_4") + 6: required bool field_5 (api_field = "field_5") + 7: required bool field_6 (api_field = "field_6") + 8: required uuid field_7 (api_field = "field_7") +} + +struct FederationUnit51 { + 1: required i64 field_0 (api_field = "field_0") + 2: required string field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required uuid field_3 (api_field = "field_3") + 5: required i64 field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required string field_7 (api_field = "field_7") +} + +struct FederationUnit52 { + 1: required i32 field_0 (api_field = "field_0") + 2: required binary field_1 (api_field = "field_1") + 3: required bool field_2 (api_field = "field_2") + 4: required i32 field_3 (api_field = "field_3") + 5: required uuid field_4 (api_field = "field_4") + 6: required bool field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required bool field_7 (api_field = "field_7") +} + +struct FederationUnit53 { + 1: required double field_0 (api_field = "field_0") + 2: required i64 field_1 (api_field = "field_1") + 3: required double field_2 (api_field = "field_2") + 4: required i64 field_3 (api_field = "field_3") + 5: required i64 field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required i32 field_6 (api_field = "field_6") + 8: required uuid field_7 (api_field = "field_7") +} + +struct FederationUnit54 { + 1: required i32 field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required i32 field_2 (api_field = "field_2") + 4: required i32 field_3 (api_field = "field_3") + 5: required i32 field_4 (api_field = "field_4") + 6: required binary field_5 (api_field = "field_5") + 7: required binary field_6 (api_field = "field_6") + 8: required binary field_7 (api_field = "field_7") +} + +struct FederationUnit55 { + 1: required uuid field_0 (api_field = "field_0") + 2: required binary field_1 (api_field = "field_1") + 3: required bool field_2 (api_field = "field_2") + 4: required i64 field_3 (api_field = "field_3") + 5: required double field_4 (api_field = "field_4") + 6: required binary field_5 (api_field = "field_5") + 7: required uuid field_6 (api_field = "field_6") + 8: required double field_7 (api_field = "field_7") +} + +struct FederationUnit56 { + 1: required string field_0 (api_field = "field_0") + 2: required bool field_1 (api_field = "field_1") + 3: required string field_2 (api_field = "field_2") + 4: required uuid field_3 (api_field = "field_3") + 5: required binary field_4 (api_field = "field_4") + 6: required i64 field_5 (api_field = "field_5") + 7: required double field_6 (api_field = "field_6") + 8: required i64 field_7 (api_field = "field_7") +} + +struct FederationUnit57 { + 1: required binary field_0 (api_field = "field_0") + 2: required i64 field_1 (api_field = "field_1") + 3: required bool field_2 (api_field = "field_2") + 4: required i64 field_3 (api_field = "field_3") + 5: required i32 field_4 (api_field = "field_4") + 6: required i32 field_5 (api_field = "field_5") + 7: required binary field_6 (api_field = "field_6") + 8: required string field_7 (api_field = "field_7") +} + +struct FederationUnit58 { + 1: required uuid field_0 (api_field = "field_0") + 2: required uuid field_1 (api_field = "field_1") + 3: required binary field_2 (api_field = "field_2") + 4: required string field_3 (api_field = "field_3") + 5: required uuid field_4 (api_field = "field_4") + 6: required binary field_5 (api_field = "field_5") + 7: required i64 field_6 (api_field = "field_6") + 8: required i32 field_7 (api_field = "field_7") +} + +struct FederationUnit59 { + 1: required binary field_0 (api_field = "field_0") + 2: required i64 field_1 (api_field = "field_1") + 3: required bool field_2 (api_field = "field_2") + 4: required i32 field_3 (api_field = "field_3") + 5: required double field_4 (api_field = "field_4") + 6: required double field_5 (api_field = "field_5") + 7: required double field_6 (api_field = "field_6") + 8: required uuid field_7 (api_field = "field_7") +} + +enum ZeonForces { + FORCE_0 = 0, + FORCE_1 = 1, + FORCE_2 = 2, + FORCE_3 = 3, + FORCE_4 = 4, + FORCE_5 = 5, + FORCE_6 = 6, + FORCE_7 = 7, + FORCE_8 = 8, + FORCE_9 = 9, + FORCE_10 = 10, + FORCE_11 = 11, + FORCE_12 = 12, + FORCE_13 = 13, + FORCE_14 = 14, + FORCE_15 = 15, + FORCE_16 = 16, + FORCE_17 = 17, + FORCE_18 = 18, + FORCE_19 = 19, + FORCE_20 = 20, + FORCE_21 = 21, + FORCE_22 = 22, + FORCE_23 = 23, + FORCE_24 = 24, + FORCE_25 = 25, + FORCE_26 = 26, + FORCE_27 = 27, + FORCE_28 = 28, + FORCE_29 = 29, +} + +service FederationService { + i64 Mission0(1: i64 arg_0, 2: binary arg_1, 3: i64 arg_2, 4: i64 arg_3) throws (1: federation.BayFull bay) + void Mission1(1: binary arg_0, 2: i32 arg_1, 3: bool arg_2, 4: double arg_3) throws (1: federation.BayFull bay) + i64 Mission2(1: i32 arg_0, 2: binary arg_1, 3: uuid arg_2, 4: i32 arg_3) throws (1: federation.BayFull bay) + void Mission3(1: uuid arg_0, 2: double arg_1, 3: bool arg_2, 4: bool arg_3) throws (1: federation.BayFull bay) + i64 Mission4(1: i64 arg_0, 2: double arg_1, 3: i32 arg_2, 4: string arg_3) throws (1: federation.BayFull bay) + void Mission5(1: i32 arg_0, 2: string arg_1, 3: double arg_2, 4: binary arg_3) throws (1: federation.BayFull bay) + i64 Mission6(1: binary arg_0, 2: string arg_1, 3: i64 arg_2, 4: binary arg_3) throws (1: federation.BayFull bay) + void Mission7(1: binary arg_0, 2: bool arg_1, 3: bool arg_2, 4: double arg_3) throws (1: federation.BayFull bay) + i64 Mission8(1: uuid arg_0, 2: i32 arg_1, 3: bool arg_2, 4: string arg_3) throws (1: federation.BayFull bay) + void Mission9(1: i64 arg_0, 2: bool arg_1, 3: bool arg_2, 4: i64 arg_3) throws (1: federation.BayFull bay) + i64 Mission10(1: bool arg_0, 2: i64 arg_1, 3: string arg_2, 4: uuid arg_3) throws (1: federation.BayFull bay) + void Mission11(1: string arg_0, 2: binary arg_1, 3: bool arg_2, 4: bool arg_3) throws (1: federation.BayFull bay) + i64 Mission12(1: i64 arg_0, 2: bool arg_1, 3: double arg_2, 4: bool arg_3) throws (1: federation.BayFull bay) + void Mission13(1: binary arg_0, 2: i64 arg_1, 3: string arg_2, 4: bool arg_3) throws (1: federation.BayFull bay) + i64 Mission14(1: uuid arg_0, 2: i32 arg_1, 3: double arg_2, 4: binary arg_3) throws (1: federation.BayFull bay) + void Mission15(1: bool arg_0, 2: uuid arg_1, 3: i32 arg_2, 4: bool arg_3) throws (1: federation.BayFull bay) + i64 Mission16(1: binary arg_0, 2: i32 arg_1, 3: bool arg_2, 4: uuid arg_3) throws (1: federation.BayFull bay) + void Mission17(1: string arg_0, 2: bool arg_1, 3: binary arg_2, 4: uuid arg_3) throws (1: federation.BayFull bay) + i64 Mission18(1: i32 arg_0, 2: i64 arg_1, 3: string arg_2, 4: string arg_3) throws (1: federation.BayFull bay) + void Mission19(1: bool arg_0, 2: double arg_1, 3: i32 arg_2, 4: string arg_3) throws (1: federation.BayFull bay) +}