z_mirror/luapls

git clone https://git.raiguard.me/z_mirror/luapls

Caleb HeuerRefactor the expressionsd89f2de

main
1.3 KiB66 linesraw
1package parser
2
3import (
4	"github.com/raiguard/luapls/lua/ast"
5	"github.com/raiguard/luapls/lua/token"
6)
7
8func (p *Parser) parseTableFieldList() ast.Punctuated[ast.TableField] {
9	exps := ast.Punctuated[ast.TableField]{StartPos: p.unit().Pos()}
10
11	for {
12		if p.tokIs(token.RBRACE) {
13			break
14		}
15		pair := ast.Pair[ast.TableField]{
16			Node: p.parseTableField(),
17		}
18		if tableSep[p.unit().Type()] {
19			pair.Delimeter = p.unit()
20			p.next()
21		}
22		exps.Pairs = append(exps.Pairs, pair)
23		if pair.Delimeter == nil {
24			break
25		}
26	}
27
28	return exps
29}
30
31func (p *Parser) parseTableField() ast.TableField {
32	if lbrack := p.accept(token.LBRACK); lbrack != nil {
33		name := p.parseExpression(LOWEST, true)
34		rbrack := p.expect(token.RBRACK)
35		assignTok := p.expect(token.ASSIGN)
36		expr := p.parseExpression(LOWEST, true)
37		return &ast.TableExpressionKeyField{
38			LeftBracket:  *lbrack,
39			Name:         name,
40			RightBracket: rbrack,
41			AssignTok:    assignTok,
42			Expr:         expr,
43		}
44	}
45
46	expr := p.parseExpression(LOWEST, true)
47
48	if !p.tokIs(token.ASSIGN) {
49		return &ast.TableArrayField{Expr: expr}
50	}
51
52	assignTok := p.expect(token.ASSIGN)
53
54	name, ok := expr.(*ast.Identifier)
55	if !ok {
56		panic("TODO: Table key was not an identifier!")
57	}
58
59	expr = p.parseExpression(LOWEST, true)
60
61	return &ast.TableSimpleKeyField{
62		Name:      *name,
63		AssignTok: assignTok,
64		Expr:      expr,
65	}
66}