servicestatement.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. package ast
  2. import "github.com/zeromicro/go-zero/tools/goctl/pkg/parser/api/token"
  3. // AtServerStmt represents @server statement.
  4. type AtServerStmt struct {
  5. // AtServer is the @server token.
  6. AtServer *TokenNode
  7. // LParen is the left parenthesis token.
  8. LParen *TokenNode
  9. // Values is the key-value pairs.
  10. Values []*KVExpr
  11. // RParen is the right parenthesis token.
  12. RParen *TokenNode
  13. }
  14. func (a *AtServerStmt) HasHeadCommentGroup() bool {
  15. return a.AtServer.HasHeadCommentGroup()
  16. }
  17. func (a *AtServerStmt) HasLeadingCommentGroup() bool {
  18. return a.RParen.HasLeadingCommentGroup()
  19. }
  20. func (a *AtServerStmt) CommentGroup() (head, leading CommentGroup) {
  21. return a.AtServer.HeadCommentGroup, a.RParen.LeadingCommentGroup
  22. }
  23. func (a *AtServerStmt) Format(prefix ...string) string {
  24. if len(a.Values) == 0 {
  25. return ""
  26. }
  27. var textList []string
  28. for _, v := range a.Values {
  29. if v.Value.IsZeroString() {
  30. continue
  31. }
  32. textList = append(textList, v.Format())
  33. }
  34. if len(textList) == 0 {
  35. return ""
  36. }
  37. w := NewBufferWriter()
  38. atServerNode := transferTokenNode(a.AtServer, withTokenNodePrefix(prefix...), ignoreLeadingComment())
  39. w.Write(withNode(atServerNode, a.LParen), expectSameLine())
  40. w.NewLine()
  41. for _, v := range a.Values {
  42. node := transferTokenNode(v.Key, withTokenNodePrefix(peekOne(prefix)+Indent), ignoreLeadingComment())
  43. w.Write(withNode(node, v.Value), expectIndentInfix(), expectSameLine())
  44. w.NewLine()
  45. }
  46. w.Write(withNode(transferTokenNode(a.RParen, withTokenNodePrefix(prefix...))))
  47. return w.String()
  48. }
  49. func (a *AtServerStmt) End() token.Position {
  50. return a.RParen.End()
  51. }
  52. func (a *AtServerStmt) Pos() token.Position {
  53. return a.AtServer.Pos()
  54. }
  55. func (a *AtServerStmt) stmtNode() {}
  56. type AtDocStmt interface {
  57. Stmt
  58. atDocNode()
  59. }
  60. type AtDocLiteralStmt struct {
  61. AtDoc *TokenNode
  62. Value *TokenNode
  63. }
  64. func (a *AtDocLiteralStmt) HasHeadCommentGroup() bool {
  65. return a.AtDoc.HasHeadCommentGroup()
  66. }
  67. func (a *AtDocLiteralStmt) HasLeadingCommentGroup() bool {
  68. return a.Value.HasLeadingCommentGroup()
  69. }
  70. func (a *AtDocLiteralStmt) CommentGroup() (head, leading CommentGroup) {
  71. return a.AtDoc.HeadCommentGroup, a.Value.LeadingCommentGroup
  72. }
  73. func (a *AtDocLiteralStmt) Format(prefix ...string) string {
  74. if a.Value.IsZeroString() {
  75. return ""
  76. }
  77. w := NewBufferWriter()
  78. atDocNode := transferTokenNode(a.AtDoc, withTokenNodePrefix(prefix...), ignoreLeadingComment())
  79. valueNode := transferTokenNode(a.Value, ignoreHeadComment())
  80. w.Write(withNode(atDocNode, valueNode), expectSameLine())
  81. return w.String()
  82. }
  83. func (a *AtDocLiteralStmt) End() token.Position {
  84. return a.Value.End()
  85. }
  86. func (a *AtDocLiteralStmt) atDocNode() {}
  87. func (a *AtDocLiteralStmt) Pos() token.Position {
  88. return a.AtDoc.Pos()
  89. }
  90. func (a *AtDocLiteralStmt) stmtNode() {}
  91. type AtDocGroupStmt struct {
  92. AtDoc *TokenNode
  93. LParen *TokenNode
  94. Values []*KVExpr
  95. RParen *TokenNode
  96. }
  97. func (a *AtDocGroupStmt) HasHeadCommentGroup() bool {
  98. return a.AtDoc.HasHeadCommentGroup()
  99. }
  100. func (a *AtDocGroupStmt) HasLeadingCommentGroup() bool {
  101. return a.RParen.HasLeadingCommentGroup()
  102. }
  103. func (a *AtDocGroupStmt) CommentGroup() (head, leading CommentGroup) {
  104. return a.AtDoc.HeadCommentGroup, a.RParen.LeadingCommentGroup
  105. }
  106. func (a *AtDocGroupStmt) Format(prefix ...string) string {
  107. if len(a.Values) == 0 {
  108. return ""
  109. }
  110. var textList []string
  111. for _, v := range a.Values {
  112. if v.Value.IsZeroString() {
  113. continue
  114. }
  115. textList = append(textList, v.Format(peekOne(prefix)+Indent))
  116. }
  117. if len(textList) == 0 {
  118. return ""
  119. }
  120. w := NewBufferWriter()
  121. atDocNode := transferTokenNode(a.AtDoc, withTokenNodePrefix(prefix...), ignoreLeadingComment())
  122. w.Write(withNode(atDocNode, a.LParen), expectSameLine())
  123. w.NewLine()
  124. for _, v := range a.Values {
  125. node := transferTokenNode(v.Key, withTokenNodePrefix(peekOne(prefix)+Indent), ignoreLeadingComment())
  126. w.Write(withNode(node, v.Value), expectIndentInfix(), expectSameLine())
  127. w.NewLine()
  128. }
  129. w.Write(withNode(transferTokenNode(a.RParen, withTokenNodePrefix(prefix...))))
  130. return w.String()
  131. }
  132. func (a *AtDocGroupStmt) End() token.Position {
  133. return a.RParen.End()
  134. }
  135. func (a *AtDocGroupStmt) atDocNode() {}
  136. func (a *AtDocGroupStmt) Pos() token.Position {
  137. return a.AtDoc.Pos()
  138. }
  139. func (a *AtDocGroupStmt) stmtNode() {}
  140. type ServiceStmt struct {
  141. AtServerStmt *AtServerStmt
  142. Service *TokenNode
  143. Name *ServiceNameExpr
  144. LBrace *TokenNode
  145. Routes []*ServiceItemStmt
  146. RBrace *TokenNode
  147. }
  148. func (s *ServiceStmt) HasHeadCommentGroup() bool {
  149. if s.AtServerStmt != nil {
  150. return s.AtServerStmt.HasHeadCommentGroup()
  151. }
  152. return s.Service.HasHeadCommentGroup()
  153. }
  154. func (s *ServiceStmt) HasLeadingCommentGroup() bool {
  155. return s.RBrace.HasLeadingCommentGroup()
  156. }
  157. func (s *ServiceStmt) CommentGroup() (head, leading CommentGroup) {
  158. if s.AtServerStmt != nil {
  159. head, _ = s.AtServerStmt.CommentGroup()
  160. return head, s.RBrace.LeadingCommentGroup
  161. }
  162. return s.Service.HeadCommentGroup, s.RBrace.LeadingCommentGroup
  163. }
  164. func (s *ServiceStmt) Format(prefix ...string) string {
  165. w := NewBufferWriter()
  166. if s.AtServerStmt != nil {
  167. text := s.AtServerStmt.Format()
  168. if len(text) > 0 {
  169. w.WriteText(text)
  170. w.NewLine()
  171. }
  172. }
  173. serviceNode := transferTokenNode(s.Service, withTokenNodePrefix(prefix...))
  174. w.Write(withNode(serviceNode, s.Name, s.LBrace), expectSameLine())
  175. if len(s.Routes) == 0 {
  176. w.Write(withNode(transferTokenNode(s.RBrace, withTokenNodePrefix(prefix...))))
  177. return w.String()
  178. }
  179. w.NewLine()
  180. for idx, route := range s.Routes {
  181. routeNode := transfer2TokenNode(route, false, withTokenNodePrefix(peekOne(prefix)+Indent))
  182. w.Write(withNode(routeNode))
  183. if idx < len(s.Routes)-1 {
  184. w.NewLine()
  185. }
  186. }
  187. w.Write(withNode(transferTokenNode(s.RBrace, withTokenNodePrefix(prefix...))))
  188. return w.String()
  189. }
  190. func (s *ServiceStmt) End() token.Position {
  191. return s.RBrace.End()
  192. }
  193. func (s *ServiceStmt) Pos() token.Position {
  194. if s.AtServerStmt != nil {
  195. return s.AtServerStmt.Pos()
  196. }
  197. return s.Service.Pos()
  198. }
  199. func (s *ServiceStmt) stmtNode() {}
  200. type ServiceNameExpr struct {
  201. Name *TokenNode
  202. }
  203. func (s *ServiceNameExpr) HasHeadCommentGroup() bool {
  204. return s.Name.HasHeadCommentGroup()
  205. }
  206. func (s *ServiceNameExpr) HasLeadingCommentGroup() bool {
  207. return s.Name.HasLeadingCommentGroup()
  208. }
  209. func (s *ServiceNameExpr) CommentGroup() (head, leading CommentGroup) {
  210. return s.Name.HeadCommentGroup, s.Name.LeadingCommentGroup
  211. }
  212. func (s *ServiceNameExpr) Format(...string) string {
  213. w := NewBufferWriter()
  214. w.WriteText(s.Name.Format())
  215. return w.String()
  216. }
  217. func (s *ServiceNameExpr) End() token.Position {
  218. return s.Name.End()
  219. }
  220. func (s *ServiceNameExpr) Pos() token.Position {
  221. return s.Name.Pos()
  222. }
  223. func (s *ServiceNameExpr) exprNode() {}
  224. type AtHandlerStmt struct {
  225. AtHandler *TokenNode
  226. Name *TokenNode
  227. }
  228. func (a *AtHandlerStmt) HasHeadCommentGroup() bool {
  229. return a.AtHandler.HasHeadCommentGroup()
  230. }
  231. func (a *AtHandlerStmt) HasLeadingCommentGroup() bool {
  232. return a.Name.HasLeadingCommentGroup()
  233. }
  234. func (a *AtHandlerStmt) CommentGroup() (head, leading CommentGroup) {
  235. return a.AtHandler.HeadCommentGroup, a.Name.LeadingCommentGroup
  236. }
  237. func (a *AtHandlerStmt) Format(prefix ...string) string {
  238. w := NewBufferWriter()
  239. atDocNode := transferTokenNode(a.AtHandler, withTokenNodePrefix(prefix...), ignoreLeadingComment())
  240. nameNode := transferTokenNode(a.Name, ignoreHeadComment())
  241. w.Write(withNode(atDocNode, nameNode), expectSameLine())
  242. return w.String()
  243. }
  244. func (a *AtHandlerStmt) End() token.Position {
  245. return a.Name.End()
  246. }
  247. func (a *AtHandlerStmt) Pos() token.Position {
  248. return a.AtHandler.Pos()
  249. }
  250. func (a *AtHandlerStmt) stmtNode() {}
  251. type ServiceItemStmt struct {
  252. AtDoc AtDocStmt
  253. AtHandler *AtHandlerStmt
  254. Route *RouteStmt
  255. }
  256. func (s *ServiceItemStmt) HasHeadCommentGroup() bool {
  257. if s.AtDoc != nil {
  258. return s.AtDoc.HasHeadCommentGroup()
  259. }
  260. return s.AtHandler.HasHeadCommentGroup()
  261. }
  262. func (s *ServiceItemStmt) HasLeadingCommentGroup() bool {
  263. return s.Route.HasLeadingCommentGroup()
  264. }
  265. func (s *ServiceItemStmt) CommentGroup() (head, leading CommentGroup) {
  266. _, leading = s.Route.CommentGroup()
  267. if s.AtDoc != nil {
  268. head, _ = s.AtDoc.CommentGroup()
  269. return head, leading
  270. }
  271. head, _ = s.AtHandler.CommentGroup()
  272. return head, leading
  273. }
  274. func (s *ServiceItemStmt) Format(prefix ...string) string {
  275. w := NewBufferWriter()
  276. if s.AtDoc != nil {
  277. w.WriteText(s.AtDoc.Format(prefix...))
  278. w.NewLine()
  279. }
  280. w.WriteText(s.AtHandler.Format(prefix...))
  281. w.NewLine()
  282. routeNode := transfer2TokenNode(s.Route, false, withTokenNodePrefix(prefix...))
  283. w.Write(withNode(routeNode))
  284. w.NewLine()
  285. return w.String()
  286. }
  287. func (s *ServiceItemStmt) End() token.Position {
  288. return s.Route.End()
  289. }
  290. func (s *ServiceItemStmt) Pos() token.Position {
  291. if s.AtDoc != nil {
  292. return s.AtDoc.Pos()
  293. }
  294. return s.AtHandler.Pos()
  295. }
  296. func (s *ServiceItemStmt) stmtNode() {}
  297. type RouteStmt struct {
  298. Method *TokenNode
  299. Path *PathExpr
  300. Request *BodyStmt
  301. Returns *TokenNode
  302. Response *BodyStmt
  303. }
  304. func (r *RouteStmt) HasHeadCommentGroup() bool {
  305. return r.Method.HasHeadCommentGroup()
  306. }
  307. func (r *RouteStmt) HasLeadingCommentGroup() bool {
  308. if r.Response != nil {
  309. return r.Response.HasLeadingCommentGroup()
  310. } else if r.Returns != nil {
  311. return r.Returns.HasLeadingCommentGroup()
  312. } else if r.Request != nil {
  313. return r.Request.HasLeadingCommentGroup()
  314. }
  315. return r.Path.HasLeadingCommentGroup()
  316. }
  317. func (r *RouteStmt) CommentGroup() (head, leading CommentGroup) {
  318. head, _ = r.Method.CommentGroup()
  319. if r.Response != nil {
  320. _, leading = r.Response.CommentGroup()
  321. } else if r.Returns != nil {
  322. _, leading = r.Returns.CommentGroup()
  323. } else if r.Request != nil {
  324. _, leading = r.Request.CommentGroup()
  325. }
  326. return head, leading
  327. }
  328. func (r *RouteStmt) Format(prefix ...string) string {
  329. w := NewBufferWriter()
  330. methodNode := transferTokenNode(r.Method, withTokenNodePrefix(prefix...), ignoreLeadingComment())
  331. if r.Response != nil {
  332. if r.Response.Body == nil {
  333. r.Response.RParen = transferTokenNode(r.Response.RParen, ignoreHeadComment())
  334. if r.Request != nil {
  335. w.Write(withNode(methodNode, r.Path, r.Request), expectSameLine())
  336. } else {
  337. w.Write(withNode(methodNode, r.Path), expectSameLine())
  338. }
  339. } else {
  340. r.Response.RParen = transferTokenNode(r.Response.RParen, ignoreHeadComment())
  341. if r.Request != nil {
  342. w.Write(withNode(methodNode, r.Path, r.Request, r.Returns, r.Response), expectSameLine())
  343. } else {
  344. w.Write(withNode(methodNode, r.Path, r.Returns, r.Response), expectSameLine())
  345. }
  346. }
  347. } else if r.Request != nil {
  348. r.Request.RParen = transferTokenNode(r.Request.RParen, ignoreHeadComment())
  349. w.Write(withNode(methodNode, r.Path, r.Request), expectSameLine())
  350. } else {
  351. pathNode := transferTokenNode(r.Path.Value, ignoreHeadComment())
  352. w.Write(withNode(methodNode, pathNode), expectSameLine())
  353. }
  354. return w.String()
  355. }
  356. func (r *RouteStmt) End() token.Position {
  357. if r.Response != nil {
  358. return r.Response.End()
  359. }
  360. if r.Returns != nil {
  361. return r.Returns.Pos()
  362. }
  363. if r.Request != nil {
  364. return r.Request.End()
  365. }
  366. return r.Path.End()
  367. }
  368. func (r *RouteStmt) Pos() token.Position {
  369. return r.Method.Pos()
  370. }
  371. func (r *RouteStmt) stmtNode() {}
  372. type PathExpr struct {
  373. Value *TokenNode
  374. }
  375. func (p *PathExpr) HasHeadCommentGroup() bool {
  376. return p.Value.HasHeadCommentGroup()
  377. }
  378. func (p *PathExpr) HasLeadingCommentGroup() bool {
  379. return p.Value.HasLeadingCommentGroup()
  380. }
  381. func (p *PathExpr) CommentGroup() (head, leading CommentGroup) {
  382. return p.Value.CommentGroup()
  383. }
  384. func (p *PathExpr) Format(prefix ...string) string {
  385. pathNode := transferTokenNode(p.Value, ignoreComment())
  386. return pathNode.Format(prefix...)
  387. }
  388. func (p *PathExpr) End() token.Position {
  389. return p.Value.End()
  390. }
  391. func (p *PathExpr) Pos() token.Position {
  392. return p.Value.Pos()
  393. }
  394. func (p *PathExpr) exprNode() {}
  395. type BodyStmt struct {
  396. LParen *TokenNode
  397. Body *BodyExpr
  398. RParen *TokenNode
  399. }
  400. func (b *BodyStmt) HasHeadCommentGroup() bool {
  401. return b.LParen.HasHeadCommentGroup()
  402. }
  403. func (b *BodyStmt) HasLeadingCommentGroup() bool {
  404. return b.RParen.HasLeadingCommentGroup()
  405. }
  406. func (b *BodyStmt) CommentGroup() (head, leading CommentGroup) {
  407. return b.LParen.HeadCommentGroup, b.RParen.LeadingCommentGroup
  408. }
  409. func (b *BodyStmt) Format(...string) string {
  410. w := NewBufferWriter()
  411. if b.Body == nil {
  412. return ""
  413. }
  414. w.Write(withNode(b.LParen, b.Body, b.RParen), withInfix(NilIndent), expectSameLine())
  415. return w.String()
  416. }
  417. func (b *BodyStmt) End() token.Position {
  418. return b.RParen.End()
  419. }
  420. func (b *BodyStmt) Pos() token.Position {
  421. return b.LParen.Pos()
  422. }
  423. func (b *BodyStmt) stmtNode() {}
  424. type BodyExpr struct {
  425. LBrack *TokenNode
  426. RBrack *TokenNode
  427. Star *TokenNode
  428. Value *TokenNode
  429. }
  430. func (e *BodyExpr) HasHeadCommentGroup() bool {
  431. if e.LBrack != nil {
  432. return e.LBrack.HasHeadCommentGroup()
  433. } else if e.Star != nil {
  434. return e.Star.HasHeadCommentGroup()
  435. } else {
  436. return e.Value.HasHeadCommentGroup()
  437. }
  438. }
  439. func (e *BodyExpr) HasLeadingCommentGroup() bool {
  440. return e.Value.HasLeadingCommentGroup()
  441. }
  442. func (e *BodyExpr) CommentGroup() (head, leading CommentGroup) {
  443. if e.LBrack != nil {
  444. head = e.LBrack.HeadCommentGroup
  445. } else if e.Star != nil {
  446. head = e.Star.HeadCommentGroup
  447. } else {
  448. head = e.Value.HeadCommentGroup
  449. }
  450. return head, e.Value.LeadingCommentGroup
  451. }
  452. func (e *BodyExpr) End() token.Position {
  453. return e.Value.End()
  454. }
  455. func (e *BodyExpr) Format(...string) string {
  456. w := NewBufferWriter()
  457. if e.LBrack != nil {
  458. lbrackNode := transferTokenNode(e.LBrack, ignoreComment())
  459. rbrackNode := transferTokenNode(e.RBrack, ignoreComment())
  460. if e.Star != nil {
  461. starNode := transferTokenNode(e.Star, ignoreComment())
  462. w.Write(withNode(lbrackNode, rbrackNode, starNode, e.Value), withInfix(NilIndent), expectSameLine())
  463. } else {
  464. w.Write(withNode(lbrackNode, rbrackNode, e.Value), withInfix(NilIndent), expectSameLine())
  465. }
  466. } else if e.Star != nil {
  467. starNode := transferTokenNode(e.Star, ignoreComment())
  468. w.Write(withNode(starNode, e.Value), withInfix(NilIndent), expectSameLine())
  469. } else {
  470. w.Write(withNode(e.Value))
  471. }
  472. return w.String()
  473. }
  474. func (e *BodyExpr) Pos() token.Position {
  475. if e.LBrack != nil {
  476. return e.LBrack.Pos()
  477. }
  478. if e.Star != nil {
  479. return e.Star.Pos()
  480. }
  481. return e.Value.Pos()
  482. }
  483. func (e *BodyExpr) exprNode() {}