13
14:- consult('../load_builder'). 15
16:- use_module(library(lists)). 17
18:- multifile(pdt_reload:pdt_reload_listener/1). 19
20pdt_reload:pdt_reload_listener(Files) :-
21 with_mutex(meta_pred_finder,
22 ( flag(pdt_generate_factbase, true, true)
23 -> generate_factbase_with_metapred_analysis(Files)
24 ; true
25 )
26 ).
27
28generate_factbase_with_metapred_analysis([]) :-
29 ( flag(pdt_meta_pred_analysis, true, true)
30 -> find_all_meta_predicates
31 ; true
32 ), !.
33
34generate_factbase_with_metapred_analysis([File|Rest]) :-
35 generate_factbase(File),
36 generate_factbase_with_metapred_analysis(Rest).
37
38
51
52
54 55
56find_undeclared_meta_predicates_position(File, Offset, MetaSpec):-
57 58 with_mutex(meta_pred_finder,
59 get_all_userdefined_meta_predicates(MetaPreds)
60 ),
61 !,
62 member(Module:MetaSpec,MetaPreds),
63 filter_undeclared_predicate(Module, MetaSpec,File,Offset).
64
65
66filter_undeclared_predicate(Module, MetaSpec, FileName, Offset):-
67 \+(predicate_property(Module:MetaSpec,meta_predicate(_))),
68 lookup_filename_and_offset(Module:MetaSpec, FileName, Offset).
73find_missdeclared_meta_predicates_position(File, Offset, DeclaredMetaSpec, CorrectMetaSpec):-
74 get_all_userdefined_meta_predicates(MetaPreds),
75 !,
76 member(CorrectMetaSpec,MetaPreds),
77 CorrectMetaSpec = Module:MetaSpec,
78 predicate_property(Module:MetaSpec, meta_predicate(DeclaredMetaSpec)),
79 \+(same_meta_specs(MetaSpec, DeclaredMetaSpec)),
80 lookup_filename_and_offset(Module:MetaSpec, File, Offset).
81
82
83same_meta_specs(MetaSpec, DeclaredMetaSpec):-
84 MetaSpec =.. [Functor|Args],
85 DeclaredMetaSpec =.. [Functor|DeclaredArgs],
86 same_meta_args(Args,DeclaredArgs).
87
88
89same_meta_args([],[]).
90same_meta_args([A1|Rest1],[A2|Rest2]):-
91 number(A1),
92 !,
93 number(A2),
94 same_meta_args(Rest1, Rest2).
95same_meta_args([A1|Rest1],[A2|Rest2]):-
96 member(A1, [?,+,-,:]), 97 !,
98 member(A2, [?,+,-,:]), 99 same_meta_args(Rest1, Rest2).
100
101
102lookup_filename_and_offset(Module:Term, FileName, Offset):-
103 functor(Term, Functor ,Arity),
104 parse_util:predicateT_ri(Functor, Arity, Module, PId),
105 parse_util:predicateT(PId,FileId,_,_,_),
106 parse_util:fileT(FileId,FileName,_),
107 parse_util:filePosT(PId,Offset,_)