Skip to content

Commit c18ee0d

Browse files
samwgoldmanfacebook-github-bot
authored andcommitted
Allow type parameter defaults in function declarations
Summary: When type parameter defaults were added (D3196321), it was not possible to supply explicit type arguments to function calls. Now that explicit type arguments to function calls are supported, it can be useful to define a polymorphic function with type parameter defaults. Reviewed By: gabelevi Differential Revision: D15679697 fbshipit-source-id: 309df3194a7e02f69ec398c56d004166d6e519e2
1 parent dc2cfac commit c18ee0d

10 files changed

Lines changed: 98 additions & 219 deletions

src/parser/object_parser.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ module Object
701701
| true, false -> None
702702
| _ -> Some(Parse.identifier tmp_env)
703703
) in
704-
let tparams = Type.type_parameter_declaration_with_defaults env in
704+
let tparams = Type.type_parameter_declaration env in
705705
let body, extends, implements = _class env in
706706
Ast.Statement.ClassDeclaration { Class.
707707
id;
@@ -724,7 +724,7 @@ module Object
724724
| T_LCURLY -> None, None
725725
| _ ->
726726
let id = Some (Parse.identifier env) in
727-
let tparams = Type.type_parameter_declaration_with_defaults env in
727+
let tparams = Type.type_parameter_declaration env in
728728
id, tparams in
729729
let body, extends, implements = _class env in
730730
Ast.Expression.Class { Class.

src/parser/statement_parser.ml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ module Statement
540540
Expect.token env T_TYPE;
541541
Eat.push_lex_mode env Lex_mode.TYPE;
542542
let id = Type.type_identifier env in
543-
let tparams = Type.type_parameter_declaration_with_defaults env in
543+
let tparams = Type.type_parameter_declaration env in
544544
Expect.token env T_ASSIGN;
545545
let right = Type._type env in
546546
Eat.semicolon env;
@@ -572,7 +572,7 @@ module Statement
572572
Expect.token env T_TYPE;
573573
Eat.push_lex_mode env Lex_mode.TYPE;
574574
let id = Type.type_identifier env in
575-
let tparams = Type.type_parameter_declaration_with_defaults env in
575+
let tparams = Type.type_parameter_declaration env in
576576
let supertype = match Peek.token env with
577577
| T_COLON ->
578578
Expect.token env T_COLON;
@@ -610,7 +610,7 @@ module Statement
610610
then error env Error.UnexpectedTypeInterface;
611611
Expect.token env T_INTERFACE;
612612
let id = Type.type_identifier env in
613-
let tparams = Type.type_parameter_declaration_with_defaults env in
613+
let tparams = Type.type_parameter_declaration env in
614614
let { Ast.Type.Interface.extends; body } = Type.interface_helper env in
615615
Statement.Interface.({
616616
id;
@@ -649,7 +649,7 @@ module Statement
649649
let env = env |> with_strict true in
650650
Expect.token env T_CLASS;
651651
let id = Parse.identifier env in
652-
let tparams = Type.type_parameter_declaration_with_defaults env in
652+
let tparams = Type.type_parameter_declaration env in
653653
let extends = if Expect.maybe env T_EXTENDS then Some (Type.generic env) else None in
654654
let mixins = match Peek.token env with
655655
| T_IDENTIFIER { raw = "mixins"; _ } -> Eat.token env; mixins env []

src/parser/test/flow/types/parameter_defaults/migrated_0026.tree.json

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,4 @@
11
{
2-
"errors":[
3-
{
4-
"loc":{"source":null,"start":{"line":1,"column":15},"end":{"line":1,"column":16}},
5-
"message":"Unexpected token ="
6-
},
7-
{
8-
"loc":{"source":null,"start":{"line":1,"column":17},"end":{"line":1,"column":23}},
9-
"message":"Unexpected reserved type"
10-
}
11-
],
122
"type":"Program",
133
"loc":{"source":null,"start":{"line":1,"column":0},"end":{"line":1,"column":29}},
144
"range":[0,29],
@@ -44,21 +34,16 @@
4434
"params":[
4535
{
4636
"type":"TypeParameter",
47-
"loc":{"source":null,"start":{"line":1,"column":13},"end":{"line":1,"column":14}},
48-
"range":[13,14],
37+
"loc":{"source":null,"start":{"line":1,"column":13},"end":{"line":1,"column":23}},
38+
"range":[13,23],
4939
"name":"T",
5040
"bound":null,
5141
"variance":null,
52-
"default":null
53-
},
54-
{
55-
"type":"TypeParameter",
56-
"loc":{"source":null,"start":{"line":1,"column":17},"end":{"line":1,"column":23}},
57-
"range":[17,23],
58-
"name":"string",
59-
"bound":null,
60-
"variance":null,
61-
"default":null
42+
"default":{
43+
"type":"StringTypeAnnotation",
44+
"loc":{"source":null,"start":{"line":1,"column":17},"end":{"line":1,"column":23}},
45+
"range":[17,23]
46+
}
6247
}
6348
]
6449
}

src/parser/test/flow/types/parameter_defaults/migrated_0027.tree.json

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
11
{
22
"errors":[
3-
{
4-
"loc":{"source":null,"start":{"line":1,"column":23},"end":{"line":1,"column":24}},
5-
"message":"Unexpected token ="
6-
},
7-
{
8-
"loc":{"source":null,"start":{"line":1,"column":25},"end":{"line":1,"column":31}},
9-
"message":"Unexpected reserved type"
10-
},
113
{
124
"loc":{"source":null,"start":{"line":1,"column":35},"end":{"line":1,"column":36}},
135
"message":"Unexpected token {"
@@ -56,21 +48,16 @@
5648
"params":[
5749
{
5850
"type":"TypeParameter",
59-
"loc":{"source":null,"start":{"line":1,"column":21},"end":{"line":1,"column":22}},
60-
"range":[21,22],
51+
"loc":{"source":null,"start":{"line":1,"column":21},"end":{"line":1,"column":31}},
52+
"range":[21,31],
6153
"name":"T",
6254
"bound":null,
6355
"variance":null,
64-
"default":null
65-
},
66-
{
67-
"type":"TypeParameter",
68-
"loc":{"source":null,"start":{"line":1,"column":25},"end":{"line":1,"column":31}},
69-
"range":[25,31],
70-
"name":"string",
71-
"bound":null,
72-
"variance":null,
73-
"default":null
56+
"default":{
57+
"type":"StringTypeAnnotation",
58+
"loc":{"source":null,"start":{"line":1,"column":25},"end":{"line":1,"column":31}},
59+
"range":[25,31]
60+
}
7461
}
7562
]
7663
}

src/parser/test/flow/types/parameter_defaults/migrated_0028.tree.json

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,4 @@
11
{
2-
"errors":[
3-
{
4-
"loc":{"source":null,"start":{"line":1,"column":9},"end":{"line":1,"column":10}},
5-
"message":"Unexpected token ="
6-
},
7-
{
8-
"loc":{"source":null,"start":{"line":1,"column":11},"end":{"line":1,"column":17}},
9-
"message":"Unexpected reserved type"
10-
}
11-
],
122
"type":"Program",
133
"loc":{"source":null,"start":{"line":1,"column":0},"end":{"line":1,"column":26}},
144
"range":[0,26],
@@ -58,21 +48,16 @@
5848
"params":[
5949
{
6050
"type":"TypeParameter",
61-
"loc":{"source":null,"start":{"line":1,"column":7},"end":{"line":1,"column":8}},
62-
"range":[7,8],
51+
"loc":{"source":null,"start":{"line":1,"column":7},"end":{"line":1,"column":17}},
52+
"range":[7,17],
6353
"name":"T",
6454
"bound":null,
6555
"variance":null,
66-
"default":null
67-
},
68-
{
69-
"type":"TypeParameter",
70-
"loc":{"source":null,"start":{"line":1,"column":11},"end":{"line":1,"column":17}},
71-
"range":[11,17],
72-
"name":"string",
73-
"bound":null,
74-
"variance":null,
75-
"default":null
56+
"default":{
57+
"type":"StringTypeAnnotation",
58+
"loc":{"source":null,"start":{"line":1,"column":11},"end":{"line":1,"column":17}},
59+
"range":[11,17]
60+
}
7661
}
7762
]
7863
}

src/parser/test/flow/types/parameter_defaults/migrated_0029.tree.json

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,4 @@
11
{
2-
"errors":[
3-
{
4-
"loc":{"source":null,"start":{"line":1,"column":16},"end":{"line":1,"column":17}},
5-
"message":"Unexpected token ="
6-
},
7-
{
8-
"loc":{"source":null,"start":{"line":1,"column":18},"end":{"line":1,"column":24}},
9-
"message":"Unexpected reserved type"
10-
}
11-
],
122
"type":"Program",
133
"loc":{"source":null,"start":{"line":1,"column":0},"end":{"line":1,"column":32}},
144
"range":[0,32],
@@ -66,21 +56,16 @@
6656
"params":[
6757
{
6858
"type":"TypeParameter",
69-
"loc":{"source":null,"start":{"line":1,"column":14},"end":{"line":1,"column":15}},
70-
"range":[14,15],
59+
"loc":{"source":null,"start":{"line":1,"column":14},"end":{"line":1,"column":24}},
60+
"range":[14,24],
7161
"name":"T",
7262
"bound":null,
7363
"variance":null,
74-
"default":null
75-
},
76-
{
77-
"type":"TypeParameter",
78-
"loc":{"source":null,"start":{"line":1,"column":18},"end":{"line":1,"column":24}},
79-
"range":[18,24],
80-
"name":"string",
81-
"bound":null,
82-
"variance":null,
83-
"default":null
64+
"default":{
65+
"type":"StringTypeAnnotation",
66+
"loc":{"source":null,"start":{"line":1,"column":18},"end":{"line":1,"column":24}},
67+
"range":[18,24]
68+
}
8469
}
8570
]
8671
}
@@ -92,8 +77,8 @@
9277
}
9378
]
9479
},
95-
"superClass":null,
9680
"typeParameters":null,
81+
"superClass":null,
9782
"superTypeParameters":null,
9883
"implements":[],
9984
"decorators":[]

src/parser/test/flow/types/parameter_defaults/migrated_0030.tree.json

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,4 @@
11
{
2-
"errors":[
3-
{
4-
"loc":{"source":null,"start":{"line":1,"column":17},"end":{"line":1,"column":18}},
5-
"message":"Unexpected token ="
6-
},
7-
{
8-
"loc":{"source":null,"start":{"line":1,"column":19},"end":{"line":1,"column":25}},
9-
"message":"Unexpected reserved type"
10-
}
11-
],
122
"type":"Program",
133
"loc":{"source":null,"start":{"line":1,"column":0},"end":{"line":1,"column":34}},
144
"range":[0,34],
@@ -70,21 +60,16 @@
7060
"params":[
7161
{
7262
"type":"TypeParameter",
73-
"loc":{"source":null,"start":{"line":1,"column":15},"end":{"line":1,"column":16}},
74-
"range":[15,16],
63+
"loc":{"source":null,"start":{"line":1,"column":15},"end":{"line":1,"column":25}},
64+
"range":[15,25],
7565
"name":"T",
7666
"bound":null,
7767
"variance":null,
78-
"default":null
79-
},
80-
{
81-
"type":"TypeParameter",
82-
"loc":{"source":null,"start":{"line":1,"column":19},"end":{"line":1,"column":25}},
83-
"range":[19,25],
84-
"name":"string",
85-
"bound":null,
86-
"variance":null,
87-
"default":null
68+
"default":{
69+
"type":"StringTypeAnnotation",
70+
"loc":{"source":null,"start":{"line":1,"column":19},"end":{"line":1,"column":25}},
71+
"range":[19,25]
72+
}
8873
}
8974
]
9075
}
@@ -96,8 +81,8 @@
9681
}
9782
]
9883
},
99-
"superClass":null,
10084
"typeParameters":null,
85+
"superClass":null,
10186
"superTypeParameters":null,
10287
"implements":[],
10388
"decorators":[]

