File 1162-stdlib-put-more-descriptive-values-for-cached-data-i.patch of Package erlang
From 251a98b434662478409e8edcd7d561e1c0ff01c3 Mon Sep 17 00:00:00 2001
From: Fredrik Frantzen <frazze@erlang.org>
Date: Thu, 9 Jan 2025 12:39:50 +0100
Subject: [PATCH 2/2] stdlib: put more descriptive values for cached data in
edlin_type_suggestion
---
lib/stdlib/src/edlin_type_suggestion.erl | 68 +++++++++++++-----------
1 file changed, 36 insertions(+), 32 deletions(-)
diff --git a/lib/stdlib/src/edlin_type_suggestion.erl b/lib/stdlib/src/edlin_type_suggestion.erl
index aa5ca05da1..2a51d2057a 100644
--- a/lib/stdlib/src/edlin_type_suggestion.erl
+++ b/lib/stdlib/src/edlin_type_suggestion.erl
@@ -39,17 +39,17 @@ type_tree(Mod, FunType, Nestings, FT) ->
%% a new result should be calculated. Preferably only types that depend on the table
%% would be invalidated, but it may turn advanced.
%% TODO look this over to make sure we don't do unnecessary work,
- case get({type_traverser, Mod, FunType, Nestings}) of
+ case get({?MODULE, type_traverser, Mod, FunType, Nestings}) of
undefined -> Res = type_traverser_cache(Mod, FunType, #{}, length(Nestings)+1, FT),
- put({type_traverser, Mod, FunType, Nestings}, Res),
+ put({?MODULE, type_traverser, Mod, FunType, Nestings}, Res),
Res;
Res -> Res
end.
type_traverser_cache(Mod, T, Visited, Level, FT) ->
- case get({Mod, T, Level}) of
+ case get({?MODULE, type_traverser_intermediate_result, Mod, T, Level}) of
undefined ->
Res = type_traverser(Mod, T, Visited, Level, FT),
- put({Mod, T, Level}, Res),
+ put({?MODULE, type_traverser_intermediate_result, Mod, T, Level}, Res),
Res;
Res -> Res
end.
@@ -123,13 +123,13 @@ type_traverser(_, {remote_type,_,[{_,_,Mod},{_,_,Name}, Params]}=T, Visited, Lev
type_traverser(Mod, {user_type,_,Name,Params}=T, Visited, 1=Level, FT) ->
case maps:is_key(strip_anno(T), Visited) of
false ->
- case get({strip_anno(T), 1}) of
+ case get({?MODULE, type_traverser_intermediate_result, strip_anno(T), 1}) of
undefined ->
Res = case lookup_type(Mod, Name, length(Params), FT) of
hidden -> {type, Mod, Name, [type_traverser(Mod, P, Visited#{ strip_anno(T) => true }, Level, FT) || P <- Params]};
Type -> {user_type, Mod, Name, [type_traverser(Mod, P, Visited#{ strip_anno(T) => true }, Level, FT) || P <- Params], type_traverser(Mod, Type, Visited#{ strip_anno(T) => true }, Level, FT)}
end,
- put({strip_anno(T), 1}, Res),
+ put({?MODULE, type_traverser_intermediate_result, strip_anno(T), 1}, Res),
Res;
Res -> Res
end;
@@ -138,13 +138,13 @@ type_traverser(Mod, {user_type,_,Name,Params}=T, Visited, 1=Level, FT) ->
type_traverser(_, {remote_type,_,[{_,_,Mod},{_,_,Name}, Params]}=T, Visited, 1=Level, FT) ->
case maps:is_key(strip_anno(T), Visited) of
false ->
- case get({strip_anno(T), 1}) of
+ case get({?MODULE, type_traverser_intermediate_result, strip_anno(T), 1}) of
undefined ->
Res = case lookup_type(Mod, Name, length(Params), FT) of
hidden -> {type, Mod, Name, [type_traverser(Mod, P, Visited#{ strip_anno(T) => true }, Level, FT) || P <- Params]};
Type -> {user_type, Mod, Name, [type_traverser(Mod, P, Visited#{ strip_anno(T) => true }, Level, FT) || P <- Params], type_traverser(Mod, Type, Visited#{ strip_anno(T) => true }, Level, FT)}
end,
- put({strip_anno(T), 1}, Res),
+ put({?MODULE, type_traverser_intermediate_result, strip_anno(T), 1}, Res),
Res;
Res -> Res
end;
@@ -153,13 +153,13 @@ type_traverser(_, {remote_type,_,[{_,_,Mod},{_,_,Name}, Params]}=T, Visited, 1=L
type_traverser(Mod, {user_type,_,Name,Params}=T, Visited, Level, FT) ->
case maps:is_key(strip_anno(T), Visited) of
false ->
- case get({strip_anno(T), Level}) of
+ case get({?MODULE, type_traverser_intermediate_result, strip_anno(T), Level}) of
undefined ->
Res = case lookup_type(Mod, Name, length(Params), FT) of
hidden -> {type, Mod, Name, [type_traverser(Mod, P, Visited#{ strip_anno(T) => true }, Level, FT) || P <- Params]};
Type -> type_traverser(Mod, Type, Visited#{ strip_anno(T) => true }, Level, FT)
end,
- put({strip_anno(T), Level}, Res),
+ put({?MODULE, type_traverser_intermediate_result, strip_anno(T), Level}, Res),
Res;
Res -> Res
end;
@@ -168,13 +168,13 @@ type_traverser(Mod, {user_type,_,Name,Params}=T, Visited, Level, FT) ->
type_traverser(_, {remote_type, _, [{_,_,Mod},{_,_,Name}, Params]}=T, Visited, Level, FT) ->
case maps:is_key(strip_anno(T), Visited) of
false ->
- case get({strip_anno(T), Level}) of
+ case get({?MODULE, type_traverser_intermediate_result, strip_anno(T), Level}) of
undefined ->
Res = case lookup_type(Mod, Name, length(Params), FT) of
hidden -> {type, Mod, Name, [type_traverser(Mod, P, Visited#{ strip_anno(T) => true }, Level, FT) || P <- Params]};
Type -> type_traverser(Mod, Type, Visited#{ strip_anno(T) => true }, Level, FT)
end,
- put({strip_anno(T), Level}, Res),
+ put({?MODULE, type_traverser_intermediate_result, strip_anno(T), Level}, Res),
Res;
Res -> Res
end;
@@ -193,13 +193,13 @@ type_traverser(_, {type, _, term, _}, _, _, _) ->
type_traverser(_, {type, _, Name, Params}=T, Visited, Level, FT) ->
case maps:is_key(strip_anno(T), Visited) of
false ->
- case get({strip_anno(T), 1}) of
+ case get({?MODULE, type_traverser_intermediate_result, strip_anno(T), 1}) of
undefined ->
Res = case lookup_type(erlang, Name, length(Params), FT) of
hidden -> {type, Name, [type_traverser(erlang, P, Visited#{ strip_anno(T) => true }, Level, FT) || P <- Params]};
Type -> type_traverser(erlang, Type, Visited#{ strip_anno(T) => true}, Level, FT)
end,
- put({strip_anno(T), 1}, Res),
+ put({?MODULE, type_traverser_intermediate_result, strip_anno(T), 1}, Res),
Res;
Res -> Res
end;
@@ -221,11 +221,15 @@ simplified_type(file, name, 0) -> {type, erlang, string, []};
simplified_type(_Module, _TypeName, _Arity) -> none.
code_get_doc_cache(Mod) ->
- case get(Mod) of
+ case get({?MODULE, module_debug_info_doc, Mod}) of
undefined ->
- Docs = code:get_doc(Mod, #{sources => [debug_info]}),
- put(Mod, Docs),
- Docs;
+ case code:get_doc(Mod, #{sources => [debug_info]}) of
+ {ok, #docs_v1{ docs = Docs }} ->
+ put({?MODULE, module_debug_info_doc, Mod}, Docs),
+ Docs;
+ _ -> put({?MODULE, module_debug_info_doc, Mod}, none),
+ none
+ end;
Docs -> Docs
end.
@@ -233,7 +237,12 @@ lookup_type(Mod, Type, Arity, FT) ->
case simplified_type(Mod, Type, Arity) of
none ->
case code_get_doc_cache(Mod) of
- {ok, #docs_v1{ docs = Docs } } ->
+ none ->
+ case [TypeAST || {{type, Type2}, {attribute,_,type,{_,TypeAST,_}}} <- FT, Type2 =:= Type] of
+ [] -> hidden; %% can be an opaque type or missing type
+ [SingleTypeAST] -> SingleTypeAST
+ end;
+ Docs ->
FnFunctions =
lists:filter(fun({{type, T, A},_Anno,_Sig,_Doc,_Meta}) ->
T =:= Type andalso A =:= Arity;
@@ -247,18 +256,17 @@ lookup_type(Mod, Type, Arity, FT) ->
[SingleTypeAST] -> SingleTypeAST
end;
[{_,_,_,_,#{signature := [{attribute,_,type,{_,TypeAST,_}}]}}] -> TypeAST
- end;
- _ ->
- case [TypeAST || {{type, Type2}, {attribute,_,type,{_,TypeAST,_}}} <- FT, Type2 =:= Type] of
- [] -> hidden; %% can be an opaque type or missing type
- [SingleTypeAST] -> SingleTypeAST
end
end;
T -> T
end.
get_function_type(Mod, Fun, Arity, FT) ->
- case code:get_doc(Mod, #{sources => [debug_info]}) of
- {ok, #docs_v1{ docs = Docs } } ->
+ case code_get_doc_cache(Mod) of
+ none when Mod =:= shell_default ->
+ lists:flatten([FunTypes || {{function_type, {shell_default, F, A}},{attribute,_,spec,{_,FunTypes}}} <- FT,
+ F =:= Fun, A =:= Arity]);
+ none -> [];
+ Docs ->
R = lists:flatten([FunTypes ||
{{function, F, A},_Anno,_Sig,_Doc, #{ signature := [{attribute,_,spec,{_,FunTypes}}]}} <- Docs,
F =:= Fun, A =:= Arity]),
@@ -267,12 +275,8 @@ get_function_type(Mod, Fun, Arity, FT) ->
lists:flatten([FunTypes ||
{{function_type, {shell_default, F, A}},{attribute,_,spec,{_,FunTypes}}} <- FT,
F =:= Fun, A =:= Arity]);
- _ -> R
- end;
- _ when Mod =:= shell_default ->
- lists:flatten([FunTypes || {{function_type, {shell_default, F, A}},{attribute,_,spec,{_,FunTypes}}} <- FT,
- F =:= Fun, A =:= Arity]);
- _ -> []
+ _ -> R
+ end
end.
get_arity(Constraints, Type, Nestings) ->
case get_arity1(Type, Constraints, Nestings) of
--
2.43.0