generate: Parse doc comments

This commit is contained in:
Sasha Koshka 2025-10-13 16:16:57 -04:00
parent e991b5af67
commit 190a89fbb3
2 changed files with 40 additions and 15 deletions

View File

@ -1,6 +1,7 @@
package generate package generate
import "io" import "io"
import "strings"
import "strconv" import "strconv"
import "git.tebibyte.media/sashakoshka/goparse" import "git.tebibyte.media/sashakoshka/goparse"
@ -47,18 +48,28 @@ func (this *parser) parse() error {
} }
func (this *parser) parseTopLevel() error { func (this *parser) parseTopLevel() error {
err := this.ExpectDesc("message or typedef", TokenMethod, TokenIdent) doc := ""
for {
err := this.ExpectDesc("message or typedef", TokenMethod, TokenIdent, TokenComment)
if err != nil { return err } if err != nil { return err }
if this.EOF() { return nil } if this.EOF() { return nil }
if this.Kind() == TokenComment {
if doc != "" { doc += "\n" }
doc += this.parseComment(this.Value())
this.Next()
} else {
break
}
}
switch this.Kind() { switch this.Kind() {
case TokenMethod: return this.parseMessage() case TokenMethod: return this.parseMessage(doc)
case TokenIdent: return this.parseTypedef() case TokenIdent: return this.parseTypedef(doc)
} }
panic("bug") panic("bug")
} }
func (this *parser) parseMessage() error { func (this *parser) parseMessage(doc string) error {
err := this.Expect(TokenMethod) err := this.Expect(TokenMethod)
if err != nil { return err } if err != nil { return err }
method, err := this.parseHexNumber(this.Value(), 0xFFFF) method, err := this.parseHexNumber(this.Value(), 0xFFFF)
@ -72,13 +83,13 @@ func (this *parser) parseMessage() error {
if err != nil { return err } if err != nil { return err }
this.protocol.Messages[uint16(method)] = Message { this.protocol.Messages[uint16(method)] = Message {
Name: name, Name: name,
// TODO: doc Doc: doc,
Type: typ, Type: typ,
} }
return nil return nil
} }
func (this *parser) parseTypedef() error { func (this *parser) parseTypedef(doc string) error {
err := this.Expect(TokenIdent) err := this.Expect(TokenIdent)
if err != nil { return err } if err != nil { return err }
name := this.Value() name := this.Value()
@ -87,7 +98,7 @@ func (this *parser) parseTypedef() error {
typ, err := this.parseType() typ, err := this.parseType()
if err != nil { return err } if err != nil { return err }
this.protocol.Types[name] = Typedef { this.protocol.Types[name] = Typedef {
// TODO: doc Doc: doc,
Type: typ, Type: typ,
} }
return nil return nil
@ -161,12 +172,22 @@ func (this *parser) parseTypeTable() (TypeTableDefined, error) {
Fields: make(map[uint16] Field), Fields: make(map[uint16] Field),
} }
for { for {
err := this.ExpectDesc("table field", TokenKey, TokenRBrace) doc := ""
for {
err := this.ExpectDesc("table field", TokenKey, TokenRBrace, TokenComment)
if err != nil { return TypeTableDefined { }, err } if err != nil { return TypeTableDefined { }, err }
if this.Kind() == TokenComment {
if doc != "" { doc += "\n" }
doc += this.parseComment(this.Value())
this.Next()
} else {
break
}
}
if this.Is(TokenRBrace) { if this.Is(TokenRBrace) {
break break
} }
key, field, err := this.parseField() key, field, err := this.parseField(doc)
if err != nil { return TypeTableDefined { }, err } if err != nil { return TypeTableDefined { }, err }
typ.Fields[key] = field typ.Fields[key] = field
err = this.Expect(TokenComma, TokenRBrace) err = this.Expect(TokenComma, TokenRBrace)
@ -182,7 +203,7 @@ func (this *parser) parseTypeTable() (TypeTableDefined, error) {
return typ, nil return typ, nil
} }
func (this *parser) parseField() (uint16, Field, error) { func (this *parser) parseField(doc string) (uint16, Field, error) {
err := this.Expect(TokenKey) err := this.Expect(TokenKey)
if err != nil { return 0, Field { }, err } if err != nil { return 0, Field { }, err }
key, err := this.parseHexNumber(this.Value(), 0xFFFF) key, err := this.parseHexNumber(this.Value(), 0xFFFF)
@ -196,7 +217,7 @@ func (this *parser) parseField() (uint16, Field, error) {
if err != nil { return 0, Field { }, err } if err != nil { return 0, Field { }, err }
return uint16(key), Field { return uint16(key), Field {
Name: name, Name: name,
// TODO: doc Doc: doc,
Type: typ, Type: typ,
}, nil }, nil
} }
@ -211,3 +232,7 @@ func (this *parser) parseHexNumber(input string, maxValue int64) (int64, error)
} }
return number, nil return number, nil
} }
func (this *parser) parseComment(input string) string {
return strings.TrimPrefix(strings.TrimPrefix(input, "//"), " ")
}