generate: Parse doc comments
This commit is contained in:
parent
e991b5af67
commit
190a89fbb3
@ -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 := ""
|
||||||
if err != nil { return err }
|
for {
|
||||||
if this.EOF() { return nil }
|
err := this.ExpectDesc("message or typedef", TokenMethod, TokenIdent, TokenComment)
|
||||||
|
if err != nil { return err }
|
||||||
|
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 := ""
|
||||||
if err != nil { return TypeTableDefined { }, err }
|
for {
|
||||||
|
err := this.ExpectDesc("table field", TokenKey, TokenRBrace, TokenComment)
|
||||||
|
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, "//"), " ")
|
||||||
|
}
|
||||||
|
|||||||
@ -9,7 +9,7 @@ func TestParse(test *testing.T) {
|
|||||||
correct := defaultProtocol()
|
correct := defaultProtocol()
|
||||||
correct.Messages[0x0000] = Message {
|
correct.Messages[0x0000] = Message {
|
||||||
Name: "Connect",
|
Name: "Connect",
|
||||||
Doc: "Connect is sent from the client to the server as the first message of an\n authenticated transaction.",
|
Doc: "Connect is sent from the client to the server as the first message of an\nauthenticated transaction.",
|
||||||
Type: TypeTableDefined {
|
Type: TypeTableDefined {
|
||||||
Fields: map[uint16] Field {
|
Fields: map[uint16] Field {
|
||||||
0x0000: Field { Name: "Name", Type: TypeString { } },
|
0x0000: Field { Name: "Name", Type: TypeString { } },
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user