From 088c0abdf2a4f5b0a22946df87ca6a7a3e0eb837 Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Wed, 14 Feb 2024 16:16:16 +0100 Subject: [PATCH 1/5] compiler: Do not warn for missing docs when not needed We don't want to warn on missing docs when a module is hidden, nor when a function has an `equiv` metadata. --- bootstrap/lib/compiler/ebin/beam_doc.beam | Bin 17788 -> 20328 bytes lib/compiler/src/beam_doc.erl | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/bootstrap/lib/compiler/ebin/beam_doc.beam b/bootstrap/lib/compiler/ebin/beam_doc.beam index b979b16de770158c9b86c02a2390c685f8957931..3ca758df7d59c1f843cdcc262b9e21f479c98f89 100644 GIT binary patch literal 20328 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%0Ae){s{*}OfrR-}Ahmbjkv=HBlIG;2oHpmfaG9|T` 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 literal 17788 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 CLVySW diff --git a/lib/compiler/src/beam_doc.erl b/lib/compiler/src/beam_doc.erl index b91fac6a88a6..e2c5123a074b 100644 --- a/lib/compiler/src/beam_doc.erl +++ b/lib/compiler/src/beam_doc.erl @@ -688,6 +688,8 @@ warnings(_AST, State) -> ], foldl(fun (W, State0) -> W(State0) end, State, WarnFuns). +warn_missing_docs(State = #docs{ moduledoc = {_, hidden} }) -> + State; warn_missing_docs(State) -> DocNodes = process_docs(State), foldl(fun warn_missing_docs/2, State, DocNodes). @@ -747,9 +749,9 @@ create_warning(Anno, Warning, State) -> Location = erl_anno:location(Anno), {Filename, [{Location, ?MODULE, Warning}]}. -warn_missing_docs({KFA, Anno, _, Doc, _}, State) -> +warn_missing_docs({{Kind, _, _} = KFA, Anno, _, Doc, MD}, State) -> case proplists:get_value(warn_missing_doc, State#docs.opts, false) of - true when Doc =:= none -> + true when Doc =:= none, not is_map_key(equiv, MD) -> Warning = {missing_doc, KFA}, State#docs{ warnings = [create_warning(Anno, Warning, State) | State#docs.warnings] }; _false -> From 7775bf0fd4bd4ff818d51049ee0c8349bbe8abf7 Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Thu, 15 Feb 2024 13:45:23 +0100 Subject: [PATCH 2/5] compiler: Add warn_missing_doc_Kind and nowarn variants When building Erlang/OTP with warn_missing_docs it was found that we need more granual warnings. So this commit adds support for functions, types and callbacks as warnings. --- bootstrap/lib/compiler/ebin/beam_doc.beam | Bin 20328 -> 21036 bytes lib/compiler/src/beam_doc.erl | 49 +++++++++++--- lib/compiler/src/compile.erl | 18 +++-- lib/compiler/test/beam_doc_SUITE.erl | 78 +++++++++++++++++----- 4 files changed, 115 insertions(+), 30 deletions(-) diff --git a/bootstrap/lib/compiler/ebin/beam_doc.beam b/bootstrap/lib/compiler/ebin/beam_doc.beam index 3ca758df7d59c1f843cdcc262b9e21f479c98f89..f3d9bbe641e605a1096a42657835062507a85dcf 100644 GIT binary patch literal 21036 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

