From d48a371625fb71ecbe3d3b866d304023e1076b0c Mon Sep 17 00:00:00 2001 From: Matthias Simon Date: Tue, 9 Jul 2024 12:40:49 +0200 Subject: [PATCH] Fix type parsing of iterators in range-loops --- ttcn3/syntax/nodes.go | 1 + ttcn3/syntax/nodes_gen.go | 19 ++++++++++++++++++- ttcn3/syntax/parser.go | 5 ++++- ttcn3/syntax/parser_test.go | 1 + 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/ttcn3/syntax/nodes.go b/ttcn3/syntax/nodes.go index 9ea839e1..40b4fab9 100644 --- a/ttcn3/syntax/nodes.go +++ b/ttcn3/syntax/nodes.go @@ -425,6 +425,7 @@ type ( Tok Token LParen Token VarTok Token + Type TypeSpec Var *Ident InTok Token Range Expr diff --git a/ttcn3/syntax/nodes_gen.go b/ttcn3/syntax/nodes_gen.go index 0943f187..db159e52 100644 --- a/ttcn3/syntax/nodes_gen.go +++ b/ttcn3/syntax/nodes_gen.go @@ -2417,6 +2417,9 @@ func (n *ForRangeStmt) FirstTok() Token { case n.VarTok != nil: return n.VarTok + case n.Type != nil: + return n.Type.FirstTok() + case n.Var != nil: return n.Var.FirstTok() @@ -2455,6 +2458,9 @@ func (n *ForRangeStmt) LastTok() Token { case n.Var != nil: return n.Var.LastTok() + case n.Type != nil: + return n.Type.LastTok() + case n.VarTok != nil: return n.VarTok @@ -2470,7 +2476,7 @@ func (n *ForRangeStmt) LastTok() Token { } func (n *ForRangeStmt) Children() []Node { - ret := make([]Node, 0, 8) + ret := make([]Node, 0, 9) if n.Tok != nil { ret = append(ret, n.Tok) @@ -2484,6 +2490,10 @@ func (n *ForRangeStmt) Children() []Node { ret = append(ret, n.VarTok) } + if n.Type != nil { + ret = append(ret, n.Type) + } + if n.Var != nil { ret = append(ret, n.Var) } @@ -2509,6 +2519,13 @@ func (n *ForRangeStmt) Children() []Node { func (n *ForRangeStmt) Inspect(f func(Node) bool) { + if c := n.Type; c != nil { + if f(c) { + c.Inspect(f) + } + f(nil) + } + if c := n.Var; c != nil { if f(c) { c.Inspect(f) diff --git a/ttcn3/syntax/parser.go b/ttcn3/syntax/parser.go index c2f5645c..0242a791 100644 --- a/ttcn3/syntax/parser.go +++ b/ttcn3/syntax/parser.go @@ -2408,7 +2408,7 @@ func (p *parser) parseStmt() Stmt { case LBRACK: return p.parseAltGuard() case FOR: - if p.peek(4).Kind() == IN || p.peek(5).Kind() == IN { + if p.peek(4).Kind() == IN || p.peek(5).Kind() == IN || p.peek(6).Kind() == IN { return p.parseForRangeLoop() } return p.parseForLoop() @@ -2485,6 +2485,9 @@ func (p *parser) parseForRangeLoop() *ForRangeStmt { x.LParen = p.expect(LPAREN) if p.tok == VAR { x.VarTok = p.consume() + if p.peek(2).Kind() != IN { + x.Type = p.parseTypeSpec() + } x.Var = p.parseName() } else { x.Var = p.parseIdent() diff --git a/ttcn3/syntax/parser_test.go b/ttcn3/syntax/parser_test.go index e33042e3..aa4c59d9 100644 --- a/ttcn3/syntax/parser_test.go +++ b/ttcn3/syntax/parser_test.go @@ -277,6 +277,7 @@ func TestStmts(t *testing.T) { {pass, `for (i:=x; i<23; i:=i+1) {}`}, {pass, `for (x in {1,2,3}) {}`}, {pass, `for (var x in a) {}`}, + {pass, `for (var integer x in a) {}`}, {pass, `while (23) {}`}, {pass, `do {} while (23);`}, {pass, `if (1) {}`},