Skip to content

Commit de391a6

Browse files
authored
Fix parser crash on 'fun F/A' (#1544)
1 parent dd4a679 commit de391a6

File tree

1 file changed

+38
-26
lines changed

1 file changed

+38
-26
lines changed

apps/els_lsp/src/els_parser.erl

+38-26
Original file line numberDiff line numberDiff line change
@@ -929,38 +929,50 @@ implicit_fun(Tree) ->
929929
| undefined.
930930
try_analyze_implicit_fun(Tree) ->
931931
FunName = erl_syntax:implicit_fun_name(Tree),
932-
ModQBody = erl_syntax:module_qualifier_body(FunName),
933-
ModQArg = erl_syntax:module_qualifier_argument(FunName),
934-
case erl_syntax:type(ModQBody) of
935-
arity_qualifier ->
936-
AqBody = erl_syntax:arity_qualifier_body(ModQBody),
937-
AqArg = erl_syntax:arity_qualifier_argument(ModQBody),
938-
case {erl_syntax:type(ModQArg), erl_syntax:type(AqBody), erl_syntax:type(AqArg)} of
939-
{macro, atom, integer} ->
940-
M = erl_syntax:variable_name(erl_syntax:macro_name(ModQArg)),
941-
F = erl_syntax:atom_value(AqBody),
942-
A = erl_syntax:integer_value(AqArg),
943-
case M of
944-
'MODULE' ->
945-
{F, A};
946-
_ ->
947-
undefined
948-
end;
949-
{ModType, FunType, integer} when
950-
ModType =:= variable orelse ModType =:= atom,
951-
FunType =:= variable orelse FunType =:= atom
952-
->
953-
M = node_name(ModQArg),
954-
F = node_name(AqBody),
955-
A = erl_syntax:integer_value(AqArg),
956-
{{ModType, M}, {FunType, F}, A};
957-
_Types ->
932+
case erl_syntax:type(FunName) of
933+
module_qualifier ->
934+
ModQBody = erl_syntax:module_qualifier_body(FunName),
935+
ModQArg = erl_syntax:module_qualifier_argument(FunName),
936+
case erl_syntax:type(ModQBody) of
937+
arity_qualifier ->
938+
try_analyze_arity_qualifier(ModQBody, ModQArg);
939+
_Type ->
958940
undefined
959941
end;
960942
_Type ->
961943
undefined
962944
end.
963945

946+
-spec try_analyze_arity_qualifier(tree(), tree()) ->
947+
{{atom(), atom()}, {atom(), atom()}, arity()}
948+
| {atom(), arity()}
949+
| undefined.
950+
try_analyze_arity_qualifier(ModQBody, ModQArg) ->
951+
AqBody = erl_syntax:arity_qualifier_body(ModQBody),
952+
AqArg = erl_syntax:arity_qualifier_argument(ModQBody),
953+
case {erl_syntax:type(ModQArg), erl_syntax:type(AqBody), erl_syntax:type(AqArg)} of
954+
{macro, atom, integer} ->
955+
M = erl_syntax:variable_name(erl_syntax:macro_name(ModQArg)),
956+
F = erl_syntax:atom_value(AqBody),
957+
A = erl_syntax:integer_value(AqArg),
958+
case M of
959+
'MODULE' ->
960+
{F, A};
961+
_ ->
962+
undefined
963+
end;
964+
{ModType, FunType, integer} when
965+
ModType =:= variable orelse ModType =:= atom,
966+
FunType =:= variable orelse FunType =:= atom
967+
->
968+
M = node_name(ModQArg),
969+
F = node_name(AqBody),
970+
A = erl_syntax:integer_value(AqArg),
971+
{{ModType, M}, {FunType, F}, A};
972+
_Types ->
973+
undefined
974+
end.
975+
964976
-spec macro(tree()) -> [els_poi:poi()].
965977
macro(Tree) ->
966978
Anno = macro_location(Tree),

0 commit comments

Comments
 (0)