34
35:- module(deref_reexport, [deref_reexport/2]). 36
37:- use_module(library(called_from)). 38:- use_module(library(from_utils)). 39:- use_module(library(infer_alias)). 40:- use_module(library(pretty_decl)). 41
42deref_reexport(Alias, OptionL) :-
43 absolute_file_name(Alias, AFile, [file_type(prolog), access(read)]),
44 module_property(M, file(AFile)),
45 module_property(M, exports(ExL)),
46 ( \+ ( member(F/A, ExL),
47 functor(H, F, A),
48 predicate_property(M:H, imported_from(_))
49 )
50 ->print_message(information, format("~w does not have reexports", [Alias]))
51 ; freeze(H1, once((member(F/A, ExL), functor(H1, F, A)))),
52 collect_called_from(H1, RM, _, _, OptionL),
53 findall(File/CM, called_from_w(_, M, RM, CM, File), FileCMU),
54 sort(FileCMU, FileCML),
55 findall(File/CM-RMPIG,
56 ( member(File/CM, FileCML),
57 findall((RM-F/A),
58 ( called_from_w(H2, M, RM, CM, File),
59 functor(H2, F, A),
60 ( RM = M
61 ->true
62 ; \+ file_to_module:declared_use_module(F, A, RM, CM, _, File)
63 )
64 ), RMPIU),
65 sort(RMPIU, RMPIL),
66 group_pairs_by_key(RMPIL, RMPIG)
67 ), FileRMPIG),
68 forall(member(File/CM-RMPIL, FileRMPIG),
69 update_use_module(AFile, M, RMPIL, File, CM))
70 ).
71
72called_from_w(H, M, RM, CM, File) :-
73 called_from:called_from_db(H, RM, CM, _, From),
74 RM \= CM,
75 ( RM = M
76 ->true
77 ; predicate_property(M:H, imported_from(RM))
78 ),
79 from_to_file(From, File).
80
81update_use_module(AFile, M, RMPIL, File, CM) :-
82 module_property(M, exports(ExL)),
83 replace_sentence((:- use_module(A)),
84 DeclL,
85 collect_decls(AFile, RMPIL, CM, A, ExL, ExL, DeclL),
86 [file(File)]),
87 replace_sentence((:- use_module(A, ImS)),
88 DeclL,
89 collect_decls(AFile, RMPIL, CM, A, ExL, ImS, DeclL),
90 [file(File)]).
91
92collect_decls(AFile, RMPIL, CM, A, ExL, ImS, DeclL) :-
93 absolute_file_name(A, AF, [file_type(prolog), access(read)]),
94 AF = AFile,
95 ( ImS = except(Exc)
96 ->subtract(ExL, Exc, ImL)
97 ; ImL = ImS
98 ),
99 ImL \= [],
100 findall(PDecl,
101 ( member(RM-RPIL, RMPIL),
102 intersection(RPIL, ImL, PIL),
103 module_property(RM, file(RF)),
104 library_alias(RF, RA),
105 ( \+ ( module_property(RM, exports(ExL)),
106 member(F/A, ExL),
107 \+ member(F/A, PIL),
108 functor(H, F, A),
109 module_property(CM:H, defined)
110 )
111 ->Decl = (:- use_module(RA))
112 ; Decl = (:- use_module(RA, PIL))
113 ),
114 pretty_decl(Decl, PDecl)
115 ), DeclL)