@@ -1534,7 +1534,25 @@ local function parse_trying_list<T>(ps: ParseState, i: integer, list: {T}, parse
1534
1534
return i , list
1535
1535
end
1536
1536
1537
- local function parse_typearg_type (ps : ParseState , i : integer ): integer , Type , integer
1537
+ local function parse_anglebracket_list <T >(ps : ParseState , i : integer , parse_item : ParseItem <Type >): integer , {Type}
1538
+ if ps .tokens [i +1].tk == ">" then
1539
+ return fail (ps , i +1, "type argument list cannot be empty ")
1540
+ end
1541
+ local typ = new_type (ps , i , "tuple ")
1542
+ i = verify_tk (ps , i , "<")
1543
+ i = parse_list (ps , i , typ , { [">"] = true, [">>"] = true, }, "sep ", parse_item )
1544
+ if ps .tokens [i ].tk == ">" then
1545
+ i = i + 1
1546
+ elseif ps .tokens [i ].tk == ">>" then
1547
+ -- tokenizer hack : consume one bracket from '>>', don 't increment i
1548
+ ps .tokens [i ].tk = ">"
1549
+ else
1550
+ return fail (ps , i , "syntax error , expected '>'")
1551
+ end
1552
+ return i , typ
1553
+ end
1554
+
1555
+ local function parse_typearg (ps : ParseState , i : integer ): integer , Type , integer
1538
1556
i = verify_kind (ps , i , "identifier ")
1539
1557
return i , a_type {
1540
1558
y = ps.tokens[i - 2].y,
@@ -1544,22 +1562,6 @@ local function parse_typearg_type(ps: ParseState, i: integer): integer, Type, in
1544
1562
}
1545
1563
end
1546
1564
1547
- local function parse_typearg_list (ps : ParseState , i : integer ): integer , Type
1548
- if ps .tokens [i +1].tk == ">" then
1549
- return fail (ps , i +1, "type argument list cannot be empty ")
1550
- end
1551
- local typ = new_type (ps , i , "tuple ")
1552
- return parse_bracket_list (ps , i , typ , "<", ">", "sep ", parse_typearg_type )
1553
- end
1554
-
1555
- local function parse_typeval_list (ps : ParseState , i : integer ): integer , Type
1556
- if ps .tokens [i +1].tk == ">" then
1557
- return fail (ps , i +1, "type argument list cannot be empty ")
1558
- end
1559
- local typ = new_type (ps , i , "tuple ")
1560
- return parse_bracket_list (ps , i , typ , "<", ">", "sep ", parse_type )
1561
- end
1562
-
1563
1565
local function parse_return_types (ps : ParseState , i : integer ): integer , Type
1564
1566
return parse_type_list (ps , i , "rets ")
1565
1567
end
@@ -1568,7 +1570,7 @@ local function parse_function_type(ps: ParseState, i: integer): integer, Type
1568
1570
local typ = new_type (ps , i , "function ")
1569
1571
i = i + 1
1570
1572
if ps .tokens [i ].tk == "<" then
1571
- i , typ .typeargs = parse_typearg_list (ps , i )
1573
+ i , typ .typeargs = parse_anglebracket_list (ps , i , parse_typearg )
1572
1574
end
1573
1575
if ps .tokens [i ].tk == "(" then
1574
1576
i , typ .args = parse_argument_type_list (ps , i )
@@ -1621,7 +1623,7 @@ local function parse_base_type(ps: ParseState, i: integer): integer, Type, integ
1621
1623
end
1622
1624
1623
1625
if ps .tokens [i ].tk == "<" then
1624
- i , typ .typevals = parse_typeval_list (ps , i )
1626
+ i , typ .typevals = parse_anglebracket_list (ps , i , parse_type )
1625
1627
end
1626
1628
return i , typ
1627
1629
elseif tk == "{" then
@@ -1752,7 +1754,7 @@ end
1752
1754
local function parse_function_args_rets_body (ps : ParseState , i : integer , node : Node ): integer , Node
1753
1755
local istart = i - 1
1754
1756
if ps .tokens [i ].tk == "<" then
1755
- i , node .typeargs = parse_typearg_list (ps , i )
1757
+ i , node .typeargs = parse_anglebracket_list (ps , i , parse_typearg )
1756
1758
end
1757
1759
i , node .args = parse_argument_list (ps , i )
1758
1760
i , node .rets = parse_return_types (ps , i )
@@ -2551,7 +2553,7 @@ parse_record_body = function(ps: ParseState, i: integer, def: Type, node: Node):
2551
2553
def .fields = {}
2552
2554
def .field_order = {}
2553
2555
if ps .tokens [i ].tk == "<" then
2554
- i , def .typeargs = parse_typearg_list (ps , i )
2556
+ i , def .typeargs = parse_anglebracket_list (ps , i , parse_typearg )
2555
2557
end
2556
2558
while not (ps .tokens [i ].kind == "$EOF$ " or ps .tokens [i ].tk == "end ") do
2557
2559
if ps .tokens [i ].tk == "userdata " and ps .tokens [i +1].tk ~= ":" then
0 commit comments