1 % (c) 2009-2024 Lehrstuhl fuer Softwaretechnik und Programmiersprachen,
2 % Heinrich Heine Universitaet Duesseldorf
3 % This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html)
4
5 % term_expansion/6 hook for the debugging_calls module
6 % this file should only be used by the debugging_calls module
7
8 :- use_module(module_information,[module_info/3]).
9
10 :- module_info(debugging_calls_te,group,infrastructure).
11 :- module_info(debugging_calls_te,description,'This sub-module contains the term-expansing code of the debugging call module, to remove ~~ calls').
12
13 :- dynamic current_context/2.
14 current_context(none,none).
15
16 assert_layout(File,Layout,NewPos) :-
17 print('Layout:'),print(Layout),nl,
18 retractall(current_context(_,_)),
19 (Layout = [NewPos|_] -> true ; NewPos = none),
20 assertz(current_context(File,NewPos)).
21
22 logte(_Term,Layout) :-
23 prolog_load_context(file,File),
24 current_context(Before,OldPos),
25 assert_layout(File,Layout,NewPos),
26 ( File=Before ->
27 true
28 ;
29 print('### start: '),
30 print(File),print('/'),print(NewPos),
31 print(', was: '),
32 print(Before),print('/'),print(OldPos),nl).
33
34
35 expand((:- meta_predicate '~~'(_X)),_Layout1,_Term2,_Layout2) :- !,
36 %print(not_removing_in_meta_predicate('~~'(_X))),nl,
37 fail.
38 expand((:- use_module(library(Lib))),Layout1,Term2,Layout2) :-
39 library_to_patch(Lib,PatchedLib),
40 (prolog_load_context(module,CurModule) -> true ; CurModule=user),
41 \+ ignore_patches_in_module(CurModule),
42 !,
43 Layout2 = Layout1,
44 format('Patching use_module(library(~w)) in ~w to ~w~n',[Lib,CurModule,PatchedLib]),
45 Term2 = (:- use_module(PatchedLib)).
46 expand((:- use_module(library(Lib),Preds)),Layout1,Term2,Layout2) :-
47 library_to_patch(Lib,PatchedLib),
48 Preds \= [], % so that there is a way to bypass the term expander
49 current_module(CurModule),
50 (prolog_load_context(module,CurModule) -> true ; CurModule=user),
51 \+ ignore_patches_in_module(CurModule),
52 !,
53 Layout2 = Layout1,
54 format('Patching use_module(library(~w),~w) in ~w to ~w~n',[Lib,Preds,CurModule,PatchedLib]),
55 Term2 = (:- use_module(PatchedLib,Preds)).
56 expand(Term1,Layout1,Term2,Layout2) :-
57 % removes terms like ~~ pp_mnf,...
58 debugging_calls:remove_debugging_calls(Layout1,Term1,Layout2,Term2).
59
60 % patch libraries for plspec
61 :- load_files(library(system), [when(compile_time), imports([environ/2])]).
62 :- if(environ(plspec_patch_libraries,true)).
63 library_to_patch(ordsets,library_plspec(ordsetsp)).
64 library_to_patch(avl,library_plspec(avlp)).
65 library_to_patch(lists,library_plspec(listsp)).
66 :- endif.
67 library_to_patch('~~'(X),library(X)).
68
69 ignore_patches_in_module(X) :- var(X),!.
70 ignore_patches_in_module(plspec).
71 ignore_patches_in_module(plspec_core).
72 ignore_patches_in_module(plspec_logger).
73 ignore_patches_in_module(prettyprinter).
74 ignore_patches_in_module(validator).
75
76 ignore_patches_in_module(debugging_calls).
77 ignore_patches_in_module(pathes).
78 ignore_patches_in_module(module_information).
79
80 ignore_patches_in_module('$restore').
81 ignore_patches_in_module('$save').
82 ignore_patches_in_module(alignments).
83 ignore_patches_in_module(avl).
84 ignore_patches_in_module(clpfd).
85 ignore_patches_in_module(chr).
86 ignore_patches_in_module(codesio).
87 ignore_patches_in_module(file_systems).
88 ignore_patches_in_module(ordsets).
89 ignore_patches_in_module(lists).
90 ignore_patches_in_module(prolog).
91 ignore_patches_in_module(structs).
92 ignore_patches_in_module(system).
93 ignore_patches_in_module(terms).
94 ignore_patches_in_module(types).
95 ignore_patches_in_module('SU_messages').
96
97 :- if((environ(prob_debug_flag,true) ; environ(plspec_patch_libraries,true))).
98 :- multifile user:term_expansion/6.
99 user:term_expansion(Term1, Layout1, Ids, Term2, Layout2, [rm_debug_calls|Ids]) :-
100 nonvar(Term1), nonmember(rm_debug_calls,Ids),
101 expand(Term1,Layout1,Term2,Layout2).
102 :- endif.
103
104
105