PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/org.cs3.pdt.core/engine/org/cs3/pdt/annotate/indexer.pl

http://pgdt.googlecode.com/
Perl | 253 lines | 206 code | 47 blank | 0 comment | 3 complexity | eb5e5a0f77eb7877cae60cb35646af7e MD5 | raw file
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. % This file is part of the Prolog Development Tool (PDT)
  3. %
  4. % Author: Lukas Degener (among others)
  5. % E-mail: degenerl@cs.uni-bonn.de
  6. % WWW: http://roots.iai.uni-bonn.de/research/pdt
  7. % Copyright (C): 2004-2006, CS Dept. III, University of Bonn
  8. %
  9. % All rights reserved. This program is made available under the terms
  10. % of the Eclipse Public License v1.0 which accompanies this distribution,
  11. % and is available at http://www.eclipse.org/legal/epl-v10.html
  12. %
  13. % In addition, you may at your option use, modify and redistribute any
  14. % part of this program under the terms of the GNU Lesser General Public
  15. % License (LGPL), version 2.1 or, at your option, any later version of the
  16. % same license, as long as
  17. %
  18. % 1) The program part in question does not depend, either directly or
  19. % indirectly, on parts of the Eclipse framework and
  20. %
  21. % 2) the program part in question does not include files that contain or
  22. % are derived from third-party work and are therefor covered by special
  23. % license agreements.
  24. %
  25. % You should have received a copy of the GNU Lesser General Public License
  26. % along with this program; if not, write to the Free Software Foundation,
  27. % Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  28. %
  29. % ad 1: A program part is said to "depend, either directly or indirectly,
  30. % on parts of the Eclipse framework", if it cannot be compiled or cannot
  31. % be run without the help or presence of some part of the Eclipse
  32. % framework. All java classes in packages containing the "pdt" package
  33. % fragment in their name fall into this category.
  34. %
  35. % ad 2: "Third-party code" means any code that was originaly written as
  36. % part of a project other than the PDT. Files that contain or are based on
  37. % such code contain a notice telling you so, and telling you the
  38. % particular conditions under which they may be used, modified and/or
  39. % distributed.
  40. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  41. :-module(clause_indexer,[
  42. pdt_update_index/1,
  43. pdt_clear_index/1
  44. ]).
  45. %this module can be used as an annotator to updates the clause index according to the clauses defined (or not defined) in
  46. %the parsed file. It can also be used stand alone, provided that the file to be indexed has already been annotated.
  47. %The index table id used by the indexer is 'predicate_definitions'.
  48. :- use_module(library('org/cs3/pdt/annotate/pdt_annotator')).
  49. :- use_module(library('org/cs3/pdt/model/pdt_index')).
  50. :- use_module(library('org/cs3/pdt/model/pdt_handle')).
  51. :- use_module(library('org/cs3/pdt/util/pdt_util')).
  52. :- pdt_annotator([file],[
  53. library('org/cs3/pdt/annotate/export_annotator'),
  54. library('org/cs3/pdt/annotate/member_annotator')
  55. ]).
  56. file_annotation_hook([File|_],_,Annos,[indexed(IxTime)|Annos]):-
  57. time_file(File,ModTime),
  58. time_index(File,IxTime),
  59. update_index(File,Annos,ModTime,IxTime).
  60. cleanup_hook(File):-
  61. pdt_clear_index(File).
  62. cleanup_hook(File,Annos):-
  63. pdt_clear_index(File,Annos).
  64. pdt_update_index(FileSpec):-
  65. pdt_file_spec(FileSpec,File),
  66. time_file(File,ModTime),
  67. time_index(File,IxTime),
  68. pdt_file_annotation(File,Annos,_),
  69. update_index(File,Annos,ModTime,IxTime).
  70. pdt_clear_index(FileSpec):-
  71. pdt_file_spec(FileSpec,File),
  72. pdt_file_annotation(File,Annos,_),
  73. clear_index(File,Annos).
  74. pdt_clear_index(FileSpec,Annos):-
  75. pdt_file_spec(FileSpec,File),
  76. clear_index(File,Annos).
  77. update_index(_,_,ModTime,IxTime):-
  78. ModTime @=< IxTime,
  79. !.
  80. update_index(File,Annos,_,_):-
  81. get_time(IxTime),
  82. set_index_time(File,IxTime),
  83. update_predicate_definitions(File,Annos),
  84. update_module_definitions(File,Annos).
  85. clear_index(File,Annos):-
  86. clear_index_time(File),
  87. clear_predicate_definitions(File,Annos),
  88. clear_module_definitions(File,Annos).
  89. clear_predicate_definitions(File,Annos):-
  90. member(defines(Definitions),Annos),
  91. pdt_index_load(predicate_definitions,IX),
  92. unindex_clauses(File,Definitions,IX,NewIX),
  93. pdt_index_store(predicate_definitions,NewIX).
  94. update_predicate_definitions(File,Annos):-
  95. pdt_index_load(predicate_definitions,IX),
  96. index_clauses(File,Annos,IX,NewIX),
  97. pdt_index_store(predicate_definitions,NewIX).
  98. clear_module_definitions(File,Annos):-
  99. pdt_index_load(module_definitions,Ix),
  100. get_module_exports(Annos,Module,Handles),
  101. module_definition_index_entry(Module,File,Handles,Key,Value),
  102. pdt_index_remove(Ix,Key,Value,NewIX),
  103. pdt_index_store(module_definitions,NewIX).
  104. debugme.
  105. update_module_definitions(File,Annos):-
  106. ( File=='/tmp/test_input_11.pl'
  107. -> debugme
  108. ; true
  109. ),
  110. pdt_index_load(module_definitions,Ix),
  111. get_module_exports(Annos,Module,Handles),
  112. module_definition_index_entry(Module,File,Handles,Key,Value),
  113. pdt_index_put(Ix,Key,Value,NewIX),
  114. pdt_index_store(module_definitions,NewIX).
  115. get_module_exports(Annos,Module,Handles):-
  116. memberchk(defines_module(Module),Annos),
  117. !,
  118. memberchk(exports(Exports),Annos),
  119. exports_to_handles(Module,Exports,Handles).
  120. get_module_exports(Annos,user,Handles):-
  121. memberchk(defines(Defs),Annos),
  122. defines_to_handles(Defs,Handles).
  123. defines_to_handles([],[]).
  124. defines_to_handles([Module:Name/Arity|Defines],[Handle|Handles]):-
  125. !,
  126. pdt_virtual_handle(predicate_definition,[module(Module),name(Name),arity(Arity)],Handle),
  127. defines_to_handles(Defines,Handles).
  128. exports_to_handles(_,[],[]).
  129. exports_to_handles(Module,[Name/Arity|Exports],[Handle|Handles]):-
  130. !,
  131. pdt_virtual_handle(predicate_definition,[module(Module),name(Name),arity(Arity)],Handle),
  132. exports_to_handles(Module,Exports,Handles).
  133. exports_to_handles(Module,[_|Exports],[Handles]):-
  134. exports_to_handles(Module,Exports,Handles).
  135. index_clauses(File,Annos,IX,NewIX):-
  136. member(defines(Defs),Annos),
  137. member(defines_multifile(MultifileDefs),Annos),
  138. member(defines_dynamic(DynamicDefs),Annos),
  139. member(defines_module_transparent(TransparentDefs),Annos),
  140. ( member(exports(Exports),Annos)
  141. -> true
  142. ; Exports=[]
  143. ),
  144. index_clauses(IX,File,Defs,DynamicDefs,MultifileDefs,TransparentDefs,Exports,NewIX).
  145. index_clauses(IX,_,[],_,_,_,_,IX).
  146. index_clauses(IX,File,[Def|Defs],DynamicDefs,MultifileDefs,TransparentDefs,Exports,OutIX):-
  147. index_clause(IX,File,Def,DynamicDefs,MultifileDefs,TransparentDefs,Exports,
  148. NextDynamicDefs,NextMultifileDefs,NextTransparentDefs,NextExports,NextIX),
  149. index_clauses(NextIX,File,Defs,NextDynamicDefs,NextMultifileDefs,NextTransparentDefs,NextExports,OutIX).
  150. index_clause(IX,File,Def,DynamicDefs,MultifileDefs,TransparentDefs,Exports,
  151. NextDynamicDefs,NextMultifileDefs,NextTransparentDefs,NextExports,NextIX):-
  152. M:N/A=Def,
  153. Props0=[file(File),module(M),name(N),arity(A)],
  154. matcher(Def,DynamicDefs,dynamic(true),Props0,Props1,NextDynamicDefs),
  155. matcher(Def,MultifileDefs,multifile(true),Props1,Props2,NextMultifileDefs),
  156. matcher(Def,TransparentDefs,transparent(true),Props2,Props3,NextTransparentDefs),
  157. matcher(N/A,Exports,exported(true),Props3,Props4,NextExports),
  158. index_clause(IX,File,Def,Props4,NextIX).
  159. index_clause(IX,File,Def,Props,NextIX):-
  160. clause_definition_index_entry(Def,File,Props,Key,Value),
  161. pdt_index_put(IX,Key,Value,NextIX).
  162. unindex_clauses(_,[],IX,IX).
  163. unindex_clauses(File,[Definition|Definitions],IX,NewIX):-
  164. clause_definition_index_entry(Definition,File,_,Key,Value),
  165. pdt_index_remove(IX,Key,Value,NextIX),
  166. unindex_clauses(File,Definitions,NextIX,NewIX).
  167. % clause_definition_index_entry(+Signature,
  168. % +File
  169. % +Props,
  170. % -Key,
  171. % -Value)
  172. clause_definition_index_entry(Module:Name/Arity,
  173. File,
  174. Props,
  175. Name,
  176. handle(id(File,Module:Name/Arity), predicate_definition,Props)).
  177. module_definition_index_entry(Name,File,Exports,Name,handle(id(Name,File), module_definition,[name(Name),file(File),exports(Exports)])).
  178. :- dynamic index_time/2.
  179. time_index(File,IxTime):-
  180. index_time(File,IxTime),
  181. !.
  182. time_index(_, -1).
  183. set_index_time(File,Time):-
  184. retractall(index_time(File,_)),
  185. assert(index_time(File,Time)).
  186. clear_index_time(File):-
  187. retractall(index_time(File,_)).
  188. % matcher(+Elm,+Elms,+Prop,+InProps,-OutProps,-OutElms)
  189. %
  190. % Elms should be a sorted, list.
  191. % Searches in Elms for elements matching Elm. If one is found,
  192. % OutProps is unified with [Prop|OutProps].
  193. % OutElms is unified with the first suffix of elms whos elements
  194. % are stricly greater then Elm.
  195. %
  196. matcher(Elm,[Elm|Elms],Prop,InProps,[Prop|InProps],OutElms):-
  197. !,%head matches
  198. pdt_chop_after(Elm,Elms,OutElms).
  199. matcher(Elm,Elms,_,InProps,InProps,Elms):-
  200. %head > Elm. There cannot be another match.
  201. pdt_chop_before(Elm,Elms,Elms), % same as chop_after in this case.
  202. !.
  203. matcher(Elm,Elms,Prop,InProps,OutProps,OutElms):-
  204. %head < Elms. There may be a match further down the list.
  205. pdt_chop_before(Elm,Elms,NextElms),
  206. matcher(Elm,NextElms,Prop,InProps,OutProps,OutElms).