From 8b1f3e5d05e69696e7f067d8d2c2f23b9131ec4c Mon Sep 17 00:00:00 2001 From: Shiyu Wang Date: Wed, 3 Aug 2016 10:23:47 -0700 Subject: [PATCH] Allow array to be a type Summary: It turns out that the spec does not allow "array" to be a valid type. In fact it is a type. Reviewed By: eshrews Differential Revision: D3658608 fbshipit-source-id: beb70393212e4b54352165b9319afb8d00aeed46 --- .../src/full_fidelity/full_fidelity_type_parser.ml | 54 ++++++++++++---------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/hphp/hack/src/full_fidelity/full_fidelity_type_parser.ml b/hphp/hack/src/full_fidelity/full_fidelity_type_parser.ml index e1d9434d3a1..2223184948d 100644 --- a/hphp/hack/src/full_fidelity/full_fidelity_type_parser.ml +++ b/hphp/hack/src/full_fidelity/full_fidelity_type_parser.ml @@ -217,31 +217,35 @@ and parse_generic_type_argument_list parser = and parse_array_type_specifier parser = let (parser, array_token) = next_token parser in let array_token = make_token array_token in - let (parser, left_angle) = expect_left_angle parser in - (* ERROR RECOVERY: We could improve error recovery by detecting - array<, and marking the key type as missing. *) - let (parser, key_type) = parse_type_specifier parser in - let kind = Token.kind (peek_token parser) in - if kind = GreaterThan then - let (parser, right_angle) = next_token parser in - let right_angle = make_token right_angle in - let result = make_vector_type_specifier array_token - left_angle key_type right_angle in - (parser, result) - else if kind = Comma then - let (parser, comma) = next_token parser in - let comma = make_token comma in - let (parser, value_type) = parse_type_specifier parser in - let (parser, right_angle) = expect_right_angle parser in - let result = make_map_type_specifier array_token left_angle key_type - comma value_type right_angle in - (parser, result) - else - (* ERROR RECOVERY: Assume that the > is missing and keep going. *) - let right_angle = make_missing() in - let result = make_vector_type_specifier array_token - left_angle key_type right_angle in - (parser, result) + if peek_token_kind parser <> LessThan then + (parser, make_simple_type_specifier array_token) + else begin + let (parser, left_angle) = assert_token parser LessThan in + (* ERROR RECOVERY: We could improve error recovery by detecting + array<, and marking the key type as missing. *) + let (parser, key_type) = parse_type_specifier parser in + let kind = Token.kind (peek_token parser) in + if kind = GreaterThan then + let (parser, right_angle) = next_token parser in + let right_angle = make_token right_angle in + let result = make_vector_type_specifier array_token + left_angle key_type right_angle in + (parser, result) + else if kind = Comma then + let (parser, comma) = next_token parser in + let comma = make_token comma in + let (parser, value_type) = parse_type_specifier parser in + let (parser, right_angle) = expect_right_angle parser in + let result = make_map_type_specifier array_token left_angle key_type + comma value_type right_angle in + (parser, result) + else + (* ERROR RECOVERY: Assume that the > is missing and keep going. *) + let right_angle = make_missing() in + let result = make_vector_type_specifier array_token + left_angle key_type right_angle in + (parser, result) + end and parse_tuple_or_closure_type_specifier parser = let (parser1, _) = next_token parser in -- 2.11.4.GIT