From d4422d1fd79a73ef534c2bcbe5b5da4da5338833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20G=C3=B6m=C3=B6ri?= Date: Fri, 26 Nov 2021 13:08:47 +0100 Subject: [PATCH] Ensure parser always returns `erl_anno:location()` in errors --- src/erlfmt_parse.yrl | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/erlfmt_parse.yrl b/src/erlfmt_parse.yrl index fe8d58c5..73fdb205 100644 --- a/src/erlfmt_parse.yrl +++ b/src/erlfmt_parse.yrl @@ -994,7 +994,7 @@ Erlang code. %% XXX. To be refined. -type error_description() :: term(). --type error_info() :: {erl_anno:line(), module(), error_description()}. +-type error_info() :: {erl_anno:location(), module(), error_description()}. -type token() :: erlfmt_scan:token(). %% mkop(Op, Arg) -> {op,Anno,Op,Arg}. @@ -1026,10 +1026,10 @@ Erlang code. ErrorInfo :: error_info(). parse_node([{'-', A1}, {atom, A2, spec} | Tokens]) -> NewTokens = [{'-', A1}, {'spec', A2} | Tokens], - parse(NewTokens); + ensure_error_location(parse(NewTokens)); parse_node([{'-', A1}, {atom, A2, callback} | Tokens]) -> NewTokens = [{'-', A1}, {'callback', A2} | Tokens], - parse(NewTokens); + ensure_error_location(parse(NewTokens)); parse_node([{'-', A1}, {atom, A2, define} | Tokens]) -> NewTokens1 = [{'-', A1}, {define_expr, A2} | Tokens], case parse(NewTokens1) of @@ -1042,7 +1042,7 @@ parse_node([{'-', A1}, {atom, A2, define} | Tokens]) -> Res; _ -> NewTokens3 = [{'-', A1}, {define_clause, A2} | Tokens], - parse(NewTokens3) + ensure_error_location(parse(NewTokens3)) end end; parse_node(Tokens) -> @@ -1052,10 +1052,21 @@ parse_node(Tokens) -> Error -> case parse([{standalone_exprs, element(2, hd(Tokens))} | Tokens]) of {ok, _} = Res -> Res; - _ -> Error + _ -> ensure_error_location(Error) end end. +ensure_error_location({ok, _} = Res) -> + Res; +ensure_error_location({error, {AnnoOrLoc, Mod, Description}}) -> + {error, {error_location(AnnoOrLoc), Mod, Description}}. + +-spec error_location(erlfmt_scan:anno() | erl_anno:location()) -> erl_anno:location(). +error_location(#{location := Loc}) -> + Loc; +error_location(Loc) -> + Loc. + %% unwrap single-expr definitions, wrapped in guards by the parser build_macro_def( {'-', Anno},