You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-zero/tools/goctl/pkg/parser/api/ast/servicestatement.go

578 lines
14 KiB
Go

package ast
import "github.com/zeromicro/go-zero/tools/goctl/pkg/parser/api/token"
// AtServerStmt represents @server statement.
type AtServerStmt struct {
// AtServer is the @server token.
AtServer *TokenNode
// LParen is the left parenthesis token.
LParen *TokenNode
// Values is the key-value pairs.
Values []*KVExpr
// RParen is the right parenthesis token.
RParen *TokenNode
}
func (a *AtServerStmt) HasHeadCommentGroup() bool {
return a.AtServer.HasHeadCommentGroup()
}
func (a *AtServerStmt) HasLeadingCommentGroup() bool {
return a.RParen.HasLeadingCommentGroup()
}
func (a *AtServerStmt) CommentGroup() (head, leading CommentGroup) {
return a.AtServer.HeadCommentGroup, a.RParen.LeadingCommentGroup
}
func (a *AtServerStmt) Format(prefix ...string) string {
if len(a.Values) == 0 {
return ""
}
var textList []string
for _, v := range a.Values {
if v.Value.IsZeroString() {
continue
}
textList = append(textList, v.Format())
}
if len(textList) == 0 {
return ""
}
w := NewBufferWriter()
atServerNode := transferTokenNode(a.AtServer, withTokenNodePrefix(prefix...), ignoreLeadingComment())
w.Write(withNode(atServerNode, a.LParen), expectSameLine())
w.NewLine()
for _, v := range a.Values {
node := transferTokenNode(v.Key, withTokenNodePrefix(peekOne(prefix)+Indent), ignoreLeadingComment())
w.Write(withNode(node, v.Value), expectIndentInfix(), expectSameLine())
w.NewLine()
}
w.Write(withNode(transferTokenNode(a.RParen, withTokenNodePrefix(prefix...))))
return w.String()
}
func (a *AtServerStmt) End() token.Position {
return a.RParen.End()
}
func (a *AtServerStmt) Pos() token.Position {
return a.AtServer.Pos()
}
func (a *AtServerStmt) stmtNode() {}
type AtDocStmt interface {
Stmt
atDocNode()
}
type AtDocLiteralStmt struct {
AtDoc *TokenNode
Value *TokenNode
}
func (a *AtDocLiteralStmt) HasHeadCommentGroup() bool {
return a.AtDoc.HasHeadCommentGroup()
}
func (a *AtDocLiteralStmt) HasLeadingCommentGroup() bool {
return a.Value.HasLeadingCommentGroup()
}
func (a *AtDocLiteralStmt) CommentGroup() (head, leading CommentGroup) {
return a.AtDoc.HeadCommentGroup, a.Value.LeadingCommentGroup
}
func (a *AtDocLiteralStmt) Format(prefix ...string) string {
if a.Value.IsZeroString() {
return ""
}
w := NewBufferWriter()
atDocNode := transferTokenNode(a.AtDoc, withTokenNodePrefix(prefix...), ignoreLeadingComment())
valueNode := transferTokenNode(a.Value, ignoreHeadComment())
w.Write(withNode(atDocNode, valueNode), expectSameLine())
return w.String()
}
func (a *AtDocLiteralStmt) End() token.Position {
return a.Value.End()
}
func (a *AtDocLiteralStmt) atDocNode() {}
func (a *AtDocLiteralStmt) Pos() token.Position {
return a.AtDoc.Pos()
}
func (a *AtDocLiteralStmt) stmtNode() {}
type AtDocGroupStmt struct {
AtDoc *TokenNode
LParen *TokenNode
Values []*KVExpr
RParen *TokenNode
}
func (a *AtDocGroupStmt) HasHeadCommentGroup() bool {
return a.AtDoc.HasHeadCommentGroup()
}
func (a *AtDocGroupStmt) HasLeadingCommentGroup() bool {
return a.RParen.HasLeadingCommentGroup()
}
func (a *AtDocGroupStmt) CommentGroup() (head, leading CommentGroup) {
return a.AtDoc.HeadCommentGroup, a.RParen.LeadingCommentGroup
}
func (a *AtDocGroupStmt) Format(prefix ...string) string {
if len(a.Values) == 0 {
return ""
}
var textList []string
for _, v := range a.Values {
if v.Value.IsZeroString() {
continue
}
textList = append(textList, v.Format(peekOne(prefix)+Indent))
}
if len(textList) == 0 {
return ""
}
w := NewBufferWriter()
atDocNode := transferTokenNode(a.AtDoc, withTokenNodePrefix(prefix...), ignoreLeadingComment())
w.Write(withNode(atDocNode, a.LParen), expectSameLine())
w.NewLine()
for _, v := range a.Values {
node := transferTokenNode(v.Key, withTokenNodePrefix(peekOne(prefix)+Indent), ignoreLeadingComment())
w.Write(withNode(node, v.Value), expectIndentInfix(), expectSameLine())
w.NewLine()
}
w.Write(withNode(transferTokenNode(a.RParen, withTokenNodePrefix(prefix...))))
return w.String()
}
func (a *AtDocGroupStmt) End() token.Position {
return a.RParen.End()
}
func (a *AtDocGroupStmt) atDocNode() {}
func (a *AtDocGroupStmt) Pos() token.Position {
return a.AtDoc.Pos()
}
func (a *AtDocGroupStmt) stmtNode() {}
type ServiceStmt struct {
AtServerStmt *AtServerStmt
Service *TokenNode
Name *ServiceNameExpr
LBrace *TokenNode
Routes []*ServiceItemStmt
RBrace *TokenNode
}
func (s *ServiceStmt) HasHeadCommentGroup() bool {
if s.AtServerStmt != nil {
return s.AtServerStmt.HasHeadCommentGroup()
}
return s.Service.HasHeadCommentGroup()
}
func (s *ServiceStmt) HasLeadingCommentGroup() bool {
return s.RBrace.HasLeadingCommentGroup()
}
func (s *ServiceStmt) CommentGroup() (head, leading CommentGroup) {
if s.AtServerStmt != nil {
head, _ = s.AtServerStmt.CommentGroup()
return head, s.RBrace.LeadingCommentGroup
}
return s.Service.HeadCommentGroup, s.RBrace.LeadingCommentGroup
}
func (s *ServiceStmt) Format(prefix ...string) string {
w := NewBufferWriter()
if s.AtServerStmt != nil {
text := s.AtServerStmt.Format()
if len(text) > 0 {
w.WriteText(text)
w.NewLine()
}
}
serviceNode := transferTokenNode(s.Service, withTokenNodePrefix(prefix...))
w.Write(withNode(serviceNode, s.Name, s.LBrace), expectSameLine())
if len(s.Routes) == 0 {
w.Write(withNode(transferTokenNode(s.RBrace, withTokenNodePrefix(prefix...))))
return w.String()
}
w.NewLine()
for idx, route := range s.Routes {
routeNode := transfer2TokenNode(route, false, withTokenNodePrefix(peekOne(prefix)+Indent))
w.Write(withNode(routeNode))
if idx < len(s.Routes)-1 {
w.NewLine()
}
}
w.Write(withNode(transferTokenNode(s.RBrace, withTokenNodePrefix(prefix...))))
return w.String()
}
func (s *ServiceStmt) End() token.Position {
return s.RBrace.End()
}
func (s *ServiceStmt) Pos() token.Position {
if s.AtServerStmt != nil {
return s.AtServerStmt.Pos()
}
return s.Service.Pos()
}
func (s *ServiceStmt) stmtNode() {}
type ServiceNameExpr struct {
Name *TokenNode
}
func (s *ServiceNameExpr) HasHeadCommentGroup() bool {
return s.Name.HasHeadCommentGroup()
}
func (s *ServiceNameExpr) HasLeadingCommentGroup() bool {
return s.Name.HasLeadingCommentGroup()
}
func (s *ServiceNameExpr) CommentGroup() (head, leading CommentGroup) {
return s.Name.HeadCommentGroup, s.Name.LeadingCommentGroup
}
func (s *ServiceNameExpr) Format(...string) string {
w := NewBufferWriter()
w.WriteText(s.Name.Format())
return w.String()
}
func (s *ServiceNameExpr) End() token.Position {
return s.Name.End()
}
func (s *ServiceNameExpr) Pos() token.Position {
return s.Name.Pos()
}
func (s *ServiceNameExpr) exprNode() {}
type AtHandlerStmt struct {
AtHandler *TokenNode
Name *TokenNode
}
func (a *AtHandlerStmt) HasHeadCommentGroup() bool {
return a.AtHandler.HasHeadCommentGroup()
}
func (a *AtHandlerStmt) HasLeadingCommentGroup() bool {
return a.Name.HasLeadingCommentGroup()
}
func (a *AtHandlerStmt) CommentGroup() (head, leading CommentGroup) {
return a.AtHandler.HeadCommentGroup, a.Name.LeadingCommentGroup
}
func (a *AtHandlerStmt) Format(prefix ...string) string {
w := NewBufferWriter()
atDocNode := transferTokenNode(a.AtHandler, withTokenNodePrefix(prefix...), ignoreLeadingComment())
nameNode := transferTokenNode(a.Name, ignoreHeadComment())
w.Write(withNode(atDocNode, nameNode), expectSameLine())
return w.String()
}
func (a *AtHandlerStmt) End() token.Position {
return a.Name.End()
}
func (a *AtHandlerStmt) Pos() token.Position {
return a.AtHandler.Pos()
}
func (a *AtHandlerStmt) stmtNode() {}
type ServiceItemStmt struct {
AtDoc AtDocStmt
AtHandler *AtHandlerStmt
Route *RouteStmt
}
func (s *ServiceItemStmt) HasHeadCommentGroup() bool {
if s.AtDoc != nil {
return s.AtDoc.HasHeadCommentGroup()
}
return s.AtHandler.HasHeadCommentGroup()
}
func (s *ServiceItemStmt) HasLeadingCommentGroup() bool {
return s.Route.HasLeadingCommentGroup()
}
func (s *ServiceItemStmt) CommentGroup() (head, leading CommentGroup) {
_, leading = s.Route.CommentGroup()
if s.AtDoc != nil {
head, _ = s.AtDoc.CommentGroup()
return head, leading
}
head, _ = s.AtHandler.CommentGroup()
return head, leading
}
func (s *ServiceItemStmt) Format(prefix ...string) string {
w := NewBufferWriter()
if s.AtDoc != nil {
w.WriteText(s.AtDoc.Format(prefix...))
w.NewLine()
}
w.WriteText(s.AtHandler.Format(prefix...))
w.NewLine()
routeNode := transfer2TokenNode(s.Route, false, withTokenNodePrefix(prefix...))
w.Write(withNode(routeNode))
w.NewLine()
return w.String()
}
func (s *ServiceItemStmt) End() token.Position {
return s.Route.End()
}
func (s *ServiceItemStmt) Pos() token.Position {
if s.AtDoc != nil {
return s.AtDoc.Pos()
}
return s.AtHandler.Pos()
}
func (s *ServiceItemStmt) stmtNode() {}
type RouteStmt struct {
Method *TokenNode
Path *PathExpr
Request *BodyStmt
Returns *TokenNode
Response *BodyStmt
}
func (r *RouteStmt) HasHeadCommentGroup() bool {
return r.Method.HasHeadCommentGroup()
}
func (r *RouteStmt) HasLeadingCommentGroup() bool {
if r.Response != nil {
return r.Response.HasLeadingCommentGroup()
} else if r.Returns != nil {
return r.Returns.HasLeadingCommentGroup()
} else if r.Request != nil {
return r.Request.HasLeadingCommentGroup()
}
return r.Path.HasLeadingCommentGroup()
}
func (r *RouteStmt) CommentGroup() (head, leading CommentGroup) {
head, _ = r.Method.CommentGroup()
if r.Response != nil {
_, leading = r.Response.CommentGroup()
} else if r.Returns != nil {
_, leading = r.Returns.CommentGroup()
} else if r.Request != nil {
_, leading = r.Request.CommentGroup()
}
return head, leading
}
func (r *RouteStmt) Format(prefix ...string) string {
w := NewBufferWriter()
methodNode := transferTokenNode(r.Method, withTokenNodePrefix(prefix...), ignoreLeadingComment())
if r.Response != nil {
if r.Response.Body == nil {
r.Response.RParen = transferTokenNode(r.Response.RParen, ignoreHeadComment())
if r.Request != nil {
w.Write(withNode(methodNode, r.Path, r.Request), expectSameLine())
} else {
w.Write(withNode(methodNode, r.Path), expectSameLine())
}
} else {
r.Response.RParen = transferTokenNode(r.Response.RParen, ignoreHeadComment())
if r.Request != nil {
w.Write(withNode(methodNode, r.Path, r.Request, r.Returns, r.Response), expectSameLine())
} else {
w.Write(withNode(methodNode, r.Path, r.Returns, r.Response), expectSameLine())
}
}
} else if r.Request != nil {
r.Request.RParen = transferTokenNode(r.Request.RParen, ignoreHeadComment())
w.Write(withNode(methodNode, r.Path, r.Request), expectSameLine())
} else {
pathNode := transferTokenNode(r.Path.Value, ignoreHeadComment())
w.Write(withNode(methodNode, pathNode), expectSameLine())
}
return w.String()
}
func (r *RouteStmt) End() token.Position {
if r.Response != nil {
return r.Response.End()
}
if r.Returns != nil {
return r.Returns.Pos()
}
if r.Request != nil {
return r.Request.End()
}
return r.Path.End()
}
func (r *RouteStmt) Pos() token.Position {
return r.Method.Pos()
}
func (r *RouteStmt) stmtNode() {}
type PathExpr struct {
Value *TokenNode
}
func (p *PathExpr) HasHeadCommentGroup() bool {
return p.Value.HasHeadCommentGroup()
}
func (p *PathExpr) HasLeadingCommentGroup() bool {
return p.Value.HasLeadingCommentGroup()
}
func (p *PathExpr) CommentGroup() (head, leading CommentGroup) {
return p.Value.CommentGroup()
}
func (p *PathExpr) Format(prefix ...string) string {
pathNode := transferTokenNode(p.Value, ignoreComment())
return pathNode.Format(prefix...)
}
func (p *PathExpr) End() token.Position {
return p.Value.End()
}
func (p *PathExpr) Pos() token.Position {
return p.Value.Pos()
}
func (p *PathExpr) exprNode() {}
type BodyStmt struct {
LParen *TokenNode
Body *BodyExpr
RParen *TokenNode
}
func (b *BodyStmt) HasHeadCommentGroup() bool {
return b.LParen.HasHeadCommentGroup()
}
func (b *BodyStmt) HasLeadingCommentGroup() bool {
return b.RParen.HasLeadingCommentGroup()
}
func (b *BodyStmt) CommentGroup() (head, leading CommentGroup) {
return b.LParen.HeadCommentGroup, b.RParen.LeadingCommentGroup
}
func (b *BodyStmt) Format(...string) string {
w := NewBufferWriter()
if b.Body == nil {
return ""
}
w.Write(withNode(b.LParen, b.Body, b.RParen), withInfix(NilIndent), expectSameLine())
return w.String()
}
func (b *BodyStmt) End() token.Position {
return b.RParen.End()
}
func (b *BodyStmt) Pos() token.Position {
return b.LParen.Pos()
}
func (b *BodyStmt) stmtNode() {}
type BodyExpr struct {
LBrack *TokenNode
RBrack *TokenNode
Star *TokenNode
Value *TokenNode
}
func (e *BodyExpr) HasHeadCommentGroup() bool {
if e.LBrack != nil {
return e.LBrack.HasHeadCommentGroup()
} else if e.Star != nil {
return e.Star.HasHeadCommentGroup()
} else {
return e.Value.HasHeadCommentGroup()
}
}
func (e *BodyExpr) HasLeadingCommentGroup() bool {
return e.Value.HasLeadingCommentGroup()
}
func (e *BodyExpr) CommentGroup() (head, leading CommentGroup) {
if e.LBrack != nil {
head = e.LBrack.HeadCommentGroup
} else if e.Star != nil {
head = e.Star.HeadCommentGroup
} else {
head = e.Value.HeadCommentGroup
}
return head, e.Value.LeadingCommentGroup
}
func (e *BodyExpr) End() token.Position {
return e.Value.End()
}
func (e *BodyExpr) Format(...string) string {
w := NewBufferWriter()
if e.LBrack != nil {
lbrackNode := transferTokenNode(e.LBrack, ignoreComment())
rbrackNode := transferTokenNode(e.RBrack, ignoreComment())
if e.Star != nil {
starNode := transferTokenNode(e.Star, ignoreComment())
w.Write(withNode(lbrackNode, rbrackNode, starNode, e.Value), withInfix(NilIndent), expectSameLine())
} else {
w.Write(withNode(lbrackNode, rbrackNode, e.Value), withInfix(NilIndent), expectSameLine())
}
} else if e.Star != nil {
starNode := transferTokenNode(e.Star, ignoreComment())
w.Write(withNode(starNode, e.Value), withInfix(NilIndent), expectSameLine())
} else {
w.Write(withNode(e.Value))
}
return w.String()
}
func (e *BodyExpr) Pos() token.Position {
if e.LBrack != nil {
return e.LBrack.Pos()
}
if e.Star != nil {
return e.Star.Pos()
}
return e.Value.Pos()
}
func (e *BodyExpr) exprNode() {}