1/*****************************************************************************
    2 * This file is part of the Prolog Development Tool (PDT)
    3 * 
    4 * WWW: http://sewiki.iai.uni-bonn.de/research/pdt/start
    5 * Mail: pdt@lists.iai.uni-bonn.de
    6 * Copyright (C): 2004-2012, CS Dept. III, University of Bonn
    7 * 
    8 * All rights reserved. This program is  made available under the terms
    9 * of the Eclipse Public License v1.0 which accompanies this distribution,
   10 * and is available at http://www.eclipse.org/legal/epl-v10.html
   11 * 
   12 ****************************************************************************/
   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	
   39%	generate_factbase_with_metapred_analysis(File):-
   40%	%format('###File: ~w~n', [File]), 
   41%	with_mutex(meta_pred_finder,
   42%		(	flag(pdt_generate_factbase, true, true)
   43%		->	generate_factbase(File),
   44%			(	flag(pdt_meta_pred_analysis, true, true)
   45%			->	find_all_meta_predicates
   46%			;	true
   47%			)
   48%		;	true
   49%		)
   50%	).
   51	
   52	
   53%    get_all_userdefined_meta_predicates(_MetaPreds).
   54   % format('### Userdefined meta pred: ~w~n', [MetaPreds]).
   55
   56find_undeclared_meta_predicates_position(File, Offset, MetaSpec):-
   57    %generate_factbase_with_metapred_analysis(File),
   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).
 find_missdeclared_meta_predicates_position(?File, ?Offset, ?DeclaredMetaSpec, ?CorrectMetaSpec)
   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, [?,+,-,:]),				%":" also counts as non-meta-arg	 
   97    !,
   98    member(A2, [?,+,-,:]),				%":" also counts as non-meta-arg
   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,_)