diff --git a/lib/dialyzer/src/typer_core.erl b/lib/dialyzer/src/typer_core.erl index 842153ca2b1e..aab2db724e70 100644 --- a/lib/dialyzer/src/typer_core.erl +++ b/lib/dialyzer/src/typer_core.erl @@ -593,12 +593,19 @@ write_typed_file([Ch|Chs] = Chars, File, Info, LineNo, Acc, Analysis) -> _ -> {Info, [Ch|Acc]} end, - write_typed_file(Chs, File, NewInfo, NewLineNo, NewAcc, Analysis); + NewFuncs = flush_line(Line, RestFuncs, Info, File, [], Analysis), + write_typed_file(Chs, File, NewInfo#info{functions=NewFuncs}, NewLineNo, NewAcc, Analysis); _ -> write_typed_file(Chs, File, Info, LineNo, [Ch|Acc], Analysis) end end. +flush_line(Line, [{Line,F,A}|RestFuncs], Info, File, Acc, Analysis) -> + ok = raw_write(F, A, Info, File, Acc, Analysis), + flush_line(Line, RestFuncs, Info, File, Acc, Analysis); +flush_line(_Line, Rest, _Info, _File, _Acc, _Analysis) -> + Rest. + raw_write(F, A, Info, File, Content, #analysis{mode = Mode} = Analysis) -> TypeInfo = get_type_string(F, A, Info, file, Analysis), ContentList = diff --git a/lib/dialyzer/test/typer_SUITE.erl b/lib/dialyzer/test/typer_SUITE.erl index fddb3bfa675f..9f5aa0a204ab 100644 --- a/lib/dialyzer/test/typer_SUITE.erl +++ b/lib/dialyzer/test/typer_SUITE.erl @@ -25,7 +25,8 @@ smoke/1, smoke_incremental_plt/1, gh_6296_no_spec_flag_does_not_break_records/1, - contract_violation/1]). + contract_violation/1, + typer_multiple_fun_in_same_line/1]). -include_lib("common_test/include/ct.hrl"). @@ -35,7 +36,8 @@ all() -> [smoke, smoke_incremental_plt, gh_6296_no_spec_flag_does_not_break_records, - contract_violation]. + contract_violation, + typer_multiple_fun_in_same_line]. smoke(Config) -> OutDir = proplists:get_value(priv_dir, Config), @@ -92,6 +94,31 @@ gh_6296_no_spec_flag_does_not_break_records(Config) -> run(Config, Args, Src, Res), ok. +typer_multiple_fun_in_same_line(Config) -> + Code = <<"-module(typer_multiple_fun). + f() -> ok. g() -> ok.">>, + PrivDir = proplists:get_value(priv_dir, Config), + Src = filename:join(PrivDir, "typer_multiple_fun.erl"), + ok = file:write_file(Src, Code), + {ok, Beam} = compile(Config, Code, typer_multiple_fun, []), + Plt = PrivDir ++ "dialyzer_iplt", + _ = dialyzer:run([{analysis_type, incremental}, + {files, [Beam]}, + {apps, [stdlib, kernel, erts]}, + {from, byte_code}, + {init_plt, Plt}, + {output_plt, Plt}]), + Args = io_lib:format("--no_spec --show --plt ~ts", [Plt]), + Res = ["^$", + "^%% File:", + "^%% ----", + "^-spec f", + "^-spec g", + "^_OK_"], + + run(Config, Args, Src, Res), + ok. + smoke_incremental_plt(Config) -> Code = <<"-module(typer_test_module). -compile([export_all,nowarn_export_all]).