C~wC0>0LeP%;!yS>~YeMLD)RRHvq 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 literal 20328 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%0Ae){s{*}OfrR-}Ahmbjkv=HBlIG;2oHpmfaG9|T` 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 diff --git a/lib/compiler/src/beam_doc.erl b/lib/compiler/src/beam_doc.erl index e2c5123a074b..6eeb0088adef 100644 --- a/lib/compiler/src/beam_doc.erl +++ b/lib/compiler/src/beam_doc.erl @@ -219,7 +219,9 @@ }). -type internal_docs() :: #docs{}. --type opt() :: warn_missing_doc | nowarn_hidden_doc | {nowarn_hidden_doc, {atom(), arity()}}. +-type opt() :: warn_missing_doc | warn_missing_doc_functions | warn_missing_doc_callbacks | warn_missing_doc_types | + nowarn_missing_doc | nowarn_missing_doc_functions | nowarn_missing_doc_callbacks | nowarn_missing_doc_types | + nowarn_hidden_doc | {nowarn_hidden_doc, {atom(), arity()}}. -type kfa() :: {Kind :: function | type | callback, Name :: atom(), Arity :: arity()}. -type warnings() :: [{file:filename(), [{erl_anno:location(), beam_doc, warning()}]}]. @@ -248,7 +250,32 @@ main(Dirname, Filename, AST, CmdLineOpts) -> extract_opts(AST, CmdLineOpts) -> CompileOpts = lists:flatten([C || {attribute,_,compile,C} <- AST]), - CompileOpts ++ CmdLineOpts. + normalize_warn_missing_doc(CmdLineOpts ++ CompileOpts). + +normalize_warn_missing_doc(Opts) -> + normalize_warn_missing_doc(Opts, []). +normalize_warn_missing_doc([warn_missing_doc | Opts], _Warnings) -> + normalize_warn_missing_doc(Opts, [function,callback,type]); +normalize_warn_missing_doc([nowarn_missing_doc | Opts], _Warnings) -> + normalize_warn_missing_doc(Opts, []); +normalize_warn_missing_doc([warn_missing_doc_functions | Opts], Warnings) -> + normalize_warn_missing_doc(Opts, lists:uniq([function | Warnings])); +normalize_warn_missing_doc([nowarn_missing_doc_functions | Opts], Warnings) -> + normalize_warn_missing_doc(Opts, lists:uniq(Warnings -- [function])); +normalize_warn_missing_doc([warn_missing_doc_callbacks | Opts], Warnings) -> + normalize_warn_missing_doc(Opts, lists:uniq([callback | Warnings])); +normalize_warn_missing_doc([nowarn_missing_doc_callbacks | Opts], Warnings) -> + normalize_warn_missing_doc(Opts, lists:uniq(Warnings -- [callback])); +normalize_warn_missing_doc([warn_missing_doc_types | Opts], Warnings) -> + normalize_warn_missing_doc(Opts, lists:uniq([type | Warnings])); +normalize_warn_missing_doc([nowarn_missing_doc_types | Opts], Warnings) -> + normalize_warn_missing_doc(Opts, lists:uniq(Warnings -- [type])); +normalize_warn_missing_doc([Opt | Opts], Warnings) -> + [Opt | normalize_warn_missing_doc(Opts, Warnings)]; +normalize_warn_missing_doc([], []) -> + []; +normalize_warn_missing_doc([], Warnings) -> + [{warn_missing_doc,Warnings}]. -spec format_error(warning()) -> io_lib:chars(). format_error({hidden_type_used_in_exported_fun, {Type, Arity}}) -> @@ -749,19 +776,23 @@ create_warning(Anno, Warning, State) -> Location = erl_anno:location(Anno), {Filename, [{Location, ?MODULE, Warning}]}. -warn_missing_docs({{Kind, _, _} = KFA, Anno, _, Doc, MD}, State) -> - case proplists:get_value(warn_missing_doc, State#docs.opts, false) of - true when Doc =:= none, not is_map_key(equiv, MD) -> +warn_missing_docs({{Kind, _, _} = KFA, Anno, _, Doc, MD}, State) + when Doc =:= none, not is_map_key(equiv, MD) -> + case lists:member(Kind, proplists:get_value(warn_missing_doc, State#docs.opts, [])) of + true -> Warning = {missing_doc, KFA}, State#docs{ warnings = [create_warning(Anno, Warning, State) | State#docs.warnings] }; - _false -> + false -> State - end. + end; +warn_missing_docs(_, State) -> + State. warn_missing_moduledoc(State) -> {_, ModuleDoc} = State#docs.moduledoc, - case proplists:get_value(warn_missing_doc, State#docs.opts, false) of - true when ModuleDoc =:= none -> + case proplists:get_value(warn_missing_doc, State#docs.opts, []) of + %% If any warn_missing_doc flags is enabled, we also warn for missing moduledoc. + [_|_] when ModuleDoc =:= none -> Anno = erl_anno:new(?DEFAULT_MODULE_DOC_LOC), Warning = missing_moduledoc, State#docs{ warnings = [create_warning(Anno, Warning, State) | State#docs.warnings] }; diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl index 4803860ccf94..5b2050fe375e 100644 --- a/lib/compiler/src/compile.erl +++ b/lib/compiler/src/compile.erl @@ -708,11 +708,19 @@ value are listed. enabled in a module that may load NIFs, as the compiler may inline NIF fallbacks by accident. Use this option to turn off this kind of warnings. -- **`warn_missing_doc`[](){: #warn_missing_doc } ** - By default, warnings are not emitted when `-doc` attribute for an exported function - is not given. Use this option to turn on this kind of warning. - -- **`nowarn_hidden_doc` | `{nowarn_hidden_doc,NAs}`[](){: #nowarn_hidden_doc } ** +- **`warn_missing_doc` | `warn_missing_doc_functions` | `warn_missing_doc_types` | `warn_missing_doc_callbacks` **{: #warn_missing_doc } + By default, warnings are not emitted when `-doc` attribute for an exported function, + callback or type is not given. Use these option to turn on this kind of warning. + `warn_missing_doc` is equivalent to setting all of `warn_missing_doc_functions`, + `warn_missing_doc_types` and `warn_missing_doc_callbacks`. + +- **`nowarn_missing_doc` | `nowarn_missing_doc_functions` | `nowarn_missing_doc_types` | `nowarn_missing_doc_callbacks` ** + If warnings are enabled by [`warn_missing_doc`](#warn_missing_doc), then you can use + these options turn those warnings off again. + `nowarn_missing_doc` is equivalent to setting all of `nowarn_missing_doc_functions`, + `nowarn_missing_doc_types` and `nowarn_missing_doc_callbacks`. + +- **`nowarn_hidden_doc` | `{nowarn_hidden_doc,NAs}`**{: #nowarn_hidden_doc } By default, warnings are emitted when `-doc false` attribute is set on a [callback or referenced type](`e:system:documentation.md#what-is-visible-versus-hidden`). You can set `nowarn_hidden_doc` to suppress all those warnings, or `{nowarn_hidden_doc, NAs}` diff --git a/lib/compiler/test/beam_doc_SUITE.erl b/lib/compiler/test/beam_doc_SUITE.erl index 38e64162f1e9..0034b37e673e 100644 --- a/lib/compiler/test/beam_doc_SUITE.erl +++ b/lib/compiler/test/beam_doc_SUITE.erl @@ -418,9 +418,24 @@ deprecated(Conf) -> ok. warn_missing_doc(Conf) -> + + warn_missing_doc(Conf, [function, type, callback], [warn_missing_doc]), + warn_missing_doc(Conf, [function], [warn_missing_doc_functions]), + warn_missing_doc(Conf, [function, type], [warn_missing_doc_functions, warn_missing_doc_types]), + warn_missing_doc(Conf, [type, callback], [warn_missing_doc_types, warn_missing_doc_callbacks]), + warn_missing_doc(Conf, [callback], [warn_missing_doc_callbacks]), + + warn_missing_doc(Conf, [type, callback], [warn_missing_doc, nowarn_missing_doc_functions]), + warn_missing_doc(Conf, [function, callback], [warn_missing_doc, nowarn_missing_doc_types]), + warn_missing_doc(Conf, [type], [warn_missing_doc, nowarn_missing_doc_callbacks, nowarn_missing_doc_functions]), + warn_missing_doc(Conf, [], [warn_missing_doc_functions, nowarn_missing_doc]), + + ok. + +warn_missing_doc(Conf, ExpectedWarnings, Options) -> ModuleName = ?get_name(), - {ok, ModName, [{File,Warnings}, {HrlFile, HrlWarnings}]} = - default_compile_file(Conf, ModuleName, [return_warnings, warn_missing_doc, report]), + {ok, ModName, Ws} = + default_compile_file(Conf, ModuleName, [return_warnings, report | Options]), {ok, {docs_v1, _,_, _, none, _, [{{type,test,1},_,[<<"test(N)">>],none,_}, @@ -431,20 +446,51 @@ warn_missing_doc(Conf) -> {{function,test,2},_,[<<"test(N, M)">>],none,_}]} } = code:get_doc(ModName), - ?assertEqual("warn_missing_doc.erl", filename:basename(File)), - ?assertEqual(6, length(Warnings)), - ?assertMatch({1, beam_doc, missing_moduledoc}, lists:nth(1, Warnings)), - ?assertMatch({{6,2}, beam_doc, {missing_doc, {type,test,0}}}, lists:nth(2, Warnings)), - ?assertMatch({{7,2}, beam_doc, {missing_doc, {type,test,1}}}, lists:nth(3, Warnings)), - ?assertMatch({{9,2}, beam_doc, {missing_doc, {callback,test,0}}}, lists:nth(4, Warnings)), - ?assertMatch({{13,1}, beam_doc, {missing_doc, {function,test,0}}}, lists:nth(5, Warnings)), - ?assertMatch({{14,1}, beam_doc, {missing_doc, {function,test,1}}}, lists:nth(6, Warnings)), - - ?assertEqual("warn_missing_doc.hrl", filename:basename(HrlFile)), - ?assertEqual(1, length(HrlWarnings)), - ?assertMatch({{2,1}, beam_doc, {missing_doc, {function,test,2}}}, lists:nth(1, HrlWarnings)), - - ok. + case ExpectedWarnings of + [] -> + ?assertEqual([],Ws); + _ -> + [{File,Warnings} | Hrl] = Ws, + ExpectedWarningCount = 1 + lists:sum( + lists:flatten( + [[2 || lists:member(type, ExpectedWarnings)], + [1 || lists:member(callback, ExpectedWarnings)], + [2 || lists:member(function, ExpectedWarnings)]])), + + ?assertEqual("warn_missing_doc.erl", filename:basename(File)), + ?assertEqual(ExpectedWarningCount, length(Warnings)), + ?assertMatch({1, beam_doc, missing_moduledoc}, lists:nth(1, Warnings)), + TypePos = + case lists:member(type, ExpectedWarnings) of + true -> + ?assertMatch({{6,2}, beam_doc, {missing_doc, {type,test,0}}}, lists:nth(2, Warnings)), + ?assertMatch({{7,2}, beam_doc, {missing_doc, {type,test,1}}}, lists:nth(3, Warnings)), + 4; + false -> + 2 + end, + + CBPos = + case lists:member(callback, ExpectedWarnings) of + true -> + ?assertMatch({{9,2}, beam_doc, {missing_doc, {callback,test,0}}}, lists:nth(TypePos, Warnings)), + TypePos + 1; + false -> + TypePos + end, + + case lists:member(function, ExpectedWarnings) of + true -> + ?assertMatch({{13,1}, beam_doc, {missing_doc, {function,test,0}}}, lists:nth(CBPos, Warnings)), + ?assertMatch({{14,1}, beam_doc, {missing_doc, {function,test,1}}}, lists:nth(CBPos+1, Warnings)), + [{HrlFile, HrlWarnings}] = Hrl, + ?assertEqual("warn_missing_doc.hrl", filename:basename(HrlFile)), + ?assertEqual(1, length(HrlWarnings)), + ?assertMatch({{2,1}, beam_doc, {missing_doc, {function,test,2}}}, lists:nth(1, HrlWarnings)); + false -> + ok + end + end. doc_with_file(Conf) -> ModuleName = ?get_name(), From 9b8a575d1be6624b169216c623bb43d789b28278 Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Wed, 14 Feb 2024 16:30:29 +0100 Subject: [PATCH 3/5] stdlib: Fix erl_parse docs --- lib/parsetools/include/yeccpre.hrl | 9 ++++++++ lib/stdlib/src/erl_parse.yrl | 37 ++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/lib/parsetools/include/yeccpre.hrl b/lib/parsetools/include/yeccpre.hrl index a572ec6bd4c7..64e7d88db8e3 100644 --- a/lib/parsetools/include/yeccpre.hrl +++ b/lib/parsetools/include/yeccpre.hrl @@ -23,10 +23,16 @@ -type yecc_ret() :: {'error', _} | {'ok', _}. +-ifdef (YECC_PARSE_DOC). +-doc ?YECC_PARSE_DOC. +-endif. -spec parse(Tokens :: list()) -> yecc_ret(). parse(Tokens) -> yeccpars0(Tokens, {no_func, no_location}, 0, [], []). +-ifdef (YECC_PARSE_AND_SCAN_DOC). +-doc ?YECC_PARSE_AND_SCAN_DOC. +-endif. -spec parse_and_scan({function() | {atom(), atom()}, [_]} | {atom(), atom(), [_]}) -> yecc_ret(). parse_and_scan({F, A}) -> @@ -35,6 +41,9 @@ parse_and_scan({M, F, A}) -> Arity = length(A), yeccpars0([], {{fun M:F/Arity, A}, no_location}, 0, [], []). +-ifdef (YECC_FORMAT_ERROR_DOC). +-doc ?YECC_FORMAT_ERROR_DOC. +-endif. -spec format_error(any()) -> [char() | list()]. format_error(Message) -> case io_lib:deep_char_list(Message) of diff --git a/lib/stdlib/src/erl_parse.yrl b/lib/stdlib/src/erl_parse.yrl index 61b939577268..649d34b4aa30 100644 --- a/lib/stdlib/src/erl_parse.yrl +++ b/lib/stdlib/src/erl_parse.yrl @@ -731,6 +731,43 @@ Header "". Erlang code. +-moduledoc """ +This module is the basic Erlang parser that converts tokens into the abstract +form of either forms (that is, top-level constructs), expressions, or terms. + +The Abstract Format is described in the ERTS User's Guide. Notice that a token +list must end with the dot token to be acceptable to the parse functions +(see the `m:erl_scan`) module. + +## Error Information + +ErrorInfo is the standard ErrorInfo structure that is returned from all I/O modules. +The format is as follows: + +``` +{ErrorLine, Module, ErrorDescriptor} +``` + +A string describing the error is obtained with the following call: + +``` +Module:format_error(ErrorDescriptor) +``` + +## See Also + +`m:erl_anno`, `m:erl_scan`, `m:io`, section [The Abstract Format](`e:erts:absform`) +in the ERTS User's Guide. +""". + +-define(YECC_PARSE_DOC, false). +-define(YECC_PARSE_AND_SCAN_DOC, false). +-define(YECC_FORMAT_ERROR_DOC, """ +Uses an ErrorDescriptor and returns a string that describes the error. + +This function is usually called implicitly when an ErrorInfo structure is +processed (see section [Error Information](#module-error-information)). +"""). -export([parse_form/1,parse_exprs/1,parse_term/1]). -export([normalise/1,abstract/1,tokens/1,tokens/2]). From 6d15c649b71731549945d1c717324aad191c16e2 Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Wed, 14 Feb 2024 16:13:52 +0100 Subject: [PATCH 4/5] otp: Enable warn_missing_doc and fix all missing docs --- lib/common_test/proper_ext/ct_proper_ext.erl | 1 + lib/common_test/src/cte_track.erl | 1 + lib/compiler/src/beam_ssa_ss.erl | 1 + lib/compiler/src/cerl.erl | 17 +++++++++ lib/compiler/src/cerl_trees.erl | 1 + lib/compiler/src/core_parse.yrl | 1 + lib/dialyzer/src/dialyzer.erl | 1 + .../src/compiler/diameter_dict_parser.yrl | 3 ++ lib/et/examples/Makefile | 2 +- lib/eunit/src/eunit_autoexport.erl | 3 +- lib/eunit/src/eunit_surefire.erl | 8 ++++ lib/inets/examples/httpd_load_test/Makefile | 1 + lib/megaco/examples/simple/Makefile | 2 + lib/observer/src/crashdump_viewer.erl | 38 +++++++++++++++++++ lib/snmp/examples/ex1/Makefile | 1 + lib/snmp/examples/ex2/Makefile | 1 + lib/ssl/examples/src/Makefile | 2 +- lib/ssl/src/dtls_client_connection.erl | 1 + lib/ssl/src/dtls_server_connection.erl | 1 + lib/ssl/src/tls_client_connection.erl | 1 + lib/ssl/src/tls_dtls_client_connection.erl | 1 + lib/ssl/src/tls_dtls_gen_connection.erl | 1 + lib/ssl/src/tls_dtls_server_connection.erl | 1 + lib/ssl/src/tls_server_connection.erl | 6 ++- lib/stdlib/uc_spec/gen_unicode_mod.escript | 1 + lib/syntax_tools/src/merl_transform.erl | 1 + lib/tools/src/xref_parser.yrl | 1 + lib/wx/examples/demo/Makefile | 2 + lib/wx/examples/simple/Makefile | 2 + lib/wx/examples/sudoku/Makefile | 2 + lib/wx/src/Makefile | 2 +- lib/xmerl/src/xmerl_b64Bin.yrl | 3 ++ lib/xmerl/src/xmerl_sax_parser_latin1.erlsrc | 1 + lib/xmerl/src/xmerl_sax_parser_list.erlsrc | 1 + lib/xmerl/src/xmerl_sax_parser_utf16be.erlsrc | 1 + lib/xmerl/src/xmerl_sax_parser_utf16le.erlsrc | 1 + lib/xmerl/src/xmerl_sax_parser_utf8.erlsrc | 1 + lib/xmerl/src/xmerl_xpath_parse.yrl | 1 + make/otp.mk.in | 2 +- 39 files changed, 111 insertions(+), 7 deletions(-) diff --git a/lib/common_test/proper_ext/ct_proper_ext.erl b/lib/common_test/proper_ext/ct_proper_ext.erl index 4c4b25da27cc..81472e319bba 100644 --- a/lib/common_test/proper_ext/ct_proper_ext.erl +++ b/lib/common_test/proper_ext/ct_proper_ext.erl @@ -31,6 +31,7 @@ %% do not shrink. -module(ct_proper_ext). +-moduledoc false. -export([existing_atom/0]). -export([safe_any/0]). diff --git a/lib/common_test/src/cte_track.erl b/lib/common_test/src/cte_track.erl index 2e64bc1ea4e3..b2e8b2523e29 100644 --- a/lib/common_test/src/cte_track.erl +++ b/lib/common_test/src/cte_track.erl @@ -19,6 +19,7 @@ %% -module(cte_track). +-moduledoc false. %% module for tracking CT execution progress %% test spec addition examples: %% {event_handler, {cte_track, []}}. diff --git a/lib/compiler/src/beam_ssa_ss.erl b/lib/compiler/src/beam_ssa_ss.erl index 01e6ee387ca1..0c2fb6928fe9 100644 --- a/lib/compiler/src/beam_ssa_ss.erl +++ b/lib/compiler/src/beam_ssa_ss.erl @@ -27,6 +27,7 @@ %% -module(beam_ssa_ss). +-moduledoc false. -compile({inline,[add_edge/4, add_vertex/3]}). diff --git a/lib/compiler/src/cerl.erl b/lib/compiler/src/cerl.erl index 81304cfb741e..bc573a0cc7ac 100644 --- a/lib/compiler/src/cerl.erl +++ b/lib/compiler/src/cerl.erl @@ -2063,6 +2063,7 @@ is_c_map(#c_literal{val = V}) when is_map(V) -> is_c_map(_) -> false. +-doc "". -spec map_es(c_map() | c_literal()) -> [c_map_pair()]. map_es(#c_literal{anno=As,val=M}) when is_map(M) -> @@ -2073,6 +2074,7 @@ map_es(#c_literal{anno=As,val=M}) when is_map(M) -> map_es(#c_map{es = Es}) -> Es. +-doc "". -spec map_arg(c_map() | c_literal()) -> c_map() | c_literal(). map_arg(#c_literal{anno=As,val=M}) when is_map(M) -> @@ -2080,37 +2082,44 @@ map_arg(#c_literal{anno=As,val=M}) when is_map(M) -> map_arg(#c_map{arg=M}) -> M. +-doc "". -spec c_map([c_map_pair()]) -> c_map(). c_map(Pairs) -> ann_c_map([], Pairs). +-doc "". -spec c_map_pattern([c_map_pair()]) -> c_map(). c_map_pattern(Pairs) -> #c_map{es=Pairs, is_pat=true}. +-doc "". -spec ann_c_map_pattern([term()], [c_map_pair()]) -> c_map(). ann_c_map_pattern(As, Pairs) -> #c_map{anno=As, es=Pairs, is_pat=true}. +-doc "". -spec is_c_map_empty(c_map() | c_literal()) -> boolean(). is_c_map_empty(#c_map{ es=[] }) -> true; is_c_map_empty(#c_literal{val=M}) when is_map(M),map_size(M) =:= 0 -> true; is_c_map_empty(_) -> false. +-doc "". -spec is_c_map_pattern(c_map()) -> boolean(). is_c_map_pattern(#c_map{is_pat=IsPat}) -> IsPat. +-doc "". -spec ann_c_map([term()], [c_map_pair()]) -> c_map() | c_literal(). ann_c_map(As, Es) -> ann_c_map(As, #c_literal{val=#{}}, Es). +-doc "". -spec ann_c_map([term()], c_map() | c_literal(), [c_map_pair()]) -> c_map() | c_literal(). ann_c_map(As, #c_literal{val=M0}=Lit, Es) when is_map(M0) -> @@ -2149,6 +2158,7 @@ update_map_literal([#c_map_pair{op=#c_literal{val=exact},key=Ck,val=Cv}|Es], M) update_map_literal([], M) -> M. +-doc "". -spec update_c_map(c_map(), cerl(), [cerl()]) -> c_map() | c_literal(). update_c_map(#c_map{is_pat=true}=Old, M, Es) -> @@ -2156,34 +2166,41 @@ update_c_map(#c_map{is_pat=true}=Old, M, Es) -> update_c_map(#c_map{is_pat=false}=Old, M, Es) -> ann_c_map(get_ann(Old), M, Es). +-doc "". -spec map_pair_key(c_map_pair()) -> cerl(). map_pair_key(#c_map_pair{key=K}) -> K. +-doc "". -spec map_pair_val(c_map_pair()) -> cerl(). map_pair_val(#c_map_pair{val=V}) -> V. +-doc "". -spec map_pair_op(c_map_pair()) -> map_op(). map_pair_op(#c_map_pair{op=Op}) -> Op. +-doc "". -spec c_map_pair(cerl(), cerl()) -> c_map_pair(). c_map_pair(Key,Val) -> #c_map_pair{op=#c_literal{val=assoc},key=Key,val=Val}. +-doc "". -spec c_map_pair_exact(cerl(), cerl()) -> c_map_pair(). c_map_pair_exact(Key,Val) -> #c_map_pair{op=#c_literal{val=exact},key=Key,val=Val}. +-doc "". -spec ann_c_map_pair([term()], cerl(), cerl(), cerl()) -> c_map_pair(). ann_c_map_pair(As,Op,K,V) -> #c_map_pair{op=Op, key = K, val=V, anno = As}. +-doc "". -spec update_c_map_pair(c_map_pair(), map_op(), cerl(), cerl()) -> c_map_pair(). update_c_map_pair(Old,Op,K,V) -> diff --git a/lib/compiler/src/cerl_trees.erl b/lib/compiler/src/cerl_trees.erl index 8a0d824114dd..8be9a1d81c89 100644 --- a/lib/compiler/src/cerl_trees.erl +++ b/lib/compiler/src/cerl_trees.erl @@ -1110,6 +1110,7 @@ filter_labels([A | As]) -> filter_labels([]) -> []. +-doc "". -spec get_label(cerl()) -> 'top' | integer(). get_label(T) -> diff --git a/lib/compiler/src/core_parse.yrl b/lib/compiler/src/core_parse.yrl index bfb6914ae4f8..be2a087c3ba4 100644 --- a/lib/compiler/src/core_parse.yrl +++ b/lib/compiler/src/core_parse.yrl @@ -453,6 +453,7 @@ Header "". Erlang code. +-moduledoc false. -include("core_parse.hrl"). diff --git a/lib/dialyzer/src/dialyzer.erl b/lib/dialyzer/src/dialyzer.erl index 23b6e9732db8..86299ebe7389 100644 --- a/lib/dialyzer/src/dialyzer.erl +++ b/lib/dialyzer/src/dialyzer.erl @@ -604,6 +604,7 @@ run_report_modules_analyzed(Opts) -> {Warnings, _ModulesChanged, ModulesAnalyzed} = run_report_modules_changed_and_analyzed(Opts), {Warnings, ModulesAnalyzed}. +-doc false. run_report_modules_changed_and_analyzed(Opts) -> try dialyzer_options:build([{report_mode, quiet}, {erlang_mode, true}|Opts]) of diff --git a/lib/diameter/src/compiler/diameter_dict_parser.yrl b/lib/diameter/src/compiler/diameter_dict_parser.yrl index 4d2eb098311b..d26dcff44d98 100644 --- a/lib/diameter/src/compiler/diameter_dict_parser.yrl +++ b/lib/diameter/src/compiler/diameter_dict_parser.yrl @@ -323,3 +323,6 @@ avp_code -> number : '$1'. avp_vendor -> '$empty' : false. avp_vendor -> number : '$1'. + +Erlang code. +-moduledoc false. diff --git a/lib/et/examples/Makefile b/lib/et/examples/Makefile index c572fb4ce65f..f482cdf5bf3c 100644 --- a/lib/et/examples/Makefile +++ b/lib/et/examples/Makefile @@ -55,7 +55,7 @@ TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR)) # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- -ERL_COMPILE_FLAGS += -pa ../../et/ebin +ERL_COMPILE_FLAGS += -pa ../../et/ebin +nowarn_missing_doc EBIN = . # ---------------------------------------------------- diff --git a/lib/eunit/src/eunit_autoexport.erl b/lib/eunit/src/eunit_autoexport.erl index de7022e63791..4ee0871ec1d2 100644 --- a/lib/eunit/src/eunit_autoexport.erl +++ b/lib/eunit/src/eunit_autoexport.erl @@ -90,7 +90,8 @@ rewrite([], As, Module, Test) -> [{function,L,test,0, [{clause,L,[],[], [{call,L,{remote,L,{atom,L,eunit},{atom,L,test}}, - [{atom,L,Module}]}]}]} + [{atom,L,Module}]}]}]}, + {attribute,L,doc,false} | As]; true -> As diff --git a/lib/eunit/src/eunit_surefire.erl b/lib/eunit/src/eunit_surefire.erl index 9bb0811276ef..2861b6348a21 100644 --- a/lib/eunit/src/eunit_surefire.erl +++ b/lib/eunit/src/eunit_surefire.erl @@ -100,12 +100,15 @@ _See also: _`m:eunit`. testsuites = [] :: [#testsuite{}] }). +-doc false. start() -> start([]). +-doc false. start(Options) -> eunit_listener:start(?MODULE, Options). +-doc false. init(Options) -> XMLDir = proplists:get_value(dir, Options, ?XMLDIR), ensure_xmldir(XMLDir), @@ -117,6 +120,7 @@ init(Options) -> St end. +-doc false. terminate({ok, _Data}, St) -> TestSuites = St#state.testsuites, XmlDir = St#state.xmldir, @@ -127,6 +131,7 @@ terminate({error, _Reason}, _St) -> %% Just terminate. ok. +-doc false. handle_begin(Kind, Data, St) when Kind == group; Kind == test -> %% Run this code both for groups and tests; test is a bit %% surprising: This is a workaround for the fact that we don't get @@ -145,6 +150,8 @@ handle_begin(Kind, Data, St) when Kind == group; Kind == test -> _ -> St end. + +-doc false. handle_end(group, Data, St) -> %% Retrieve existing test suite: case proplists:get_value(id, Data) of @@ -180,6 +187,7 @@ handle_end(test, Data, St) -> %% Cancel group does not give information on the individual cancelled test case %% We ignore this event... +-doc false. handle_cancel(group, Data, St) -> %% ...except when it tells us that a fixture setup or cleanup failed. case proplists:get_value(reason, Data) of diff --git a/lib/inets/examples/httpd_load_test/Makefile b/lib/inets/examples/httpd_load_test/Makefile index 19edf10cb0aa..ad14418075de 100644 --- a/lib/inets/examples/httpd_load_test/Makefile +++ b/lib/inets/examples/httpd_load_test/Makefile @@ -55,6 +55,7 @@ TARGET_FILES = \ ifeq ($(TYPE),debug) ERL_COMPILE_FLAGS += -Ddebug -W endif +ERL_COMPILE_FLAGS += +nowarn_missing_doc # ---------------------------------------------------- diff --git a/lib/megaco/examples/simple/Makefile b/lib/megaco/examples/simple/Makefile index 8f1ca41433d0..405c665fa43e 100644 --- a/lib/megaco/examples/simple/Makefile +++ b/lib/megaco/examples/simple/Makefile @@ -60,12 +60,14 @@ MEGACO_ROOT_DIR = $(shell (cd .. ; dirname `pwd`)) # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + ifeq ($(WARN_UNUSED_WARS),true) ERL_COMPILE_FLAGS += +warn_unused_vars endif ERL_COMPILE_FLAGS += \ -pa $(ERL_TOP)/lib/megaco/ebin \ + +nowarn_missing_doc \ -I../../include ifneq ($(MGC_HOST),) diff --git a/lib/observer/src/crashdump_viewer.erl b/lib/observer/src/crashdump_viewer.erl index d8dbcf9ad8df..8e5ad3ad148e 100644 --- a/lib/observer/src/crashdump_viewer.erl +++ b/lib/observer/src/crashdump_viewer.erl @@ -168,6 +168,7 @@ For details about how to get started with the Crashdump Viewer, see the %% Functions = local | global | FunctionList %% FunctionList = [Function] %% Function = {FunctionName,Arity} | FunctionName +-doc false. debug(F) -> ttb:tracer(all,[{file,"cdv"}]), % tracing all nodes ttb:p(all,[call,timestamp]), @@ -175,6 +176,7 @@ debug(F) -> tp(F,MS), ttb:ctp(?MODULE,stop_debug), % don't want tracing of the stop_debug func ok. +-doc false. tp([{M,F,A}|T],MS) -> % mod:func/arity ttb:tpl(M,F,A,MS), tp(T,MS); @@ -186,6 +188,7 @@ tp([M|T],MS) -> % mod tp(T,MS); tp([],_MS) -> ok. +-doc false. stop_debug() -> ttb:stop([format]). @@ -219,9 +222,11 @@ stop() -> %%%----------------------------------------------------------------- %%% Start crashdump_viewer via the cdv script located in %%% $OBSERVER_PRIV_DIR/bin +-doc false. script_start() -> do_script_start(fun() -> start() end), erlang:halt(). +-doc false. script_start([FileAtom]) -> File = atom_to_list(FileAtom), case filelib:is_regular(File) of @@ -269,6 +274,7 @@ usage() -> %%==================================================================== %%%-------------------------------------------------------------------- %%% Start the server - called by cdv_wx +-doc false. start_link() -> case whereis(?SERVER) of undefined -> @@ -279,69 +285,93 @@ start_link() -> %%%----------------------------------------------------------------- %%% Called by cdv_wx +-doc false. read_file(File) -> cast({read_file,File}). %%%----------------------------------------------------------------- %%% The following functions are called when the different tabs are %%% created +-doc false. general_info() -> call(general_info). +-doc false. processes() -> call(procs_summary). +-doc false. ports() -> call(ports). +-doc false. ets_tables(Owner) -> call({ets_tables,Owner}). +-doc false. internal_ets_tables() -> call(internal_ets_tables). +-doc false. timers(Owner) -> call({timers,Owner}). +-doc false. funs() -> call(funs). +-doc false. atoms() -> call(atoms). +-doc false. dist_info() -> call(dist_info). +-doc false. node_info(Channel) -> call({node_info,Channel}). +-doc false. loaded_modules() -> call(loaded_mods). +-doc false. loaded_mod_details(Mod) -> call({loaded_mod_details,Mod}). +-doc false. memory() -> call(memory). +-doc false. persistent_terms() -> call(persistent_terms). +-doc false. allocated_areas() -> call(allocated_areas). +-doc false. allocator_info() -> call(allocator_info). +-doc false. hash_tables() -> call(hash_tables). +-doc false. index_tables() -> call(index_tables). +-doc false. schedulers() -> call(schedulers). %%%----------------------------------------------------------------- %%% Called when a link to a process (Pid) is clicked. +-doc false. proc_details(Pid) -> call({proc_details,Pid}). %%%----------------------------------------------------------------- %%% Called when a link to a port is clicked. +-doc false. port(Id) -> call({port,Id}). %%%----------------------------------------------------------------- %%% Called when "<< xxx bytes>>" link is clicket to open a new window %%% displaying the whole binary. +-doc false. expand_binary(Pos) -> call({expand_binary,Pos}). %%%----------------------------------------------------------------- %%% For testing only - called from crashdump_viewer_SUITE +-doc false. get_dump_versions() -> call(get_dump_versions). @@ -357,6 +387,7 @@ get_dump_versions() -> %% ignore | %% {stop, Reason} %%-------------------------------------------------------------------- +-doc false. init([]) -> ets:new(cdv_dump_index_table,[ordered_set,named_table,public]), ets:new(cdv_reg_proc_table,[ordered_set,named_table,public]), @@ -374,6 +405,7 @@ init([]) -> %% {stop, Reason, Reply, State} | (terminate/2 is called) %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- +-doc false. handle_call(general_info,_From,State=#state{file=File}) -> GenInfo = general_info(File), NumAtoms = GenInfo#general_info.num_atoms, @@ -527,6 +559,7 @@ handle_call(get_dump_versions,_From,State=#state{dump_vsn=DumpVsn}) -> %% {noreply, State, Timeout} | %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- +-doc false. handle_cast({read_file,File}, _State) -> case do_read_file(File) of {ok,DumpVsn} -> @@ -547,6 +580,7 @@ handle_cast(stop,State) -> %% {noreply, State, Timeout} | %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- +-doc false. handle_info(_Info, State) -> {noreply, State}. @@ -555,6 +589,7 @@ handle_info(_Info, State) -> %% Description: Shutdown the server %% Returns: any (ignored by gen_server) %%-------------------------------------------------------------------- +-doc false. terminate(_Reason, _State) -> ok. @@ -563,6 +598,7 @@ terminate(_Reason, _State) -> %% Purpose: Convert process state when code is changed %% Returns: {ok, NewState} %%-------------------------------------------------------------------- +-doc false. code_change(_OldVsn, State, _Extra) -> {ok, State}. @@ -3309,12 +3345,14 @@ lookup_and_parse_index(File,What,ParseFun,Str) when is_list(File) -> %%%----------------------------------------------------------------- %%% Convert a record to a proplist +-doc false. to_proplist(Fields,Record) -> Values = to_value_list(Record), lists:zip(Fields,Values). %%%----------------------------------------------------------------- %%% Convert a record to a simple list of field values +-doc false. to_value_list(Record) -> [_RecordName|Values] = tuple_to_list(Record), Values. diff --git a/lib/snmp/examples/ex1/Makefile b/lib/snmp/examples/ex1/Makefile index b4e7c7f2dd95..dfbd46046c3a 100644 --- a/lib/snmp/examples/ex1/Makefile +++ b/lib/snmp/examples/ex1/Makefile @@ -41,6 +41,7 @@ ERL_COMPILE_FLAGS += -I../include \ +'{parse_transform,sys_pre_attributes}' \ +'{attribute,insert,app_vsn,$(APP_VSN)}' \ -I$(ERL_TOP)/lib/stdlib \ + +nowarn_missing_doc \ $(SNMP_FLAGS) # ---------------------------------------------------- diff --git a/lib/snmp/examples/ex2/Makefile b/lib/snmp/examples/ex2/Makefile index f0f652af7416..b8408d8cecfe 100644 --- a/lib/snmp/examples/ex2/Makefile +++ b/lib/snmp/examples/ex2/Makefile @@ -42,6 +42,7 @@ ERL_COMPILE_FLAGS += -I../include \ +'{parse_transform,sys_pre_attributes}' \ +'{attribute,insert,app_vsn,$(APP_VSN)}' \ -I$(ERL_TOP)/lib/stdlib \ + +nowarn_missing_doc \ $(SNMP_FLAGS) # ---------------------------------------------------- diff --git a/lib/ssl/examples/src/Makefile b/lib/ssl/examples/src/Makefile index 8b0435bfc419..aca8affabeb8 100644 --- a/lib/ssl/examples/src/Makefile +++ b/lib/ssl/examples/src/Makefile @@ -37,7 +37,7 @@ RELSYSDIR = $(RELEASE_PATH)/lib/ssl-$(VSN) # ---------------------------------------------------- # Common Macros # ---------------------------------------------------- -EXTRA_ERLC_FLAGS = +warn_unused_vars +EXTRA_ERLC_FLAGS = +warn_unused_vars +nowarn_missing_doc ERL_COMPILE_FLAGS += $(EXTRA_ERLC_FLAGS) diff --git a/lib/ssl/src/dtls_client_connection.erl b/lib/ssl/src/dtls_client_connection.erl index 087584d286ac..dee80e8885e3 100644 --- a/lib/ssl/src/dtls_client_connection.erl +++ b/lib/ssl/src/dtls_client_connection.erl @@ -19,6 +19,7 @@ %% -module(dtls_client_connection). +-moduledoc false. %%---------------------------------------------------------------------- %% Purpose: DTLS-1-DTLS-1.2 FSM (* = optional) diff --git a/lib/ssl/src/dtls_server_connection.erl b/lib/ssl/src/dtls_server_connection.erl index c23a4bbc32e6..780b8c1ca42b 100644 --- a/lib/ssl/src/dtls_server_connection.erl +++ b/lib/ssl/src/dtls_server_connection.erl @@ -19,6 +19,7 @@ %% -module(dtls_server_connection). +-moduledoc false. %%---------------------------------------------------------------------- %% Purpose: DTLS-1-DTLS-1.2 FSM (* = optional) diff --git a/lib/ssl/src/tls_client_connection.erl b/lib/ssl/src/tls_client_connection.erl index e713799501cc..77caf53c6214 100644 --- a/lib/ssl/src/tls_client_connection.erl +++ b/lib/ssl/src/tls_client_connection.erl @@ -98,6 +98,7 @@ %%---------------------------------------------------------------------- -module(tls_client_connection). +-moduledoc false. -behaviour(gen_statem). diff --git a/lib/ssl/src/tls_dtls_client_connection.erl b/lib/ssl/src/tls_dtls_client_connection.erl index 5496ea9a9342..25bcc320877a 100644 --- a/lib/ssl/src/tls_dtls_client_connection.erl +++ b/lib/ssl/src/tls_dtls_client_connection.erl @@ -27,6 +27,7 @@ %%---------------------------------------------------------------------- -module(tls_dtls_client_connection). +-moduledoc false. -include_lib("public_key/include/public_key.hrl"). diff --git a/lib/ssl/src/tls_dtls_gen_connection.erl b/lib/ssl/src/tls_dtls_gen_connection.erl index 31c51d9dd74f..e52e515a953b 100644 --- a/lib/ssl/src/tls_dtls_gen_connection.erl +++ b/lib/ssl/src/tls_dtls_gen_connection.erl @@ -27,6 +27,7 @@ %%---------------------------------------------------------------------- -module(tls_dtls_gen_connection). +-moduledoc false. -include_lib("public_key/include/public_key.hrl"). diff --git a/lib/ssl/src/tls_dtls_server_connection.erl b/lib/ssl/src/tls_dtls_server_connection.erl index 3be78c80145d..9299230b2961 100644 --- a/lib/ssl/src/tls_dtls_server_connection.erl +++ b/lib/ssl/src/tls_dtls_server_connection.erl @@ -27,6 +27,7 @@ %%---------------------------------------------------------------------- -module(tls_dtls_server_connection). +-moduledoc false. -include_lib("public_key/include/public_key.hrl"). diff --git a/lib/ssl/src/tls_server_connection.erl b/lib/ssl/src/tls_server_connection.erl index 4d541b856c77..64b1d5a4ac02 100644 --- a/lib/ssl/src/tls_server_connection.erl +++ b/lib/ssl/src/tls_server_connection.erl @@ -18,6 +18,10 @@ %% %CopyrightEnd% %% %% + +-module(tls_server_connection). +-moduledoc false. + %%---------------------------------------------------------------------- %% Purpose: TLS-1.0-TLS-1.2 FSM (* = optional) %% %%---------------------------------------------------------------------- @@ -96,8 +100,6 @@ %% GO BACK TO HELLO %%---------------------------------------------------------------------- --module(tls_server_connection). - -behaviour(gen_statem). -include("tls_connection.hrl"). diff --git a/lib/stdlib/uc_spec/gen_unicode_mod.escript b/lib/stdlib/uc_spec/gen_unicode_mod.escript index a6ac3b0e60ab..ec775634cb99 100644 --- a/lib/stdlib/uc_spec/gen_unicode_mod.escript +++ b/lib/stdlib/uc_spec/gen_unicode_mod.escript @@ -238,6 +238,7 @@ gen_header(Fd) -> io:put_chars(Fd, "%%\n%% this file is generated do not modify\n"), io:put_chars(Fd, "%% see ../uc_spec/gen_unicode_mod.escript\n\n"), io:put_chars(Fd, "-module(" ++ ?MOD ++").\n"), + io:put_chars(Fd, "-moduledoc false.\n"), io:put_chars(Fd, "-export([cp/1, gc/1]).\n"), io:put_chars(Fd, "-export([nfd/1, nfc/1, nfkd/1, nfkc/1]).\n"), io:put_chars(Fd, "-export([whitespace/0, is_whitespace/1]).\n"), diff --git a/lib/syntax_tools/src/merl_transform.erl b/lib/syntax_tools/src/merl_transform.erl index 6f7baa7f06cc..7a7c2421784f 100644 --- a/lib/syntax_tools/src/merl_transform.erl +++ b/lib/syntax_tools/src/merl_transform.erl @@ -50,6 +50,7 @@ unless the macro `MERL_NO_TRANSFORM` is defined first. %% TODO: unroll calls to switch? it will probably get messy %% TODO: use Igor to make resulting code independent of merl at runtime? +-doc "". -spec parse_transform(InForms, Options :: term()) -> OutForms when InForms :: [erl_parse:abstract_form() | erl_parse:form_info()], OutForms :: [erl_parse:abstract_form() | erl_parse:form_info()]. diff --git a/lib/tools/src/xref_parser.yrl b/lib/tools/src/xref_parser.yrl index 5ee6419ff5bd..e406554c964c 100644 --- a/lib/tools/src/xref_parser.yrl +++ b/lib/tools/src/xref_parser.yrl @@ -106,6 +106,7 @@ type -> decl : value_of('$1'). type -> '$empty' : unknown. Erlang code. +-moduledoc false. -export([t2s/1]). diff --git a/lib/wx/examples/demo/Makefile b/lib/wx/examples/demo/Makefile index 123c54580f26..e83c0673623f 100644 --- a/lib/wx/examples/demo/Makefile +++ b/lib/wx/examples/demo/Makefile @@ -61,6 +61,8 @@ TESTMODS = \ TESTTARGETS = $(TESTMODS:%=%.beam) TESTSRC = $(TESTMODS:%=%.erl) +ERL_COMPILE_FLAGS += +nowarn_missing_doc + # Targets $(TYPES): $(TESTTARGETS) clean: diff --git a/lib/wx/examples/simple/Makefile b/lib/wx/examples/simple/Makefile index 16ac01d40df5..682cd28f8217 100644 --- a/lib/wx/examples/simple/Makefile +++ b/lib/wx/examples/simple/Makefile @@ -30,6 +30,8 @@ TESTMODS = hello hello2 minimal menu TESTTARGETS = $(TESTMODS:%=%.beam) TESTSRC = $(TESTMODS:%=%.erl) +ERL_COMPILE_FLAGS += +nowarn_missing_doc + # Targets $(TYPES): $(TESTTARGETS) clean: diff --git a/lib/wx/examples/sudoku/Makefile b/lib/wx/examples/sudoku/Makefile index ccdcb7cd9f2c..d6f614e0f758 100644 --- a/lib/wx/examples/sudoku/Makefile +++ b/lib/wx/examples/sudoku/Makefile @@ -30,6 +30,8 @@ TESTMODS = sudoku sudoku_board sudoku_game sudoku_gui TESTTARGETS = $(TESTMODS:%=%.beam) TESTSRC = $(TESTMODS:%=%.erl) +ERL_COMPILE_FLAGS += +nowarn_missing_doc + # Targets $(TYPES): $(TESTTARGETS) clean: diff --git a/lib/wx/src/Makefile b/lib/wx/src/Makefile index b055dfed4a05..6a0fc332adc6 100644 --- a/lib/wx/src/Makefile +++ b/lib/wx/src/Makefile @@ -33,7 +33,7 @@ EGEN = gen EBIN = ../ebin ERLC = erlc ERLINC = ../include -ERL_COMPILE_FLAGS += -I$(ERLINC) +warn_unused_vars +ERL_COMPILE_FLAGS += -I$(ERLINC) +warn_unused_vars +nowarn_missing_doc ARCHIVE = wx-$(VSN).ez diff --git a/lib/xmerl/src/xmerl_b64Bin.yrl b/lib/xmerl/src/xmerl_b64Bin.yrl index 7028cc079c9c..1153809a2104 100644 --- a/lib/xmerl/src/xmerl_b64Bin.yrl +++ b/lib/xmerl/src/xmerl_b64Bin.yrl @@ -67,3 +67,6 @@ b64 -> b64x. b16 -> b04. b16 -> b16x. + +Erlang code. +-moduledoc false. diff --git a/lib/xmerl/src/xmerl_sax_parser_latin1.erlsrc b/lib/xmerl/src/xmerl_sax_parser_latin1.erlsrc index 6e59347fb878..9ce25031fc42 100644 --- a/lib/xmerl/src/xmerl_sax_parser_latin1.erlsrc +++ b/lib/xmerl/src/xmerl_sax_parser_latin1.erlsrc @@ -24,6 +24,7 @@ %% Created : 26 May 2008 %%---------------------------------------------------------------------- -module(xmerl_sax_parser_latin1). +-moduledoc false. %%---------------------------------------------------------------------- %% Macros diff --git a/lib/xmerl/src/xmerl_sax_parser_list.erlsrc b/lib/xmerl/src/xmerl_sax_parser_list.erlsrc index bb9213bff113..c287da95531f 100644 --- a/lib/xmerl/src/xmerl_sax_parser_list.erlsrc +++ b/lib/xmerl/src/xmerl_sax_parser_list.erlsrc @@ -24,6 +24,7 @@ %% Created : 25 Apr 2008 %%---------------------------------------------------------------------- -module(xmerl_sax_parser_list). +-moduledoc false. %%---------------------------------------------------------------------- %% Macros diff --git a/lib/xmerl/src/xmerl_sax_parser_utf16be.erlsrc b/lib/xmerl/src/xmerl_sax_parser_utf16be.erlsrc index ec89024729f0..e7f64620a281 100644 --- a/lib/xmerl/src/xmerl_sax_parser_utf16be.erlsrc +++ b/lib/xmerl/src/xmerl_sax_parser_utf16be.erlsrc @@ -24,6 +24,7 @@ %% Created : 26 May 2008 %%---------------------------------------------------------------------- -module(xmerl_sax_parser_utf16be). +-moduledoc false. %%---------------------------------------------------------------------- %% Macros diff --git a/lib/xmerl/src/xmerl_sax_parser_utf16le.erlsrc b/lib/xmerl/src/xmerl_sax_parser_utf16le.erlsrc index 566333a0451d..c745ec3aeb20 100644 --- a/lib/xmerl/src/xmerl_sax_parser_utf16le.erlsrc +++ b/lib/xmerl/src/xmerl_sax_parser_utf16le.erlsrc @@ -24,6 +24,7 @@ %% Created : 26 May 2008 %%---------------------------------------------------------------------- -module(xmerl_sax_parser_utf16le). +-moduledoc false. %%---------------------------------------------------------------------- %% Macros diff --git a/lib/xmerl/src/xmerl_sax_parser_utf8.erlsrc b/lib/xmerl/src/xmerl_sax_parser_utf8.erlsrc index f41d06d01390..b8434b8e23e1 100644 --- a/lib/xmerl/src/xmerl_sax_parser_utf8.erlsrc +++ b/lib/xmerl/src/xmerl_sax_parser_utf8.erlsrc @@ -24,6 +24,7 @@ %% Created : 27 May 2008 %%---------------------------------------------------------------------- -module(xmerl_sax_parser_utf8). +-moduledoc false. %%---------------------------------------------------------------------- %% Macros diff --git a/lib/xmerl/src/xmerl_xpath_parse.yrl b/lib/xmerl/src/xmerl_xpath_parse.yrl index 1926e7ee84ef..98a5193e381d 100644 --- a/lib/xmerl/src/xmerl_xpath_parse.yrl +++ b/lib/xmerl/src/xmerl_xpath_parse.yrl @@ -301,6 +301,7 @@ Expect 2. Erlang code. +-moduledoc false. % token({Token, _Line}) -> % Token; diff --git a/make/otp.mk.in b/make/otp.mk.in index 589148c6126e..51a5aa0d79f1 100644 --- a/make/otp.mk.in +++ b/make/otp.mk.in @@ -103,7 +103,7 @@ endif ifdef PRIMARY_BOOTSTRAP ERL_COMPILE_FLAGS += +slim else - ERL_COMPILE_FLAGS += +debug_info + ERL_COMPILE_FLAGS += +debug_info +warn_missing_doc_function +warn_missing_doc_callback endif ifeq ($(ERL_DETERMINISTIC),yes) ERL_COMPILE_FLAGS += +deterministic From 3b16df870a65332f8751d46dc917658dac23d4df Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Thu, 15 Feb 2024 15:03:16 +0100 Subject: [PATCH 5/5] Update primary bootstrap --- bootstrap/lib/compiler/ebin/beam_doc.beam | Bin 21036 -> 18516 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bootstrap/lib/compiler/ebin/beam_doc.beam b/bootstrap/lib/compiler/ebin/beam_doc.beam index f3d9bbe641e605a1096a42657835062507a85dcf..26750e373fa9c69667915bd5fdfdcca11e15f8f5 100644 GIT binary patch literal 18516 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 literal 21036 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

C~wC0>0LeP%;!yS>~YeMLD)RRHvq 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