src/parser/test/flow/types/parameter_defaults/migrated_0031.tree.json

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,4 @@
11
{
2-
"errors":[
3-
{
4-
"loc":{"source":null,"start":{"line":1,"column":24},"end":{"line":1,"column":25}},
5-
"message":"Unexpected token ="
6-
},
7-
{
8-
"loc":{"source":null,"start":{"line":1,"column":26},"end":{"line":1,"column":32}},
9-
"message":"Unexpected reserved type"
10-
}
11-
],
122
"type":"Program",
133
"loc":{"source":null,"start":{"line":1,"column":0},"end":{"line":1,"column":43}},
144
"range":[0,43],
@@ -62,21 +52,16 @@
6252
"params":[
6353
{
6454
"type":"TypeParameter",
65-
"loc":{"source":null,"start":{"line":1,"column":22},"end":{"line":1,"column":23}},
66-
"range":[22,23],
55+
"loc":{"source":null,"start":{"line":1,"column":22},"end":{"line":1,"column":32}},
56+
"range":[22,32],
6757
"name":"T",
6858
"bound":null,
6959
"variance":null,
70-
"default":null
71-
},
72-
{
73-
"type":"TypeParameter",
74-
"loc":{"source":null,"start":{"line":1,"column":26},"end":{"line":1,"column":32}},
75-
"range":[26,32],
76-
"name":"string",
77-
"bound":null,
78-
"variance":null,
79-
"default":null
60+
"default":{
61+
"type":"StringTypeAnnotation",
62+
"loc":{"source":null,"start":{"line":1,"column":26},"end":{"line":1,"column":32}},
63+
"range":[26,32]
64+
}
8065
}
8166
]
8267
}

0 commit comments

Comments
 (0)