diff --git a/.github/workflows/generate_visit.yml b/.github/workflows/generate_visit.yml new file mode 100644 index 0000000..acaf3a1 --- /dev/null +++ b/.github/workflows/generate_visit.yml @@ -0,0 +1,36 @@ +name: Generate visit.go + +on: + push: + paths: + - 'ast/**' + - '!ast/visit.go' + workflow_dispatch: + +jobs: + generate-visit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.21' + + - name: Generate visit.go + run: go run ast/gen_visit.go + + - name: Check for changes + id: git-check + run: | + git diff --exit-code ast/visit.go || echo "changes=true" >> $GITHUB_OUTPUT + + - name: Commit changes + if: steps.git-check.outputs.changes == 'true' + run: | + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + git add ast/visit.go + git commit -m "Auto-generate visit.go" + git push diff --git a/ast/ident.go b/ast/ident.go index 22ad42d..c09b461 100644 --- a/ast/ident.go +++ b/ast/ident.go @@ -18,5 +18,5 @@ type ( func (n *Identifier) ToId() Id { return Id{Name: n.Name, ScopeContext: n.ScopeContext} } - -func (*Identifier) _expr() {} +func (i *Id) String() string { return i.Name } +func (*Identifier) _expr() {} diff --git a/generator/generator.go b/generator/generator.go index 37984b9..8883cc4 100644 --- a/generator/generator.go +++ b/generator/generator.go @@ -518,7 +518,7 @@ func (g *GenVisitor) VisitTryStatement(n *ast.TryStatement) { if n.Catch != nil { g.out.WriteString(" catch ") - if n.Catch.Parameter != nil { + if n.Catch.Parameter != nil && n.Catch.Parameter.Target != nil { g.out.WriteString("(") g.gen(n.Catch.Parameter) g.out.WriteString(") ") diff --git a/parser/statement.go b/parser/statement.go index f10fd83..9e3562e 100644 --- a/parser/statement.go +++ b/parser/statement.go @@ -128,15 +128,15 @@ func (p *parser) parseTryStatement() ast.Stmt { if p.token == token.Catch { catch := p.idx p.next() - var parameter ast.Target + var parameter *ast.BindingTarget if p.token == token.LeftParenthesis { p.next() - parameter = p.parseBindingTarget() + parameter = &ast.BindingTarget{Target: p.parseBindingTarget()} p.expect(token.RightParenthesis) } node.Catch = &ast.CatchStatement{ Catch: catch, - Parameter: &ast.BindingTarget{Target: parameter}, + Parameter: parameter, Body: p.parseBlockStatement(), } }