2019-11-05 17:02:55 +09:00
|
|
|
package parser
|
|
|
|
|
|
|
|
|
|
import "github.com/goccy/go-yaml/token"
|
|
|
|
|
|
|
|
|
|
// context context at parsing
|
|
|
|
|
type context struct {
|
|
|
|
|
idx int
|
|
|
|
|
size int
|
|
|
|
|
tokens token.Tokens
|
|
|
|
|
mode Mode
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *context) next() bool {
|
|
|
|
|
return c.idx < c.size
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *context) previousToken() *token.Token {
|
|
|
|
|
if c.idx > 0 {
|
|
|
|
|
return c.tokens[c.idx-1]
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *context) currentToken() *token.Token {
|
|
|
|
|
if c.idx >= c.size {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return c.tokens[c.idx]
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-29 15:32:25 +09:00
|
|
|
func (c *context) notCommentToken() *token.Token {
|
|
|
|
|
for i := c.idx; i < c.size; i++ {
|
|
|
|
|
tk := c.tokens[i]
|
2020-05-28 21:39:06 +09:00
|
|
|
if tk.Type == token.CommentType {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
return tk
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2019-11-05 17:02:55 +09:00
|
|
|
func (c *context) nextToken() *token.Token {
|
2020-05-28 21:39:06 +09:00
|
|
|
if c.idx+1 >= c.size {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return c.tokens[c.idx+1]
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-29 15:32:25 +09:00
|
|
|
func (c *context) nextNotCommentToken() *token.Token {
|
|
|
|
|
notCommentTokenCount := 0
|
|
|
|
|
for i := c.idx + 1; i < c.size; i++ {
|
|
|
|
|
tk := c.tokens[i]
|
2020-05-28 21:39:06 +09:00
|
|
|
if tk.Type == token.CommentType {
|
|
|
|
|
continue
|
|
|
|
|
}
|
2020-05-29 15:32:25 +09:00
|
|
|
notCommentTokenCount++
|
|
|
|
|
if notCommentTokenCount == 1 {
|
|
|
|
|
return tk
|
|
|
|
|
}
|
2019-11-05 17:02:55 +09:00
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *context) afterNextToken() *token.Token {
|
2020-05-28 21:39:06 +09:00
|
|
|
if c.idx+2 >= c.size {
|
|
|
|
|
return nil
|
2019-11-05 17:02:55 +09:00
|
|
|
}
|
2020-05-28 21:39:06 +09:00
|
|
|
return c.tokens[c.idx+2]
|
2019-11-05 17:02:55 +09:00
|
|
|
}
|
|
|
|
|
|
2020-05-29 15:32:25 +09:00
|
|
|
func (c *context) afterNextNotCommentToken() *token.Token {
|
|
|
|
|
notCommentTokenCount := 0
|
|
|
|
|
for i := c.idx + 1; i < c.size; i++ {
|
|
|
|
|
tk := c.tokens[i]
|
|
|
|
|
if tk.Type == token.CommentType {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
notCommentTokenCount++
|
|
|
|
|
if notCommentTokenCount == 2 {
|
|
|
|
|
return tk
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2019-11-05 17:02:55 +09:00
|
|
|
func (c *context) enabledComment() bool {
|
|
|
|
|
return c.mode&ParseComments != 0
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-29 15:32:25 +09:00
|
|
|
func (c *context) isCurrentCommentToken() bool {
|
|
|
|
|
tk := c.currentToken()
|
|
|
|
|
if tk == nil {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
return tk.Type == token.CommentType
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *context) progressIgnoreComment(num int) {
|
2019-11-05 17:02:55 +09:00
|
|
|
if c.size <= c.idx+num {
|
|
|
|
|
c.idx = c.size
|
|
|
|
|
} else {
|
|
|
|
|
c.idx += num
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-29 15:32:25 +09:00
|
|
|
func (c *context) progress(num int) {
|
|
|
|
|
if c.isCurrentCommentToken() {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
c.progressIgnoreComment(num)
|
|
|
|
|
}
|
|
|
|
|
|
2019-11-05 17:02:55 +09:00
|
|
|
func newContext(tokens token.Tokens, mode Mode) *context {
|
|
|
|
|
filteredTokens := token.Tokens{}
|
|
|
|
|
if mode&ParseComments != 0 {
|
|
|
|
|
filteredTokens = tokens
|
|
|
|
|
} else {
|
|
|
|
|
for _, tk := range tokens {
|
|
|
|
|
if tk.Type == token.CommentType {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
filteredTokens.Add(tk)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return &context{
|
|
|
|
|
idx: 0,
|
|
|
|
|
size: len(filteredTokens),
|
|
|
|
|
tokens: filteredTokens,
|
|
|
|
|
mode: mode,
|
|
|
|
|
}
|
|
|
|
|
}
|