37
38:- module(prolog_colour,
39 [ prolog_colourise_stream/3, 40 prolog_colourise_stream/4, 41 prolog_colourise_term/4, 42 prolog_colourise_query/3, 43 syntax_colour/2, 44 syntax_message//1 45 ]). 46:- use_module(library(record),[(record)/1, op(_,_,record)]). 47:- autoload(library(apply),[maplist/3]). 48:- autoload(library(debug),[debug/3]). 49:- autoload(library(error),[is_of_type/2]). 50:- autoload(library(lists),[member/2,append/3]). 51:- autoload(library(operators),
52 [push_operators/1,pop_operators/0,push_op/3]). 53:- autoload(library(option),[option/3]). 54:- autoload(library(predicate_options),
55 [current_option_arg/2,current_predicate_options/3]). 56:- autoload(library(prolog_clause),[predicate_name/2]). 57:- autoload(library(prolog_source),
58 [ load_quasi_quotation_syntax/2,
59 read_source_term_at_location/3,
60 prolog_canonical_source/2
61 ]). 62:- autoload(library(prolog_xref),
63 [ xref_option/2,
64 xref_public_list/3,
65 xref_op/2,
66 xref_prolog_flag/4,
67 xref_module/2,
68 xref_meta/3,
69 xref_source_file/4,
70 xref_defined/3,
71 xref_called/3,
72 xref_defined_class/3,
73 xref_exported/2,
74 xref_hook/1
75 ]). 76
77:- meta_predicate
78 prolog_colourise_stream(+, +, 3),
79 prolog_colourise_stream(+, +, 3, +),
80 prolog_colourise_query(+, +, 3),
81 prolog_colourise_term(+, +, 3, +). 82
83:- predicate_options(prolog_colourise_term/4, 4,
84 [ subterm_positions(-any)
85 ]). 86:- predicate_options(prolog_colourise_stream/4, 4,
87 [ operators(list(any))
88 ]). 89
96
97
98:- multifile
99 style/2, 100 message//1, 101 term_colours/2, 102 goal_colours/2, 103 goal_colours/3, 104 directive_colours/2, 105 goal_classification/2, 106 vararg_goal_classification/3. 107
108
109:- record
110 colour_state(source_id_list,
111 module,
112 stream,
113 closure,
114 singletons). 115
116colour_state_source_id(State, SourceID) :-
117 colour_state_source_id_list(State, SourceIDList),
118 member(SourceID, SourceIDList).
119
138
139prolog_colourise_stream(Fd, SourceId, ColourItem) :-
140 prolog_colourise_stream(Fd, SourceId, ColourItem, []).
141prolog_colourise_stream(Fd, SourceId, ColourItem, Options) :-
142 to_list(SourceId, SourceIdList),
143 make_colour_state([ source_id_list(SourceIdList),
144 stream(Fd),
145 closure(ColourItem)
146 ],
147 TB),
148 option(operators(Ops), Options, []),
149 setup_call_cleanup(
150 save_settings(TB, Ops, State),
151 colourise_stream(Fd, TB),
152 restore_settings(State)).
153
154to_list(List, List) :-
155 is_list(List),
156 !.
157to_list(One, [One]).
158
159
160colourise_stream(Fd, TB) :-
161 ( peek_char(Fd, #) 162 -> skip(Fd, 10)
163 ; true
164 ),
165 repeat,
166 colour_state_module(TB, SM),
167 character_count(Fd, Start),
168 catch(read_term(Fd, Term,
169 [ subterm_positions(TermPos),
170 singletons(Singletons0),
171 module(SM),
172 comments(Comments)
173 ]),
174 E,
175 read_error(E, TB, Start, Fd)),
176 fix_operators(Term, SM, TB),
177 warnable_singletons(Singletons0, Singletons),
178 colour_state_singletons(TB, Singletons),
179 ( colourise_term(Term, TB, TermPos, Comments)
180 -> true
181 ; arg(1, TermPos, From),
182 print_message(warning,
183 format('Failed to colourise ~p at index ~d~n',
184 [Term, From]))
185 ),
186 Term == end_of_file,
187 !.
188
189save_settings(TB, Ops, state(Style, Flags, OSM, Xref)) :-
190 ( source_module(TB, SM)
191 -> true
192 ; SM = prolog_colour_ops
193 ),
194 set_xref(Xref, true),
195 '$set_source_module'(OSM, SM),
196 colour_state_module(TB, SM),
197 maplist(qualify_op(SM), Ops, QOps),
198 push_operators(QOps),
199 syntax_flags(Flags),
200 '$style_check'(Style, Style).
201
202qualify_op(M, op(P,T,N), op(P,T,M:N)) :-
203 atom(N), !.
204qualify_op(M, op(P,T,L), op(P,T,QL)) :-
205 is_list(L), !,
206 maplist(qualify_op_name(M), L, QL).
207qualify_op(_, Op, Op).
208
209qualify_op_name(M, N, M:N) :-
210 atom(N),
211 !.
212qualify_op_name(_, N, N).
213
214restore_settings(state(Style, Flags, OSM, Xref)) :-
215 restore_syntax_flags(Flags),
216 '$style_check'(_, Style),
217 pop_operators,
218 '$set_source_module'(OSM),
219 set_xref(_, Xref).
220
221set_xref(Old, New) :-
222 current_prolog_flag(xref, Old),
223 !,
224 set_prolog_flag(xref, New).
225set_xref(false, New) :-
226 set_prolog_flag(xref, New).
227
228
229syntax_flags(Pairs) :-
230 findall(set_prolog_flag(Flag, Value),
231 syntax_flag(Flag, Value),
232 Pairs).
233
234syntax_flag(Flag, Value) :-
235 syntax_flag(Flag),
236 current_prolog_flag(Flag, Value).
237
238restore_syntax_flags([]).
239restore_syntax_flags([set_prolog_flag(Flag, Value)|T]) :-
240 set_prolog_flag(Flag, Value),
241 restore_syntax_flags(T).
242
249
250source_module(TB, Module) :-
251 colour_state_source_id_list(TB, []),
252 !,
253 colour_state_module(TB, Module).
254source_module(TB, Module) :-
255 colour_state_source_id(TB, SourceId),
256 xref_option(SourceId, module(Module)),
257 !.
258source_module(TB, Module) :-
259 ( colour_state_source_id(TB, File),
260 atom(File)
261 ; colour_state_stream(TB, Fd),
262 is_stream(Fd),
263 stream_property(Fd, file_name(File))
264 ),
265 module_context(File, [], Module).
266
267module_context(File, _, Module) :-
268 source_file_property(File, module(Module)),
269 !.
270module_context(File, Seen, Module) :-
271 source_file_property(File, included_in(File2, _Line)),
272 \+ memberchk(File, Seen),
273 !,
274 module_context(File2, [File|Seen], Module).
275module_context(File, _, Module) :-
276 source_file_property(File, load_context(Module, _, _)).
277
278
282
283read_error(Error, TB, Start, EndSpec) :-
284 ( syntax_error(Error, Id, CharNo)
285 -> message_to_string(error(syntax_error(Id), _), Msg),
286 ( integer(EndSpec)
287 -> End = EndSpec
288 ; character_count(EndSpec, End)
289 ),
290 show_syntax_error(TB, CharNo:Msg, Start-End),
291 fail
292 ; throw(Error)
293 ).
294
295syntax_error(error(syntax_error(Id), stream(_S, _Line, _LinePos, CharNo)),
296 Id, CharNo).
297syntax_error(error(syntax_error(Id), file(_S, _Line, _LinePos, CharNo)),
298 Id, CharNo).
299syntax_error(error(syntax_error(Id), string(_Text, CharNo)),
300 Id, CharNo).
301
305
306warnable_singletons([], []).
307warnable_singletons([H|T0], List) :-
308 H = (Name=_Var),
309 ( '$is_named_var'(Name)
310 -> List = [H|T]
311 ; List = T
312 ),
313 warnable_singletons(T0, T).
314
316
317colour_item(Class, TB, Pos) :-
318 arg(1, Pos, Start),
319 arg(2, Pos, End),
320 Len is End - Start,
321 colour_state_closure(TB, Closure),
322 call(Closure, Class, Start, Len).
323
324
329
330safe_push_op(P, T, N0, State) :-
331 colour_state_module(State, CM),
332 strip_module(CM:N0, M, N),
333 ( is_list(N),
334 N \== [] 335 -> acyclic_term(N),
336 forall(member(Name, N),
337 safe_push_op(P, T, M:Name, State))
338 ; push_op(P, T, M:N)
339 ),
340 debug(colour, ':- ~w.', [op(P,T,M:N)]).
341
347
348fix_operators((:- Directive), M, Src) :-
349 ground(Directive),
350 catch(process_directive(Directive, M, Src), _, true),
351 !.
352fix_operators(_, _, _).
353
354:- multifile
355 prolog:xref_update_syntax/2. 356
357process_directive(Directive, M, _Src) :-
358 prolog:xref_update_syntax(Directive, M),
359 !.
360process_directive(style_check(X), _, _) :-
361 !,
362 style_check(X).
363process_directive(set_prolog_flag(Flag, Value), M, _) :-
364 syntax_flag(Flag),
365 !,
366 set_prolog_flag(M:Flag, Value).
367process_directive(M:op(P,T,N), _, Src) :-
368 !,
369 process_directive(op(P,T,N), M, Src).
370process_directive(op(P,T,N), M, Src) :-
371 !,
372 safe_push_op(P, T, M:N, Src).
373process_directive(module(_Name, Export), M, Src) :-
374 !,
375 forall(member(op(P,A,N), Export),
376 safe_push_op(P,A,M:N, Src)).
377process_directive(use_module(Spec), _, Src) :-
378 !,
379 catch(process_use_module1(Spec, Src), _, true).
380process_directive(use_module(Spec, Imports), _, Src) :-
381 !,
382 catch(process_use_module2(Spec, Imports, Src), _, true).
383process_directive(Directive, _, Src) :-
384 prolog_source:expand((:-Directive), Src, _).
385
386syntax_flag(character_escapes).
387syntax_flag(var_prefix).
388syntax_flag(allow_variable_name_as_functor).
389syntax_flag(allow_dot_in_atom).
390
394
395process_use_module1([], _) :- !.
396process_use_module1([H|T], Src) :-
397 !,
398 process_use_module1(H, Src),
399 process_use_module1(T, Src).
400process_use_module1(File, Src) :-
401 ( xref_public_list(File, Src,
402 [ exports(Exports),
403 silent(true),
404 path(Path)
405 ])
406 -> forall(member(op(P,T,N), Exports),
407 safe_push_op(P,T,N,Src)),
408 colour_state_module(Src, SM),
409 ( member(Syntax/4, Exports),
410 load_quasi_quotation_syntax(SM:Path, Syntax),
411 fail
412 ; true
413 )
414 ; true
415 ).
416
417process_use_module2(File, Imports, Src) :-
418 ( xref_public_list(File, Src,
419 [ exports(Exports),
420 silent(true),
421 path(Path)
422 ])
423 -> forall(( member(op(P,T,N), Exports),
424 member(op(P,T,N), Imports)),
425 safe_push_op(P,T,N,Src)),
426 colour_state_module(Src, SM),
427 ( member(Syntax/4, Exports),
428 member(Syntax/4, Imports),
429 load_quasi_quotation_syntax(SM:Path, Syntax),
430 fail
431 ; true
432 )
433 ; true
434 ).
435
442
443prolog_colourise_query(QueryString, SourceID, ColourItem) :-
444 query_colour_state(SourceID, ColourItem, TB),
445 setup_call_cleanup(
446 save_settings(TB, [], State),
447 colourise_query(QueryString, TB),
448 restore_settings(State)).
449
450query_colour_state(module(Module), ColourItem, TB) :-
451 !,
452 make_colour_state([ source_id_list([]),
453 module(Module),
454 closure(ColourItem)
455 ],
456 TB).
457query_colour_state(SourceID, ColourItem, TB) :-
458 to_list(SourceID, SourceIDList),
459 make_colour_state([ source_id_list(SourceIDList),
460 closure(ColourItem)
461 ],
462 TB).
463
464
465colourise_query(QueryString, TB) :-
466 colour_state_module(TB, SM),
467 string_length(QueryString, End),
468 ( catch(term_string(Query, QueryString,
469 [ subterm_positions(TermPos),
470 singletons(Singletons0),
471 module(SM),
472 comments(Comments)
473 ]),
474 E,
475 read_error(E, TB, 0, End))
476 -> warnable_singletons(Singletons0, Singletons),
477 colour_state_singletons(TB, Singletons),
478 colourise_comments(Comments, TB),
479 ( Query == end_of_file
480 -> true
481 ; colourise_body(Query, TB, TermPos)
482 )
483 ; true 484 ).
485
498
499prolog_colourise_term(Stream, SourceId, ColourItem, Options) :-
500 to_list(SourceId, SourceIdList),
501 make_colour_state([ source_id_list(SourceIdList),
502 stream(Stream),
503 closure(ColourItem)
504 ],
505 TB),
506 option(subterm_positions(TermPos), Options, _),
507 findall(Op, xref_op(SourceId, Op), Ops),
508 debug(colour, 'Ops from ~p: ~p', [SourceId, Ops]),
509 findall(Opt, xref_flag_option(SourceId, Opt), Opts),
510 character_count(Stream, Start),
511 ( source_module(TB, Module)
512 -> true
513 ; Module = prolog_colour_ops
514 ),
515 read_source_term_at_location(
516 Stream, Term,
517 [ module(Module),
518 operators(Ops),
519 error(Error),
520 subterm_positions(TermPos),
521 singletons(Singletons0),
522 comments(Comments)
523 | Opts
524 ]),
525 ( var(Error)
526 -> warnable_singletons(Singletons0, Singletons),
527 colour_state_singletons(TB, Singletons),
528 colour_item(range, TB, TermPos), 529 colourise_term(Term, TB, TermPos, Comments)
530 ; character_count(Stream, End),
531 TermPos = error_position(Start, End, Pos),
532 colour_item(range, TB, TermPos),
533 show_syntax_error(TB, Error, Start-End),
534 Error = Pos:_Message
535 ).
536
537xref_flag_option(TB, var_prefix(Bool)) :-
538 xref_prolog_flag(TB, var_prefix, Bool, _Line).
539
540show_syntax_error(TB, Pos:Message, Range) :-
541 integer(Pos),
542 !,
543 End is Pos + 1,
544 colour_item(syntax_error(Message, Range), TB, Pos-End).
545show_syntax_error(TB, _:Message, Range) :-
546 colour_item(syntax_error(Message, Range), TB, Range).
547
548
549singleton(Var, TB) :-
550 colour_state_singletons(TB, Singletons),
551 member_var(Var, Singletons).
552
553member_var(V, [_=V2|_]) :-
554 V == V2,
555 !.
556member_var(V, [_|T]) :-
557 member_var(V, T).
558
567
568colourise_term(Term, TB, TermPos, Comments) :-
569 colourise_comments(Comments, TB),
570 ( Term == end_of_file
571 -> true
572 ; colourise_term(Term, TB, TermPos),
573 colourise_fullstop(TB, TermPos)
574 ).
575
576colourise_fullstop(TB, TermPos) :-
577 arg(2, TermPos, EndTerm),
578 Start is EndTerm,
579 End is Start+1,
580 colour_item(fullstop, TB, Start-End).
581
(-, _).
583colourise_comments([], _).
584colourise_comments([H|T], TB) :-
585 colourise_comment(H, TB),
586 colourise_comments(T, TB).
587
((-)-_, _) :- !.
589colourise_comment(Pos-Comment, TB) :-
590 comment_style(Comment, Style),
591 stream_position_data(char_count, Pos, Start),
592 string_length(Comment, Len),
593 End is Start + Len + 1,
594 colour_item(comment(Style), TB, Start-End).
595
(Comment, structured) :- 597 structured_comment_start(Start),
598 sub_string(Comment, 0, Len, _, Start),
599 Next is Len+1,
600 string_code(Next, Comment, NextCode),
601 code_type(NextCode, space),
602 !.
603comment_style(Comment, line) :- 604 sub_string(Comment, 0, _, _, '%'),
605 !.
606comment_style(_, block). 607
612
('%%').
614structured_comment_start('%!').
615structured_comment_start('/**').
616
620
621colourise_term(Var, TB, Start-End) :-
622 var(Var),
623 !,
624 colour_item(instantiation_error, TB, Start-End).
625colourise_term(_, _, Pos) :-
626 var(Pos),
627 !.
628colourise_term(Term, TB, parentheses_term_position(PO,PC,Pos)) :-
629 !,
630 colour_item(parentheses, TB, PO-PC),
631 colourise_term(Term, TB, Pos).
632colourise_term(Term, TB, Pos) :-
633 term_colours(Term, FuncSpec-ArgSpecs),
634 !,
635 Pos = term_position(F,T,FF,FT,ArgPos),
636 colour_item(term, TB, F-T), 637 specified_item(FuncSpec, Term, TB, FF-FT),
638 specified_items(ArgSpecs, Term, TB, ArgPos).
639colourise_term((Pre=>Body), TB,
640 term_position(F,T,FF,FT,[PP,BP])) :-
641 nonvar(Pre),
642 Pre = (Head,Cond),
643 PP = term_position(_HF,_HT,_HFF,_HFT,[HP,CP]),
644 !,
645 colour_item(clause, TB, F-T),
646 colour_item(neck(=>), TB, FF-FT),
647 colourise_clause_head(Head, TB, HP),
648 colour_item(rule_condition, TB, CP),
649 colourise_body(Cond, Head, TB, CP),
650 colourise_body(Body, Head, TB, BP).
651colourise_term(Term, TB,
652 term_position(F,T,FF,FT,[HP,BP])) :-
653 neck(Term, Head, Body, Neck),
654 !,
655 colour_item(clause, TB, F-T),
656 colour_item(neck(Neck), TB, FF-FT),
657 colourise_clause_head(Head, TB, HP),
658 colourise_body(Body, Head, TB, BP).
659colourise_term(((Head,RHC) --> Body), TB,
660 term_position(F,T,FF,FT,
661 [ term_position(_,_,_,_,[HP,RHCP]),
662 BP
663 ])) :-
664 !,
665 colour_item(grammar_rule, TB, F-T),
666 colour_item(dcg_right_hand_ctx, TB, RHCP),
667 colourise_term_arg(RHC, TB, RHCP),
668 colour_item(neck(-->), TB, FF-FT),
669 colourise_extended_head(Head, 2, TB, HP),
670 colourise_dcg(Body, Head, TB, BP).
671colourise_term((Head --> Body), TB, 672 term_position(F,T,FF,FT,[HP,BP])) :-
673 !,
674 colour_item(grammar_rule, TB, F-T),
675 colour_item(neck(-->), TB, FF-FT),
676 colourise_extended_head(Head, 2, TB, HP),
677 colourise_dcg(Body, Head, TB, BP).
678colourise_term(:->(Head, Body), TB,
679 term_position(F,T,FF,FT,[HP,BP])) :-
680 !,
681 colour_item(method, TB, F-T),
682 colour_item(neck(:->), TB, FF-FT),
683 colour_method_head(send(Head), TB, HP),
684 colourise_method_body(Body, TB, BP).
685colourise_term(:<-(Head, Body), TB,
686 term_position(F,T,FF,FT,[HP,BP])) :-
687 !,
688 colour_item(method, TB, F-T),
689 colour_item(neck(:<-), TB, FF-FT),
690 colour_method_head(get(Head), TB, HP),
691 colourise_method_body(Body, TB, BP).
692colourise_term((:- Directive), TB, Pos) :-
693 !,
694 colour_item(directive, TB, Pos),
695 Pos = term_position(_F,_T,FF,FT,[ArgPos]),
696 colour_item(neck(directive), TB, FF-FT),
697 colourise_directive(Directive, TB, ArgPos).
698colourise_term((?- Directive), TB, Pos) :-
699 !,
700 colourise_term((:- Directive), TB, Pos).
701colourise_term(end_of_file, _, _) :- !.
702colourise_term(Fact, TB, Pos) :-
703 !,
704 colour_item(clause, TB, Pos),
705 colourise_clause_head(Fact, TB, Pos).
706
707neck((Head :- Body), Head, Body, :-).
708neck((Head => Body), Head, Body, =>).
709neck(?=>(Head, Body), Head, Body, ?=>).
710
716
717colourise_extended_head(Head, N, TB, Pos) :-
718 extend(Head, N, TheHead),
719 colourise_clause_head(TheHead, TB, Pos).
720
721extend(M:Head, N, M:ExtHead) :-
722 nonvar(Head),
723 !,
724 extend(Head, N, ExtHead).
725extend(Head, N, ExtHead) :-
726 compound(Head),
727 !,
728 compound_name_arguments(Head, Name, Args),
729 length(Extra, N),
730 append(Args, Extra, NArgs),
731 compound_name_arguments(ExtHead, Name, NArgs).
732extend(Head, N, ExtHead) :-
733 atom(Head),
734 !,
735 length(Extra, N),
736 compound_name_arguments(ExtHead, Head, Extra).
737extend(Head, _, Head).
738
739
740colourise_clause_head(_, _, Pos) :-
741 var(Pos),
742 !.
743colourise_clause_head(Head, TB, parentheses_term_position(PO,PC,Pos)) :-
744 colour_item(parentheses, TB, PO-PC),
745 colourise_clause_head(Head, TB, Pos).
746colourise_clause_head(M:Head, TB, QHeadPos) :-
747 QHeadPos = term_position(_,_,QF,QT,[MPos,HeadPos]),
748 head_colours(M:Head, meta-[_, ClassSpec-ArgSpecs]),
749 !,
750 colourise_module(M, TB, MPos),
751 colour_item(functor, TB, QF-QT),
752 functor_position(HeadPos, FPos, ArgPos),
753 ( ClassSpec == classify
754 -> classify_head(TB, Head, Class)
755 ; Class = ClassSpec
756 ),
757 colour_item(head_term(Class, Head), TB, QHeadPos),
758 colour_item(head(Class, Head), TB, FPos),
759 specified_items(ArgSpecs, Head, TB, ArgPos).
760colourise_clause_head(Head, TB, Pos) :-
761 head_colours(Head, ClassSpec-ArgSpecs),
762 !,
763 functor_position(Pos, FPos, ArgPos),
764 ( ClassSpec == classify
765 -> classify_head(TB, Head, Class)
766 ; Class = ClassSpec
767 ),
768 colour_item(head_term(Class, Head), TB, Pos),
769 colour_item(head(Class, Head), TB, FPos),
770 specified_items(ArgSpecs, Head, TB, ArgPos).
771colourise_clause_head(:=(Eval, Ret), TB,
772 term_position(_,_,AF,AT,
773 [ term_position(_,_,SF,ST,
774 [ SelfPos,
775 FuncPos
776 ]),
777 RetPos
778 ])) :-
779 Eval =.. [.,M,Func],
780 FuncPos = term_position(_,_,FF,FT,_),
781 !,
782 colourise_term_arg(M, TB, SelfPos),
783 colour_item(func_dot, TB, SF-ST), 784 colour_item(dict_function(Func), TB, FF-FT),
785 colourise_term_args(Func, TB, FuncPos),
786 colour_item(dict_return_op, TB, AF-AT), 787 colourise_term_arg(Ret, TB, RetPos).
788colourise_clause_head(Head, TB, Pos) :-
789 functor_position(Pos, FPos, _),
790 classify_head(TB, Head, Class),
791 colour_item(head_term(Class, Head), TB, Pos),
792 colour_item(head(Class, Head), TB, FPos),
793 colourise_term_args(Head, TB, Pos).
794
799
800colourise_extern_head(Head, M, TB, Pos) :-
801 functor_position(Pos, FPos, _),
802 colour_item(head(extern(M), Head), TB, FPos),
803 colourise_term_args(Head, TB, Pos).
804
805colour_method_head(SGHead, TB, Pos) :-
806 arg(1, SGHead, Head),
807 functor_name(SGHead, SG),
808 functor_position(Pos, FPos, _),
809 colour_item(method(SG), TB, FPos),
810 colourise_term_args(Head, TB, Pos).
811
816
817functor_position(term_position(_,_,FF,FT,ArgPos), FF-FT, ArgPos) :- !.
818functor_position(list_position(F,_T,Elms,none), F-FT, Elms) :-
819 !,
820 FT is F + 1.
821functor_position(dict_position(_,_,FF,FT,KVPos), FF-FT, KVPos) :- !.
822functor_position(brace_term_position(F,T,Arg), F-T, [Arg]) :- !.
823functor_position(Pos, Pos, []).
824
825colourise_module(Term, TB, Pos) :-
826 ( var(Term)
827 ; atom(Term)
828 ),
829 !,
830 colour_item(module(Term), TB, Pos).
831colourise_module(_, TB, Pos) :-
832 colour_item(type_error(module), TB, Pos).
833
837
838colourise_directive(_,_,Pos) :-
839 var(Pos),
840 !.
841colourise_directive(Dir, TB, parentheses_term_position(PO,PC,Pos)) :-
842 !,
843 colour_item(parentheses, TB, PO-PC),
844 colourise_directive(Dir, TB, Pos).
845colourise_directive((A,B), TB, term_position(_,_,_,_,[PA,PB])) :-
846 !,
847 colourise_directive(A, TB, PA),
848 colourise_directive(B, TB, PB).
849colourise_directive(Body, TB, Pos) :-
850 nonvar(Body),
851 directive_colours(Body, ClassSpec-ArgSpecs), 852 !,
853 functor_position(Pos, FPos, ArgPos),
854 ( ClassSpec == classify
855 -> goal_classification(TB, Body, [], Class)
856 ; Class = ClassSpec
857 ),
858 colour_item(goal(Class, Body), TB, FPos),
859 specified_items(ArgSpecs, Body, TB, ArgPos).
860colourise_directive(Body, TB, Pos) :-
861 colourise_body(Body, TB, Pos).
862
863
867
868colourise_body(Body, TB, Pos) :-
869 colourise_body(Body, [], TB, Pos).
870
871colourise_body(Body, Origin, TB, Pos) :-
872 colour_item(body, TB, Pos),
873 colourise_goals(Body, Origin, TB, Pos).
874
881
882colourise_method_body(_, _, Pos) :-
883 var(Pos),
884 !.
885colourise_method_body(Body, TB, parentheses_term_position(PO,PC,Pos)) :-
886 !,
887 colour_item(parentheses, TB, PO-PC),
888 colourise_method_body(Body, TB, Pos).
889colourise_method_body(::(_Comment,Body), TB,
890 term_position(_F,_T,_FF,_FT,[CP,BP])) :-
891 !,
892 colour_item(comment(string), TB, CP),
893 colourise_body(Body, TB, BP).
894colourise_method_body(Body, TB, Pos) :- 895 Body =.. [F,A,B],
896 control_op(F),
897 !,
898 Pos = term_position(_F,_T,FF,FT,
899 [ AP,
900 BP
901 ]),
902 colour_item(control, TB, FF-FT),
903 colourise_method_body(A, TB, AP),
904 colourise_body(B, TB, BP).
905colourise_method_body(Body, TB, Pos) :-
906 colourise_body(Body, TB, Pos).
907
908control_op(',').
909control_op((;)).
910control_op((->)).
911control_op((*->)).
912
916
917colourise_goals(_, _, _, Pos) :-
918 var(Pos),
919 !.
920colourise_goals(Body, Origin, TB, parentheses_term_position(PO,PC,Pos)) :-
921 !,
922 colour_item(parentheses, TB, PO-PC),
923 colourise_goals(Body, Origin, TB, Pos).
924colourise_goals(Body, Origin, TB, term_position(_,_,FF,FT,ArgPos)) :-
925 body_compiled(Body),
926 !,
927 colour_item(control, TB, FF-FT),
928 colourise_subgoals(ArgPos, 1, Body, Origin, TB).
929colourise_goals(Goal, Origin, TB, Pos) :-
930 colourise_goal(Goal, Origin, TB, Pos).
931
932colourise_subgoals([], _, _, _, _).
933colourise_subgoals([Pos|T], N, Body, Origin, TB) :-
934 arg(N, Body, Arg),
935 colourise_goals(Arg, Origin, TB, Pos),
936 NN is N + 1,
937 colourise_subgoals(T, NN, Body, Origin, TB).
938
942
943colourise_dcg(Body, Head, TB, Pos) :-
944 colour_item(dcg, TB, Pos),
945 ( dcg_extend(Head, Origin)
946 -> true
947 ; Origin = Head
948 ),
949 colourise_dcg_goals(Body, Origin, TB, Pos).
950
951colourise_dcg_goals(Var, _, TB, Pos) :-
952 var(Var),
953 !,
954 colour_item(goal(meta,Var), TB, Pos).
955colourise_dcg_goals(_, _, _, Pos) :-
956 var(Pos),
957 !.
958colourise_dcg_goals(Body, Origin, TB, parentheses_term_position(PO,PC,Pos)) :-
959 !,
960 colour_item(parentheses, TB, PO-PC),
961 colourise_dcg_goals(Body, Origin, TB, Pos).
962colourise_dcg_goals({Body}, Origin, TB, brace_term_position(F,T,Arg)) :-
963 !,
964 colour_item(dcg(plain), TB, F-T),
965 colourise_goals(Body, Origin, TB, Arg).
966colourise_dcg_goals([], _, TB, Pos) :-
967 !,
968 colour_item(dcg(terminal), TB, Pos).
969colourise_dcg_goals(List, _, TB, list_position(F,T,Elms,Tail)) :-
970 List = [_|_],
971 !,
972 colour_item(dcg(terminal), TB, F-T),
973 colourise_list_args(Elms, Tail, List, TB, classify).
974colourise_dcg_goals(_, _, TB, string_position(F,T)) :-
975 integer(F),
976 !,
977 colour_item(dcg(string), TB, F-T).
978colourise_dcg_goals(Body, Origin, TB, term_position(_,_,FF,FT,ArgPos)) :-
979 dcg_body_compiled(Body), 980 !,
981 colour_item(control, TB, FF-FT),
982 colourise_dcg_subgoals(ArgPos, 1, Body, Origin, TB).
983colourise_dcg_goals(Goal, Origin, TB, Pos) :-
984 colourise_dcg_goal(Goal, Origin, TB, Pos).
985
986colourise_dcg_subgoals([], _, _, _, _).
987colourise_dcg_subgoals([Pos|T], N, Body, Origin, TB) :-
988 arg(N, Body, Arg),
989 colourise_dcg_goals(Arg, Origin, TB, Pos),
990 NN is N + 1,
991 colourise_dcg_subgoals(T, NN, Body, Origin, TB).
992
993dcg_extend(Term, _) :-
994 var(Term), !, fail.
995dcg_extend(M:Term, M:Goal) :-
996 dcg_extend(Term, Goal).
997dcg_extend(Term, Goal) :-
998 compound(Term),
999 !,
1000 compound_name_arguments(Term, Name, Args),
1001 append(Args, [_,_], NArgs),
1002 compound_name_arguments(Goal, Name, NArgs).
1003dcg_extend(Term, Goal) :-
1004 atom(Term),
1005 !,
1006 compound_name_arguments(Goal, Term, [_,_]).
1007
1008dcg_body_compiled(G) :-
1009 body_compiled(G),
1010 !.
1011dcg_body_compiled((_|_)).
1012
1014
1015colourise_dcg_goal(!, Origin, TB, TermPos) :-
1016 !,
1017 colourise_goal(!, Origin, TB, TermPos).
1018colourise_dcg_goal(Goal, Origin, TB, TermPos) :-
1019 dcg_extend(Goal, TheGoal),
1020 !,
1021 colourise_goal(TheGoal, Origin, TB, TermPos).
1022colourise_dcg_goal(Goal, _, TB, Pos) :-
1023 colourise_term_args(Goal, TB, Pos).
1024
1025
1033
1034 1035colourise_goal(_,_,_,Pos) :-
1036 var(Pos),
1037 !.
1038colourise_goal(Goal, Origin, TB, parentheses_term_position(PO,PC,Pos)) :-
1039 !,
1040 colour_item(parentheses, TB, PO-PC),
1041 colourise_goal(Goal, Origin, TB, Pos).
1042colourise_goal(Goal, _, TB, Pos) :-
1043 Pos = list_position(F,T,Elms,TailPos),
1044 Goal = [_|_],
1045 !,
1046 FT is F + 1,
1047 AT is T - 1,
1048 colour_item(goal_term(built_in, Goal), TB, Pos),
1049 colour_item(goal(built_in, Goal), TB, F-FT),
1050 colour_item(goal(built_in, Goal), TB, AT-T),
1051 colourise_file_list(Goal, TB, Elms, TailPos, any).
1052colourise_goal(Goal, Origin, TB, Pos) :-
1053 Pos = list_position(F,T,Elms,Tail),
1054 callable(Goal),
1055 Goal =.. [_,GH,GT|_],
1056 !,
1057 goal_classification(TB, Goal, Origin, Class),
1058 FT is F + 1,
1059 AT is T - 1,
1060 colour_item(goal_term(Class, Goal), TB, Pos),
1061 colour_item(goal(Class, Goal), TB, F-FT),
1062 colour_item(goal(Class, Goal), TB, AT-T),
1063 colourise_list_args(Elms, Tail, [GH|GT], TB, classify).
1064colourise_goal(Goal, _Origin, TB, Pos) :-
1065 Pos = quasi_quotation_position(_F,_T,_QQType,_QQTypePos,_CPos),
1066 !,
1067 colourise_term_arg(Goal, TB, Pos).
1068colourise_goal(Goal, Origin, TB, Pos) :-
1069 strip_module(Goal, _, PGoal),
1070 nonvar(PGoal),
1071 ( goal_classification(TB, Goal, Origin, ClassInferred),
1072 call_goal_colours(Goal, ClassInferred, ClassSpec-ArgSpecs)
1073 -> true
1074 ; call_goal_colours(Goal, ClassSpec-ArgSpecs)
1075 ),
1076 !, 1077 functor_position(Pos, FPos, ArgPos),
1078 ( ClassSpec == classify
1079 -> goal_classification(TB, Goal, Origin, Class)
1080 ; Class = ClassSpec
1081 ),
1082 colour_item(goal_term(Class, Goal), TB, Pos),
1083 colour_item(goal(Class, Goal), TB, FPos),
1084 colour_dict_braces(TB, Pos),
1085 specified_items(ArgSpecs, Goal, TB, ArgPos).
1086colourise_goal(Module:Goal, _Origin, TB, QGoalPos) :-
1087 QGoalPos = term_position(_,_,QF,QT,[PM,PG]),
1088 !,
1089 colourise_module(Module, TB, PM),
1090 colour_item(functor, TB, QF-QT),
1091 ( PG = term_position(_,_,FF,FT,_)
1092 -> FP = FF-FT
1093 ; FP = PG
1094 ),
1095 ( callable(Goal)
1096 -> qualified_goal_classification(Module:Goal, TB, Class),
1097 colour_item(goal_term(Class, Goal), TB, QGoalPos),
1098 colour_item(goal(Class, Goal), TB, FP),
1099 colourise_goal_args(Goal, Module, TB, PG)
1100 ; var(Goal)
1101 -> colourise_term_arg(Goal, TB, PG)
1102 ; colour_item(type_error(callable), TB, PG)
1103 ).
1104colourise_goal(Op, _Origin, TB, Pos) :-
1105 nonvar(Op),
1106 Op = op(_,_,_),
1107 !,
1108 colourise_op_declaration(Op, TB, Pos).
1109colourise_goal(Goal, Origin, TB, Pos) :-
1110 goal_classification(TB, Goal, Origin, Class),
1111 ( Pos = term_position(_,_,FF,FT,_ArgPos)
1112 -> FPos = FF-FT
1113 ; FPos = Pos
1114 ),
1115 colour_item(goal_term(Class, Goal), TB, Pos),
1116 colour_item(goal(Class, Goal), TB, FPos),
1117 colourise_goal_args(Goal, TB, Pos).
1118
1121
1122colour_dict_braces(TB, dict_position(_F,T,_TF,TT,_KVPos)) :-
1123 !,
1124 BStart is TT+1,
1125 colour_item(dict_content, TB, BStart-T).
1126colour_dict_braces(TB, brace_term_position(F,T,_Arg)) :-
1127 !,
1128 colour_item(brace_term, TB, F-T).
1129colour_dict_braces(_, _).
1130
1135
1136colourise_goal_args(Goal, TB, Pos) :-
1137 colourization_module(TB, Module),
1138 colourise_goal_args(Goal, Module, TB, Pos).
1139
1140colourization_module(TB, Module) :-
1141 ( colour_state_source_id(TB, SourceId),
1142 xref_module(SourceId, Module)
1143 -> true
1144 ; Module = user
1145 ).
1146
1147colourise_goal_args(Goal, M, TB, term_position(_,_,_,_,ArgPos)) :-
1148 !,
1149 ( meta_args(Goal, TB, MetaArgs)
1150 -> colourise_meta_args(1, Goal, M, MetaArgs, TB, ArgPos)
1151 ; colourise_goal_args(1, Goal, M, TB, ArgPos)
1152 ).
1153colourise_goal_args(Goal, M, TB, brace_term_position(_,_,ArgPos)) :-
1154 !,
1155 ( meta_args(Goal, TB, MetaArgs)
1156 -> colourise_meta_args(1, Goal, M, MetaArgs, TB, [ArgPos])
1157 ; colourise_goal_args(1, Goal, M, TB, [ArgPos])
1158 ).
1159colourise_goal_args(_, _, _, _). 1160
1161colourise_goal_args(_, _, _, _, []) :- !.
1162colourise_goal_args(N, Goal, Module, TB, [P0|PT]) :-
1163 colourise_option_arg(Goal, Module, N, TB, P0),
1164 !,
1165 NN is N + 1,
1166 colourise_goal_args(NN, Goal, Module, TB, PT).
1167colourise_goal_args(N, Goal, Module, TB, [P0|PT]) :-
1168 arg(N, Goal, Arg),
1169 colourise_term_arg(Arg, TB, P0),
1170 NN is N + 1,
1171 colourise_goal_args(NN, Goal, Module, TB, PT).
1172
1173
1174colourise_meta_args(_, _, _, _, _, []) :- !.
1175colourise_meta_args(N, Goal, Module, MetaArgs, TB, [P0|PT]) :-
1176 colourise_option_arg(Goal, Module, N, TB, P0),
1177 !,
1178 NN is N + 1,
1179 colourise_meta_args(NN, Goal, Module, MetaArgs, TB, PT).
1180colourise_meta_args(N, Goal, Module, MetaArgs, TB, [P0|PT]) :-
1181 arg(N, Goal, Arg),
1182 arg(N, MetaArgs, MetaSpec),
1183 colourise_meta_arg(MetaSpec, Arg, TB, P0),
1184 NN is N + 1,
1185 colourise_meta_args(NN, Goal, Module, MetaArgs, TB, PT).
1186
1187colourise_meta_arg(MetaSpec, Arg, TB, Pos) :-
1188 nonvar(Arg),
1189 expand_meta(MetaSpec, Arg, Expanded),
1190 !,
1191 colourise_goal(Expanded, [], TB, Pos). 1192colourise_meta_arg(MetaSpec, Arg, TB, Pos) :-
1193 nonvar(Arg),
1194 MetaSpec == //,
1195 !,
1196 colourise_dcg_goals(Arg, //, TB, Pos).
1197colourise_meta_arg(_, Arg, TB, Pos) :-
1198 colourise_term_arg(Arg, TB, Pos).
1199
1210
1211meta_args(Goal, TB, VarGoal) :-
1212 colour_state_source_id(TB, SourceId),
1213 xref_meta(SourceId, Goal, _),
1214 !,
1215 compound_name_arity(Goal, Name, Arity),
1216 compound_name_arity(VarGoal, Name, Arity),
1217 xref_meta(SourceId, VarGoal, MetaArgs),
1218 instantiate_meta(MetaArgs).
1219
1220instantiate_meta([]).
1221instantiate_meta([H|T]) :-
1222 ( var(H)
1223 -> H = 0
1224 ; H = V+N
1225 -> V = N
1226 ; H = //(V)
1227 -> V = (//)
1228 ),
1229 instantiate_meta(T).
1230
1235
1236expand_meta(MetaSpec, Goal, Goal) :-
1237 MetaSpec == 0.
1238expand_meta(MetaSpec, M:Goal, M:Expanded) :-
1239 atom(M),
1240 !,
1241 expand_meta(MetaSpec, Goal, Expanded).
1242expand_meta(MetaSpec, Goal, Expanded) :-
1243 integer(MetaSpec),
1244 MetaSpec > 0,
1245 ( atom(Goal)
1246 -> functor(Expanded, Goal, MetaSpec)
1247 ; compound(Goal)
1248 -> compound_name_arguments(Goal, Name, Args0),
1249 length(Extra, MetaSpec),
1250 append(Args0, Extra, Args),
1251 compound_name_arguments(Expanded, Name, Args)
1252 ).
1253
1257
1258colourise_setof(Var^G, TB, term_position(_,_,FF,FT,[VP,GP])) :-
1259 !,
1260 colourise_term_arg(Var, TB, VP),
1261 colour_item(ext_quant, TB, FF-FT),
1262 colourise_setof(G, TB, GP).
1263colourise_setof(Term, TB, Pos) :-
1264 colourise_goal(Term, [], TB, Pos).
1265
1270
1271colourise_db((Head:-_Body), TB, term_position(_,_,_,_,[HP,_])) :-
1272 !,
1273 colourise_db(Head, TB, HP).
1274colourise_db(Module:Head, TB, term_position(_,_,QF,QT,[MP,HP])) :-
1275 !,
1276 colourise_module(Module, TB, MP),
1277 colour_item(functor, TB, QF-QT),
1278 ( atom(Module),
1279 colour_state_source_id(TB, SourceId),
1280 xref_module(SourceId, Module)
1281 -> colourise_db(Head, TB, HP)
1282 ; colourise_db(Head, TB, HP)
1283 ).
1284colourise_db(Head, TB, Pos) :-
1285 colourise_goal(Head, '<db-change>', TB, Pos).
1286
1287
1293
1294colourise_option_arg(Goal, Module, Arg, TB, ArgPos) :-
1295 goal_name_arity(Goal, Name, Arity),
1296 current_option_arg(Module:Name/Arity, Arg),
1297 current_predicate_options(Module:Name/Arity, Arg, OptionDecl),
1298 debug(emacs, 'Colouring option-arg ~w of ~p',
1299 [Arg, Module:Name/Arity]),
1300 arg(Arg, Goal, Options),
1301 colourise_option(Options, Module, Goal, Arg, OptionDecl, TB, ArgPos).
1302
1303colourise_option(Options0, Module, Goal, Arg, OptionDecl, TB, Pos0) :-
1304 strip_option_module_qualifier(Goal, Module, Arg, TB,
1305 Options0, Pos0, Options, Pos),
1306 ( Pos = list_position(F, T, ElmPos, TailPos)
1307 -> colour_item(list, TB, F-T),
1308 colourise_option_list(Options, OptionDecl, TB, ElmPos, TailPos)
1309 ; ( var(Options)
1310 ; Options == []
1311 )
1312 -> colourise_term_arg(Options, TB, Pos)
1313 ; colour_item(type_error(list), TB, Pos)
1314 ).
1315
1316strip_option_module_qualifier(Goal, Module, Arg, TB,
1317 M:Options, term_position(_,_,_,_,[MP,Pos]),
1318 Options, Pos) :-
1319 predicate_property(Module:Goal, meta_predicate(Head)),
1320 arg(Arg, Head, :),
1321 !,
1322 colourise_module(M, TB, MP).
1323strip_option_module_qualifier(_, _, _, _,
1324 Options, Pos, Options, Pos).
1325
1326
1327colourise_option_list(_, _, _, [], none) :- !.
1328colourise_option_list(Tail, _, TB, [], TailPos) :-
1329 !,
1330 colourise_term_arg(Tail, TB, TailPos).
1331colourise_option_list([H|T], OptionDecl, TB, [HPos|TPos], TailPos) :-
1332 colourise_option(H, OptionDecl, TB, HPos),
1333 colourise_option_list(T, OptionDecl, TB, TPos, TailPos).
1334
1335colourise_option(Opt, _, TB, Pos) :-
1336 var(Opt),
1337 !,
1338 colourise_term_arg(Opt, TB, Pos).
1339colourise_option(Opt, OptionDecl, TB, term_position(_,_,FF,FT,ValPosList)) :-
1340 !,
1341 generalise_term(Opt, GenOpt),
1342 ( memberchk(GenOpt, OptionDecl)
1343 -> colour_item(option_name, TB, FF-FT),
1344 Opt =.. [Name|Values],
1345 GenOpt =.. [Name|Types],
1346 colour_option_values(Values, Types, TB, ValPosList)
1347 ; colour_item(no_option_name, TB, FF-FT),
1348 colourise_term_args(ValPosList, 1, Opt, TB)
1349 ).
1350colourise_option(_, _, TB, Pos) :-
1351 colour_item(type_error(option), TB, Pos).
1352
1353colour_option_values([], [], _, _).
1354colour_option_values([V0|TV], [T0|TT], TB, [P0|TP]) :-
1355 ( ( var(V0)
1356 ; is_of_type(T0, V0)
1357 ; T0 = list(_),
1358 member(E, V0),
1359 var(E)
1360 ; functor(V0, '.', 2),
1361 V0 \= [_|_]
1362 )
1363 -> colourise_term_arg(V0, TB, P0)
1364 ; callable(V0),
1365 ( T0 = callable
1366 -> N = 0
1367 ; T0 = (callable+N)
1368 )
1369 -> colourise_meta_arg(N, V0, TB, P0)
1370 ; colour_item(type_error(T0), TB, P0)
1371 ),
1372 colour_option_values(TV, TT, TB, TP).
1373
1374
1380
1381colourise_files(List, TB, list_position(F,T,Elms,TailPos), Why) :-
1382 !,
1383 colour_item(list, TB, F-T),
1384 colourise_file_list(List, TB, Elms, TailPos, Why).
1385colourise_files(M:Spec, TB, term_position(_,_,_,_,[MP,SP]), Why) :-
1386 !,
1387 colourise_module(M, TB, MP),
1388 colourise_files(Spec, TB, SP, Why).
1389colourise_files(Var, TB, P, _) :-
1390 var(Var),
1391 !,
1392 colour_item(var, TB, P).
1393colourise_files(Spec0, TB, Pos, Why) :-
1394 strip_module(Spec0, _, Spec),
1395 ( colour_state_source_id(TB, Source),
1396 prolog_canonical_source(Source, SourceId),
1397 catch(xref_source_file(Spec, Path, SourceId, [silent(true)]),
1398 _, fail)
1399 -> ( Why = imported,
1400 \+ resolves_anything(TB, Path),
1401 exports_something(TB, Path)
1402 -> colour_item(file_no_depend(Path), TB, Pos)
1403 ; colour_item(file(Path), TB, Pos)
1404 )
1405 ; colour_item(nofile, TB, Pos)
1406 ).
1407
1409
1410colourise_file_list([], _, [], none, _).
1411colourise_file_list(Last, TB, [], TailPos, _Why) :-
1412 ( var(Last)
1413 -> colourise_term(Last, TB, TailPos)
1414 ; colour_item(type_error(list), TB, TailPos)
1415 ).
1416colourise_file_list([H|T], TB, [PH|PT], TailPos, Why) :-
1417 colourise_files(H, TB, PH, Why),
1418 colourise_file_list(T, TB, PT, TailPos, Why).
1419
1420resolves_anything(TB, Path) :-
1421 colour_state_source_id(TB, SourceId),
1422 xref_defined(SourceId, Head, imported(Path)),
1423 xref_called(SourceId, Head, _),
1424 !.
1425
1426exports_something(TB, Path) :-
1427 colour_state_source_id(TB, SourceId),
1428 xref_defined(SourceId, _, imported(Path)),
1429 !.
1430
1434
1435colourise_directory(Spec, TB, Pos) :-
1436 ( colour_state_source_id(TB, SourceId),
1437 catch(xref_source_file(Spec, Path, SourceId,
1438 [ file_type(directory),
1439 silent(true)
1440 ]),
1441 _, fail)
1442 -> colour_item(directory(Path), TB, Pos)
1443 ; colour_item(nofile, TB, Pos)
1444 ).
1445
1449
1450colourise_langoptions([], _, _) :- !.
1451colourise_langoptions([H|T], TB, list_position(PF,PT,[HP|TP],_)) :-
1452 !,
1453 colour_item(list, TB, PF-PT),
1454 colourise_langoptions(H, TB, HP),
1455 colourise_langoptions(T, TB, TP).
1456colourise_langoptions(Spec, TB, Pos) :-
1457 colourise_files(library(dialect/Spec), TB, Pos, imported).
1458
1462
1463colourise_class(ClassName, TB, Pos) :-
1464 colour_state_source_id(TB, SourceId),
1465 classify_class(SourceId, ClassName, Classification),
1466 colour_item(class(Classification, ClassName), TB, Pos).
1467
1473
1474classify_class(SourceId, Name, Class) :-
1475 xref_defined_class(SourceId, Name, Class),
1476 !.
1477classify_class(_SourceId, Name, Class) :-
1478 current_predicate(pce:send_class/3),
1479 ( current_predicate(classify_class/2)
1480 -> true
1481 ; use_module(library(pce_meta), [classify_class/2])
1482 ),
1483 member(G, [classify_class(Name, Class)]),
1484 call(G).
1485
1489
1490colourise_term_args(Term, TB,
1491 term_position(_,_,_,_,ArgPos)) :-
1492 !,
1493 colourise_term_args(ArgPos, 1, Term, TB).
1494colourise_term_args(_, _, _).
1495
1496colourise_term_args([], _, _, _).
1497colourise_term_args([Pos|T], N, Term, TB) :-
1498 arg(N, Term, Arg),
1499 colourise_term_arg(Arg, TB, Pos),
1500 NN is N + 1,
1501 colourise_term_args(T, NN, Term, TB).
1502
1503colourise_term_arg(_, _, Pos) :-
1504 var(Pos),
1505 !.
1506colourise_term_arg(Arg, TB, parentheses_term_position(PO,PC,Pos)) :-
1507 !,
1508 colour_item(parentheses, TB, PO-PC),
1509 colourise_term_arg(Arg, TB, Pos).
1510colourise_term_arg(Var, TB, Pos) :- 1511 var(Var), Pos = _-_,
1512 !,
1513 ( singleton(Var, TB)
1514 -> colour_item(singleton, TB, Pos)
1515 ; colour_item(var, TB, Pos)
1516 ).
1517colourise_term_arg(List, TB, list_position(F, T, Elms, Tail)) :-
1518 !,
1519 colour_item(list, TB, F-T),
1520 colourise_list_args(Elms, Tail, List, TB, classify). 1521colourise_term_arg(String, TB, string_position(F, T)) :- 1522 !,
1523 ( string(String)
1524 -> colour_item(string, TB, F-T)
1525 ; String = [H|_]
1526 -> ( integer(H)
1527 -> colour_item(codes, TB, F-T)
1528 ; colour_item(chars, TB, F-T)
1529 )
1530 ; String == []
1531 -> colour_item(codes, TB, F-T)
1532 ).
1533colourise_term_arg(_, TB,
1534 quasi_quotation_position(F,T,QQType,QQTypePos,CPos)) :-
1535 !,
1536 colourise_qq_type(QQType, TB, QQTypePos),
1537 functor_name(QQType, Type),
1538 colour_item(qq_content(Type), TB, CPos),
1539 arg(1, CPos, SE),
1540 SS is SE-2,
1541 FE is F+2,
1542 TS is T-2,
1543 colour_item(qq(open), TB, F-FE),
1544 colour_item(qq(sep), TB, SS-SE),
1545 colour_item(qq(close), TB, TS-T).
1546colourise_term_arg({Term}, TB, brace_term_position(F,T,Arg)) :-
1547 !,
1548 colour_item(brace_term, TB, F-T),
1549 colourise_term_arg(Term, TB, Arg).
1550colourise_term_arg(Map, TB, dict_position(F,T,TF,TT,KVPos)) :-
1551 !,
1552 is_dict(Map, Tag),
1553 colour_item(dict, TB, F-T),
1554 TagPos = TF-TT,
1555 ( var(Tag)
1556 -> ( singleton(Tag, TB)
1557 -> colour_item(singleton, TB, TagPos)
1558 ; colour_item(var, TB, TagPos)
1559 )
1560 ; colour_item(dict_tag, TB, TagPos)
1561 ),
1562 BStart is TT+1,
1563 colour_item(dict_content, TB, BStart-T),
1564 colourise_dict_kv(Map, TB, KVPos).
1565colourise_term_arg([](List,Term), TB, 1566 term_position(_,_,0,0,[ListPos,ArgPos])) :-
1567 !,
1568 colourise_term_arg(List, TB, ListPos),
1569 colourise_term_arg(Term, TB, ArgPos).
1570colourise_term_arg(Compound, TB, Pos) :- 1571 compound(Compound),
1572 !,
1573 ( Pos = term_position(_F,_T,FF,FT,_ArgPos)
1574 -> colour_item(functor, TB, FF-FT) 1575 ; true 1576 ),
1577 colourise_term_args(Compound, TB, Pos).
1578colourise_term_arg(EmptyList, TB, Pos) :-
1579 EmptyList == [],
1580 !,
1581 colour_item(empty_list, TB, Pos).
1582colourise_term_arg(Atom, TB, Pos) :-
1583 atom(Atom),
1584 !,
1585 colour_item(atom, TB, Pos).
1586colourise_term_arg(Integer, TB, Pos) :-
1587 integer(Integer),
1588 !,
1589 colour_item(int, TB, Pos).
1590colourise_term_arg(Rational, TB, Pos) :-
1591 rational(Rational),
1592 !,
1593 colour_item(rational(Rational), TB, Pos).
1594colourise_term_arg(Float, TB, Pos) :-
1595 float(Float),
1596 !,
1597 colour_item(float, TB, Pos).
1598colourise_term_arg(_Arg, _TB, _Pos) :-
1599 true.
1600
1601colourise_list_args([HP|TP], Tail, [H|T], TB, How) :-
1602 specified_item(How, H, TB, HP),
1603 colourise_list_args(TP, Tail, T, TB, How).
1604colourise_list_args([], none, _, _, _) :- !.
1605colourise_list_args([], TP, T, TB, How) :-
1606 specified_item(How, T, TB, TP).
1607
1611
1612colourise_qq_type(QQType, TB, QQTypePos) :-
1613 functor_position(QQTypePos, FPos, _),
1614 colour_item(qq_type, TB, FPos),
1615 colourise_term_args(QQType, TB, QQTypePos).
1616
1617qq_position(quasi_quotation_position(_,_,_,_,_)).
1618
1622
1623colourise_dict_kv(_, _, []) :- !.
1624colourise_dict_kv(Dict, TB, [key_value_position(_F,_T,SF,ST,K,KP,VP)|KV]) :-
1625 colour_item(dict_key, TB, KP),
1626 colour_item(dict_sep, TB, SF-ST),
1627 get_dict(K, Dict, V),
1628 colourise_term_arg(V, TB, VP),
1629 colourise_dict_kv(Dict, TB, KV).
1630
1631
1636
1637colourise_exports([], TB, Pos) :- !,
1638 colourise_term_arg([], TB, Pos).
1639colourise_exports(List, TB, list_position(F,T,ElmPos,Tail)) :-
1640 !,
1641 colour_item(list, TB, F-T),
1642 ( Tail == none
1643 -> true
1644 ; colour_item(type_error(list), TB, Tail)
1645 ),
1646 colourise_exports2(List, TB, ElmPos).
1647colourise_exports(_, TB, Pos) :-
1648 colour_item(type_error(list), TB, Pos).
1649
1650colourise_exports2([G0|GT], TB, [P0|PT]) :-
1651 !,
1652 colourise_declaration(G0, export, TB, P0),
1653 colourise_exports2(GT, TB, PT).
1654colourise_exports2(_, _, _).
1655
1656
1660
1661colourise_imports(List, File, TB, Pos) :-
1662 ( colour_state_source_id(TB, SourceId),
1663 ground(File),
1664 catch(xref_public_list(File, SourceId,
1665 [ path(Path),
1666 public(Public),
1667 silent(true)
1668 ] ), _, fail)
1669 -> true
1670 ; Public = [],
1671 Path = (-)
1672 ),
1673 colourise_imports(List, Path, Public, TB, Pos).
1674
1675colourise_imports([], _, _, TB, Pos) :-
1676 !,
1677 colour_item(empty_list, TB, Pos).
1678colourise_imports(List, File, Public, TB, list_position(F,T,ElmPos,Tail)) :-
1679 !,
1680 colour_item(list, TB, F-T),
1681 ( Tail == none
1682 -> true
1683 ; colour_item(type_error(list), TB, Tail)
1684 ),
1685 colourise_imports2(List, File, Public, TB, ElmPos).
1686colourise_imports(except(Except), File, Public, TB,
1687 term_position(_,_,FF,FT,[LP])) :-
1688 !,
1689 colour_item(keyword(except), TB, FF-FT),
1690 colourise_imports(Except, File, Public, TB, LP).
1691colourise_imports(_, _, _, TB, Pos) :-
1692 colour_item(type_error(list), TB, Pos).
1693
1694colourise_imports2([G0|GT], File, Public, TB, [P0|PT]) :-
1695 !,
1696 colourise_import(G0, File, TB, P0),
1697 colourise_imports2(GT, File, Public, TB, PT).
1698colourise_imports2(_, _, _, _, _).
1699
1700
1701colourise_import(PI as Name, File, TB, term_position(_,_,FF,FT,[PP,NP])) :-
1702 pi_to_term(PI, Goal),
1703 !,
1704 colour_item(goal(imported(File), Goal), TB, PP),
1705 rename_goal(Goal, Name, NewGoal),
1706 goal_classification(TB, NewGoal, [], Class),
1707 colour_item(goal(Class, NewGoal), TB, NP),
1708 colour_item(keyword(as), TB, FF-FT).
1709colourise_import(PI, File, TB, Pos) :-
1710 pi_to_term(PI, Goal),
1711 colour_state_source_id(TB, SourceID),
1712 ( \+ xref_defined(SourceID, Goal, imported(File))
1713 -> colour_item(undefined_import, TB, Pos)
1714 ; \+ xref_called(SourceID, Goal, _)
1715 -> colour_item(unused_import, TB, Pos)
1716 ),
1717 !.
1718colourise_import(PI, _, TB, Pos) :-
1719 colourise_declaration(PI, import, TB, Pos).
1720
1725
1726colourise_declaration(PI, _, TB, term_position(F,T,FF,FT,[NamePos,ArityPos])) :-
1727 pi_to_term(PI, Goal),
1728 !,
1729 goal_classification(TB, Goal, [], Class),
1730 colour_item(predicate_indicator(Class, Goal), TB, F-T),
1731 colour_item(goal(Class, Goal), TB, NamePos),
1732 colour_item(predicate_indicator, TB, FF-FT),
1733 colour_item(arity, TB, ArityPos).
1734colourise_declaration(Module:PI, _, TB,
1735 term_position(_,_,QF,QT,[PM,PG])) :-
1736 atom(Module), pi_to_term(PI, Goal),
1737 !,
1738 colourise_module(M, TB, PM),
1739 colour_item(functor, TB, QF-QT),
1740 colour_item(predicate_indicator(extern(M), Goal), TB, PG),
1741 PG = term_position(_,_,FF,FT,[NamePos,ArityPos]),
1742 colour_item(goal(extern(M), Goal), TB, NamePos),
1743 colour_item(predicate_indicator, TB, FF-FT),
1744 colour_item(arity, TB, ArityPos).
1745colourise_declaration(Module:PI, _, TB,
1746 term_position(_,_,QF,QT,[PM,PG])) :-
1747 atom(Module), nonvar(PI), PI = Name/Arity,
1748 !, 1749 colourise_module(Module, TB, PM),
1750 colour_item(functor, TB, QF-QT),
1751 ( (var(Name) ; atom(Name)),
1752 (var(Arity) ; integer(Arity), Arity >= 0)
1753 -> colourise_term_arg(PI, TB, PG)
1754 ; colour_item(type_error(predicate_indicator), TB, PG)
1755 ).
1756colourise_declaration(op(N,T,P), Which, TB, Pos) :-
1757 ( Which == export
1758 ; Which == import
1759 ),
1760 !,
1761 colour_item(exported_operator, TB, Pos),
1762 colourise_op_declaration(op(N,T,P), TB, Pos).
1763colourise_declaration(Module:Goal, table, TB,
1764 term_position(_,_,QF,QT,
1765 [PM,term_position(_F,_T,FF,FT,ArgPos)])) :-
1766 atom(Module), callable(Goal),
1767 !,
1768 colourise_module(Module, TB, PM),
1769 colour_item(functor, TB, QF-QT),
1770 goal_classification(TB, Module:Goal, [], Class),
1771 compound_name_arguments(Goal, _, Args),
1772 colour_item(goal(Class, Goal), TB, FF-FT),
1773 colourise_table_modes(Args, TB, ArgPos).
1774colourise_declaration(Goal, table, TB, term_position(_F,_T,FF,FT,ArgPos)) :-
1775 callable(Goal),
1776 !,
1777 compound_name_arguments(Goal, _, Args),
1778 goal_classification(TB, Goal, [], Class),
1779 colour_item(goal(Class, Goal), TB, FF-FT),
1780 colourise_table_modes(Args, TB, ArgPos).
1781colourise_declaration(Goal, table, TB, Pos) :-
1782 atom(Goal),
1783 !,
1784 goal_classification(TB, Goal, [], Class),
1785 colour_item(goal(Class, Goal), TB, Pos).
1786colourise_declaration(Partial, _Which, TB, Pos) :-
1787 compatible_with_pi(Partial),
1788 !,
1789 colourise_term_arg(Partial, TB, Pos).
1790colourise_declaration(_, Which, TB, Pos) :-
1791 colour_item(type_error(declaration(Which)), TB, Pos).
1792
1793compatible_with_pi(Term) :-
1794 var(Term),
1795 !.
1796compatible_with_pi(Name/Arity) :-
1797 !,
1798 var_or_atom(Name),
1799 var_or_nonneg(Arity).
1800compatible_with_pi(Name//Arity) :-
1801 !,
1802 var_or_atom(Name),
1803 var_or_nonneg(Arity).
1804compatible_with_pi(M:T) :-
1805 var_or_atom(M),
1806 compatible_with_pi(T).
1807
1808var_or_atom(X) :- var(X), !.
1809var_or_atom(X) :- atom(X).
1810var_or_nonneg(X) :- var(X), !.
1811var_or_nonneg(X) :- integer(X), X >= 0, !.
1812
1813pi_to_term(Name/Arity, Term) :-
1814 (atom(Name)->true;Name==[]), integer(Arity), Arity >= 0,
1815 !,
1816 functor(Term, Name, Arity).
1817pi_to_term(Name//Arity0, Term) :-
1818 atom(Name), integer(Arity0), Arity0 >= 0,
1819 !,
1820 Arity is Arity0 + 2,
1821 functor(Term, Name, Arity).
1822
1823colourise_meta_declarations((Head,Tail), Extra, TB,
1824 term_position(_,_,_,_,[PH,PT])) :-
1825 !,
1826 colourise_meta_declaration(Head, Extra, TB, PH),
1827 colourise_meta_declarations(Tail, Extra, TB, PT).
1828colourise_meta_declarations(Last, Extra, TB, Pos) :-
1829 colourise_meta_declaration(Last, Extra, TB, Pos).
1830
1831colourise_meta_declaration(M:Head, Extra, TB,
1832 term_position(_,_,QF,QT,
1833 [ MP,
1834 term_position(_,_,FF,FT,ArgPos)
1835 ])) :-
1836 compound(Head),
1837 !,
1838 colourise_module(M, TB, MP),
1839 colour_item(functor, TB, QF-QT),
1840 colour_item(goal(extern(M),Head), TB, FF-FT),
1841 compound_name_arguments(Head, _, Args),
1842 colourise_meta_decls(Args, Extra, TB, ArgPos).
1843colourise_meta_declaration(Head, Extra, TB, term_position(_,_,FF,FT,ArgPos)) :-
1844 compound(Head),
1845 !,
1846 goal_classification(TB, Head, [], Class),
1847 colour_item(goal(Class, Head), TB, FF-FT),
1848 compound_name_arguments(Head, _, Args),
1849 colourise_meta_decls(Args, Extra, TB, ArgPos).
1850colourise_meta_declaration([H|T], Extra, TB, list_position(LF,LT,[HP],TP)) :-
1851 !,
1852 colour_item(list, TB, LF-LT),
1853 colourise_meta_decls([H,T], Extra, TB, [HP,TP]).
1854colourise_meta_declaration(_, _, TB, Pos) :-
1855 !,
1856 colour_item(type_error(compound), TB, Pos).
1857
1858colourise_meta_decls([], _, _, []).
1859colourise_meta_decls([Arg|ArgT], Extra, TB, [PosH|PosT]) :-
1860 colourise_meta_decl(Arg, Extra, TB, PosH),
1861 colourise_meta_decls(ArgT, Extra, TB, PosT).
1862
1863colourise_meta_decl(Arg, Extra, TB, Pos) :-
1864 nonvar(Arg),
1865 ( valid_meta_decl(Arg)
1866 -> true
1867 ; memberchk(Arg, Extra)
1868 ),
1869 colour_item(meta(Arg), TB, Pos).
1870colourise_meta_decl(_, _, TB, Pos) :-
1871 colour_item(error, TB, Pos).
1872
1873valid_meta_decl(:).
1874valid_meta_decl(*).
1875valid_meta_decl(//).
1876valid_meta_decl(^).
1877valid_meta_decl(?).
1878valid_meta_decl(+).
1879valid_meta_decl(-).
1880valid_meta_decl(I) :- integer(I), between(0,9,I).
1881
1886
1887colourise_declarations(List, Which, TB, list_position(F,T,Elms,none)) :-
1888 !,
1889 colour_item(list, TB, F-T),
1890 colourise_list_declarations(List, Which, TB, Elms).
1891colourise_declarations(Term, Which, TB, parentheses_term_position(PO,PC,Pos)) :-
1892 !,
1893 colour_item(parentheses, TB, PO-PC),
1894 colourise_declarations(Term, Which, TB, Pos).
1895colourise_declarations((Head,Tail), Which, TB,
1896 term_position(_,_,_,_,[PH,PT])) :-
1897 !,
1898 colourise_declarations(Head, Which, TB, PH),
1899 colourise_declarations(Tail, Which, TB, PT).
1900colourise_declarations(as(Spec, Options), Which, TB,
1901 term_position(_,_,FF,FT,[PH,PT])) :-
1902 !,
1903 colour_item(keyword(as), TB, FF-FT),
1904 colourise_declarations(Spec, Which, TB, PH),
1905 colourise_decl_options(Options, Which, TB, PT).
1906colourise_declarations(PI, Which, TB, Pos) :-
1907 colourise_declaration(PI, Which, TB, Pos).
1908
1909colourise_list_declarations([], _, _, []).
1910colourise_list_declarations([H|T], Which, TB, [HP|TP]) :-
1911 colourise_declaration(H, Which, TB, HP),
1912 colourise_list_declarations(T, Which, TB, TP).
1913
1914
1915colourise_table_modes([], _, _).
1916colourise_table_modes([H|T], TB, [PH|PT]) :-
1917 colourise_table_mode(H, TB, PH),
1918 colourise_table_modes(T, TB, PT).
1919
1920colourise_table_mode(H, TB, Pos) :-
1921 table_mode(H, Mode),
1922 !,
1923 colour_item(table_mode(Mode), TB, Pos).
1924colourise_table_mode(lattice(Spec), TB, term_position(_F,_T,FF,FT,[ArgPos])) :-
1925 !,
1926 colour_item(table_mode(lattice), TB, FF-FT),
1927 table_moded_call(Spec, 3, TB, ArgPos).
1928colourise_table_mode(po(Spec), TB, term_position(_F,_T,FF,FT,[ArgPos])) :-
1929 !,
1930 colour_item(table_mode(po), TB, FF-FT),
1931 table_moded_call(Spec, 2, TB, ArgPos).
1932colourise_table_mode(_, TB, Pos) :-
1933 colour_item(type_error(table_mode), TB, Pos).
1934
1935table_mode(Var, index) :-
1936 var(Var),
1937 !.
1938table_mode(+, index).
1939table_mode(index, index).
1940table_mode(-, first).
1941table_mode(first, first).
1942table_mode(last, last).
1943table_mode(min, min).
1944table_mode(max, max).
1945table_mode(sum, sum).
1946
1947table_moded_call(Atom, Arity, TB, Pos) :-
1948 atom(Atom),
1949 functor(Head, Atom, Arity),
1950 goal_classification(TB, Head, [], Class),
1951 colour_item(goal(Class, Head), TB, Pos).
1952table_moded_call(Atom/Arity, Arity, TB,
1953 term_position(_,_,FF,FT,[NP,AP])) :-
1954 atom(Atom),
1955 !,
1956 functor(Head, Atom, Arity),
1957 goal_classification(TB, Head, [], Class),
1958 colour_item(goal(Class, Head), TB, NP),
1959 colour_item(predicate_indicator, TB, FF-FT),
1960 colour_item(arity, TB, AP).
1961table_moded_call(Head, Arity, TB, Pos) :-
1962 Pos = term_position(_,_,FF,FT,_),
1963 compound(Head),
1964 !,
1965 compound_name_arity(Head, _Name, Arity),
1966 goal_classification(TB, Head, [], Class),
1967 colour_item(goal(Class, Head), TB, FF-FT),
1968 colourise_term_args(Head, TB, Pos).
1969table_moded_call(_, _, TB, Pos) :-
1970 colour_item(type_error(predicate_name_or_indicator), TB, Pos).
1971
1972colourise_decl_options(Options, Which, TB,
1973 parentheses_term_position(_,_,Pos)) :-
1974 !,
1975 colourise_decl_options(Options, Which, TB, Pos).
1976colourise_decl_options((Head,Tail), Which, TB,
1977 term_position(_,_,_,_,[PH,PT])) :-
1978 !,
1979 colourise_decl_options(Head, Which, TB, PH),
1980 colourise_decl_options(Tail, Which, TB, PT).
1981colourise_decl_options(Option, Which, TB, Pos) :-
1982 ground(Option),
1983 valid_decl_option(Option, Which),
1984 !,
1985 functor(Option, Name, _),
1986 ( Pos = term_position(_,_,FF,FT,[ArgPos])
1987 -> colour_item(decl_option(Name), TB, FF-FT),
1988 ( arg(1, Option, Value),
1989 nonneg_or_false(Value)
1990 -> colourise_term_arg(Value, TB, ArgPos)
1991 ; colour_item(type_error(decl_option_value(Which)), TB, ArgPos)
1992 )
1993 ; colour_item(decl_option(Name), TB, Pos)
1994 ).
1995colourise_decl_options(_, Which, TB, Pos) :-
1996 colour_item(type_error(decl_option(Which)), TB, Pos).
1997
1998valid_decl_option(subsumptive, table).
1999valid_decl_option(variant, table).
2000valid_decl_option(incremental, table).
2001valid_decl_option(monotonic, table).
2002valid_decl_option(opaque, table).
2003valid_decl_option(lazy, table).
2004valid_decl_option(monotonic, dynamic).
2005valid_decl_option(incremental, dynamic).
2006valid_decl_option(abstract(_), dynamic).
2007valid_decl_option(opaque, dynamic).
2008valid_decl_option(shared, table).
2009valid_decl_option(private, table).
2010valid_decl_option(subgoal_abstract(_), table).
2011valid_decl_option(answer_abstract(_), table).
2012valid_decl_option(max_answers(_), table).
2013valid_decl_option(shared, dynamic).
2014valid_decl_option(private, dynamic).
2015valid_decl_option(local, dynamic).
2016valid_decl_option(multifile, _).
2017valid_decl_option(discontiguous, _).
2018valid_decl_option(volatile, _).
2019
2020nonneg_or_false(Value) :-
2021 var(Value),
2022 !.
2023nonneg_or_false(Value) :-
2024 integer(Value), Value >= 0,
2025 !.
2026nonneg_or_false(off).
2027nonneg_or_false(false).
2028
2030
2031colourise_op_declaration(op(P,T,N), TB, term_position(_,_,FF,FT,[PP,TP,NP])) :-
2032 colour_item(goal(built_in, op(N,T,P)), TB, FF-FT),
2033 colour_op_priority(P, TB, PP),
2034 colour_op_type(T, TB, TP),
2035 colour_op_name(N, TB, NP).
2036
2037colour_op_name(_, _, Pos) :-
2038 var(Pos),
2039 !.
2040colour_op_name(Name, TB, parentheses_term_position(PO,PC,Pos)) :-
2041 !,
2042 colour_item(parentheses, TB, PO-PC),
2043 colour_op_name(Name, TB, Pos).
2044colour_op_name(Name, TB, Pos) :-
2045 var(Name),
2046 !,
2047 colour_item(var, TB, Pos).
2048colour_op_name(Name, TB, Pos) :-
2049 (atom(Name) ; Name == []),
2050 !,
2051 colour_item(identifier, TB, Pos).
2052colour_op_name(Module:Name, TB, term_position(_F,_T,QF,QT,[MP,NP])) :-
2053 !,
2054 colourise_module(Module, TB, MP),
2055 colour_item(functor, TB, QF-QT),
2056 colour_op_name(Name, TB, NP).
2057colour_op_name(List, TB, list_position(F,T,Elems,none)) :-
2058 !,
2059 colour_item(list, TB, F-T),
2060 colour_op_names(List, TB, Elems).
2061colour_op_name(_, TB, Pos) :-
2062 colour_item(error, TB, Pos).
2063
2064colour_op_names([], _, []).
2065colour_op_names([H|T], TB, [HP|TP]) :-
2066 colour_op_name(H, TB, HP),
2067 colour_op_names(T, TB, TP).
2068
2069colour_op_type(Type, TB, Pos) :-
2070 var(Type),
2071 !,
2072 colour_item(var, TB, Pos).
2073colour_op_type(Type, TB, Pos) :-
2074 op_type(Type),
2075 !,
2076 colour_item(op_type(Type), TB, Pos).
2077colour_op_type(_, TB, Pos) :-
2078 colour_item(error, TB, Pos).
2079
2080colour_op_priority(Priority, TB, Pos) :-
2081 var(Priority), colour_item(var, TB, Pos).
2082colour_op_priority(Priority, TB, Pos) :-
2083 integer(Priority),
2084 between(0, 1200, Priority),
2085 !,
2086 colour_item(int, TB, Pos).
2087colour_op_priority(_, TB, Pos) :-
2088 colour_item(error, TB, Pos).
2089
2090op_type(fx).
2091op_type(fy).
2092op_type(xf).
2093op_type(yf).
2094op_type(xfy).
2095op_type(xfx).
2096op_type(yfx).
2097
2098
2102
2103colourise_prolog_flag_name(_, _, Pos) :-
2104 var(Pos),
2105 !.
2106colourise_prolog_flag_name(Name, TB, parentheses_term_position(PO,PC,Pos)) :-
2107 !,
2108 colour_item(parentheses, TB, PO-PC),
2109 colourise_prolog_flag_name(Name, TB, Pos).
2110colourise_prolog_flag_name(Name, TB, Pos) :-
2111 atom(Name),
2112 !,
2113 ( current_prolog_flag(Name, _)
2114 -> colour_item(flag_name(Name), TB, Pos)
2115 ; colour_item(no_flag_name(Name), TB, Pos)
2116 ).
2117colourise_prolog_flag_name(Name, TB, Pos) :-
2118 colourise_term(Name, TB, Pos).
2119
2120
2121 2124
2128
2129body_compiled((_,_)).
2130body_compiled((_->_)).
2131body_compiled((_*->_)).
2132body_compiled((_;_)).
2133body_compiled(\+_).
2134
2139
2140goal_classification(_, QGoal, _, Class) :-
2141 strip_module(QGoal, _, Goal),
2142 ( var(Goal)
2143 -> !, Class = meta
2144 ; \+ callable(Goal)
2145 -> !, Class = not_callable
2146 ).
2147goal_classification(_, Goal, Origin, recursion) :-
2148 callable(Origin),
2149 generalise_term(Goal, Origin),
2150 !.
2151goal_classification(TB, Goal, _, How) :-
2152 colour_state_source_id(TB, SourceId),
2153 xref_defined(SourceId, Goal, How),
2154 How \= public(_),
2155 !.
2156goal_classification(TB, Goal, _, Class) :-
2157 ( colour_state_source_id(TB, SourceId),
2158 xref_module(SourceId, Module)
2159 -> true
2160 ; Module = user
2161 ),
2162 call_goal_classification(Goal, Module, Class),
2163 !.
2164goal_classification(TB, Goal, _, How) :-
2165 colour_state_module(TB, Module),
2166 atom(Module),
2167 Module \== prolog_colour_ops,
2168 predicate_property(Module:Goal, imported_from(From)),
2169 !,
2170 How = imported(From).
2171goal_classification(_TB, _Goal, _, undefined).
2172
2176
2177call_goal_classification(Goal, Module, Class) :-
2178 catch(global_goal_classification(Goal, Module, Class), _,
2179 Class = type_error(callable)).
2180
2181global_goal_classification(Goal, _, built_in) :-
2182 built_in_predicate(Goal),
2183 !.
2184global_goal_classification(Goal, _, autoload(From)) :- 2185 predicate_property(Goal, autoload(From)).
2186global_goal_classification(Goal, Module, Class) :- 2187 strip_module(Goal, _, PGoal),
2188 current_predicate(_, user:PGoal),
2189 !,
2190 ( Module == user
2191 -> Class = global(GClass, Location),
2192 global_location(user:Goal, Location),
2193 global_class(user:Goal, GClass)
2194 ; Class = global
2195 ).
2196global_goal_classification(Goal, _, Class) :-
2197 compound(Goal),
2198 compound_name_arity(Goal, Name, Arity),
2199 vararg_goal_classification(Name, Arity, Class).
2200
2201global_location(Goal, File:Line) :-
2202 predicate_property(Goal, file(File)),
2203 predicate_property(Goal, line_count(Line)),
2204 !.
2205global_location(_, -).
2206
2207global_class(Goal, dynamic) :- predicate_property(Goal, dynamic), !.
2208global_class(Goal, multifile) :- predicate_property(Goal, multifile), !.
2209global_class(Goal, tabled) :- predicate_property(Goal, tabled), !.
2210global_class(_, static).
2211
2212
2216
2217vararg_goal_classification(call, Arity, built_in) :-
2218 Arity >= 1.
2219vararg_goal_classification(send_super, Arity, expanded) :- 2220 Arity >= 2.
2221vararg_goal_classification(get_super, Arity, expanded) :- 2222 Arity >= 3.
2223
2227
2228qualified_goal_classification(Goal, TB, Class) :-
2229 goal_classification(TB, Goal, [], Class),
2230 Class \== undefined,
2231 !.
2232qualified_goal_classification(Module:Goal, _, extern(Module, How)) :-
2233 predicate_property(Module:Goal, visible),
2234 !,
2235 ( ( predicate_property(Module:Goal, public)
2236 ; predicate_property(Module:Goal, exported)
2237 )
2238 -> How = (public)
2239 ; How = (private)
2240 ).
2241qualified_goal_classification(Module:_, _, extern(Module, unknown)).
2242
2246
2247classify_head(TB, Goal, exported) :-
2248 colour_state_source_id(TB, SourceId),
2249 xref_exported(SourceId, Goal),
2250 !.
2251classify_head(_TB, Goal, hook) :-
2252 xref_hook(Goal),
2253 !.
2254classify_head(TB, Goal, hook) :-
2255 colour_state_source_id(TB, SourceId),
2256 xref_module(SourceId, M),
2257 xref_hook(M:Goal),
2258 !.
2259classify_head(TB, Goal, Class) :-
2260 built_in_predicate(Goal),
2261 ( system_module(TB)
2262 -> ( predicate_property(system:Goal, iso)
2263 -> Class = def_iso
2264 ; goal_name(Goal, Name),
2265 \+ sub_atom(Name, 0, _, _, $)
2266 -> Class = def_swi
2267 )
2268 ; ( predicate_property(system:Goal, iso)
2269 -> Class = iso
2270 ; Class = built_in
2271 )
2272 ).
2273classify_head(TB, Goal, unreferenced) :-
2274 colour_state_source_id(TB, SourceId),
2275 \+ (xref_called(SourceId, Goal, By), By \= Goal),
2276 !.
2277classify_head(TB, Goal, How) :-
2278 colour_state_source_id(TB, SourceId),
2279 ( xref_defined(SourceId, Goal, imported(From))
2280 -> How = imported(From)
2281 ; xref_defined(SourceId, Goal, How)
2282 ),
2283 !.
2284classify_head(_TB, _Goal, undefined).
2285
2286built_in_predicate(Goal) :-
2287 predicate_property(system:Goal, built_in),
2288 !.
2289built_in_predicate(module(_, _)). 2290built_in_predicate(module(_, _, _)).
2291built_in_predicate(if(_)).
2292built_in_predicate(elif(_)).
2293built_in_predicate(else).
2294built_in_predicate(endif).
2295
2296goal_name(_:G, Name) :- nonvar(G), !, goal_name(G, Name).
2297goal_name(G, Name) :- callable(G), functor_name(G, Name).
2298
2299system_module(TB) :-
2300 colour_state_source_id(TB, SourceId),
2301 xref_module(SourceId, M),
2302 module_property(M, class(system)).
2303
2304generalise_term(Specific, General) :-
2305 ( compound(Specific)
2306 -> compound_name_arity(Specific, Name, Arity),
2307 compound_name_arity(General0, Name, Arity),
2308 General = General0
2309 ; General = Specific
2310 ).
2311
2312rename_goal(Goal0, Name, Goal) :-
2313 ( compound(Goal0)
2314 -> compound_name_arity(Goal0, _, Arity),
2315 compound_name_arity(Goal, Name, Arity)
2316 ; Goal = Name
2317 ).
2318
2319functor_name(Term, Name) :-
2320 ( compound(Term)
2321 -> compound_name_arity(Term, Name, _)
2322 ; atom(Term)
2323 -> Name = Term
2324 ).
2325
2326goal_name_arity(Goal, Name, Arity) :-
2327 ( compound(Goal)
2328 -> compound_name_arity(Goal, Name, Arity)
2329 ; atom(Goal)
2330 -> Name = Goal, Arity = 0
2331 ).
2332
2333
2334call_goal_colours(Term, Colours) :-
2335 goal_colours(Term, Colours),
2336 !.
2337call_goal_colours(Term, Colours) :-
2338 def_goal_colours(Term, Colours).
2339
2340call_goal_colours(Term, Class, Colours) :-
2341 goal_colours(Term, Class, Colours),
2342 !.
2345
2346
2348
2349def_goal_colours(module(_,_), built_in-[identifier,exports]).
2350def_goal_colours(module(_,_,_), built_in-[identifier,exports,langoptions]).
2351def_goal_colours(use_module(_), built_in-[imported_file]).
2352def_goal_colours(use_module(File,_), built_in-[file,imports(File)]).
2353def_goal_colours(autoload(_), built_in-[imported_file]).
2354def_goal_colours(autoload(File,_), built_in-[file,imports(File)]).
2355def_goal_colours(reexport(_), built_in-[file]).
2356def_goal_colours(reexport(File,_), built_in-[file,imports(File)]).
2357def_goal_colours(dynamic(_), built_in-[declarations(dynamic)]).
2358def_goal_colours(thread_local(_), built_in-[declarations(thread_local)]).
2359def_goal_colours(module_transparent(_), built_in-[declarations(module_transparent)]).
2360def_goal_colours(discontiguous(_), built_in-[declarations(discontiguous)]).
2361def_goal_colours(multifile(_), built_in-[declarations(multifile)]).
2362def_goal_colours(volatile(_), built_in-[declarations(volatile)]).
2363def_goal_colours(public(_), built_in-[declarations(public)]).
2364def_goal_colours(det(_), built_in-[declarations(det)]).
2365def_goal_colours(table(_), built_in-[declarations(table)]).
2366def_goal_colours(meta_predicate(_), built_in-[meta_declarations]).
2367def_goal_colours(consult(_), built_in-[file]).
2368def_goal_colours(include(_), built_in-[file]).
2369def_goal_colours(ensure_loaded(_), built_in-[file]).
2370def_goal_colours(load_files(_), built_in-[file]).
2371def_goal_colours(load_files(_,_), built_in-[file,options]).
2372def_goal_colours(setof(_,_,_), built_in-[classify,setof,classify]).
2373def_goal_colours(bagof(_,_,_), built_in-[classify,setof,classify]).
2374def_goal_colours(predicate_options(_,_,_), built_in-[predicate,classify,classify]).
2376def_goal_colours(assert(_), built_in-[db]).
2377def_goal_colours(asserta(_), built_in-[db]).
2378def_goal_colours(assertz(_), built_in-[db]).
2379def_goal_colours(assert(_,_), built_in-[db,classify]).
2380def_goal_colours(asserta(_,_), built_in-[db,classify]).
2381def_goal_colours(assertz(_,_), built_in-[db,classify]).
2382def_goal_colours(retract(_), built_in-[db]).
2383def_goal_colours(retractall(_), built_in-[db]).
2384def_goal_colours(clause(_,_), built_in-[db,classify]).
2385def_goal_colours(clause(_,_,_), built_in-[db,classify,classify]).
2387def_goal_colours(set_prolog_flag(_,_), built_in-[prolog_flag_name,classify]).
2388def_goal_colours(current_prolog_flag(_,_), built_in-[prolog_flag_name,classify]).
2390def_goal_colours(pce_autoload(_,_), classify-[classify,file]).
2391def_goal_colours(pce_image_directory(_), classify-[directory]).
2392def_goal_colours(new(_, _), built_in-[classify,pce_new]).
2393def_goal_colours(send_list(_,_,_), built_in-pce_arg_list).
2394def_goal_colours(send(_,_), built_in-[pce_arg,pce_selector]).
2395def_goal_colours(get(_,_,_), built_in-[pce_arg,pce_selector,pce_arg]).
2396def_goal_colours(send_super(_,_), built_in-[pce_arg,pce_selector]).
2397def_goal_colours(get_super(_,_), built_in-[pce_arg,pce_selector,pce_arg]).
2398def_goal_colours(get_chain(_,_,_), built_in-[pce_arg,pce_selector,pce_arg]).
2399def_goal_colours(Pce, built_in-pce_arg) :-
2400 compound(Pce),
2401 functor_name(Pce, Functor),
2402 pce_functor(Functor).
2403
2404pce_functor(send).
2405pce_functor(get).
2406pce_functor(send_super).
2407pce_functor(get_super).
2408
2409
2410 2413
2414head_colours(file_search_path(_,_), hook-[identifier,classify]).
2415head_colours(library_directory(_), hook-[file]).
2416head_colours(resource(_,_), hook-[identifier,file]).
2417head_colours(resource(_,_,_), hook-[identifier,file,classify]).
2418
2419head_colours(Var, _) :-
2420 var(Var),
2421 !,
2422 fail.
2423head_colours(M:H, Colours) :-
2424 M == user,
2425 head_colours(H, HC),
2426 HC = hook - _,
2427 !,
2428 Colours = meta-[module(user), HC ].
2429head_colours(M:H, Colours) :-
2430 atom(M), callable(H),
2431 xref_hook(M:H),
2432 !,
2433 Colours = meta-[module(M), hook-classify ].
2434head_colours(M:_, meta-[module(M),extern(M)]).
2435
2436
2437 2440
2446
2447def_style(goal(built_in,_), [colour(blue)]).
2448def_style(goal(imported(_),_), [colour(blue)]).
2449def_style(goal(autoload(_),_), [colour(navy_blue)]).
2450def_style(goal(global,_), [colour(navy_blue)]).
2451def_style(goal(global(dynamic,_),_), [colour(magenta)]).
2452def_style(goal(global(_,_),_), [colour(navy_blue)]).
2453def_style(goal(undefined,_), [colour(red)]).
2454def_style(goal(thread_local(_),_), [colour(magenta), underline(true)]).
2455def_style(goal(dynamic(_),_), [colour(magenta)]).
2456def_style(goal(multifile(_),_), [colour(navy_blue)]).
2457def_style(goal(expanded,_), [colour(blue), underline(true)]).
2458def_style(goal(extern(_),_), [colour(blue), underline(true)]).
2459def_style(goal(extern(_,private),_), [colour(red)]).
2460def_style(goal(extern(_,public),_), [colour(blue)]).
2461def_style(goal(recursion,_), [underline(true)]).
2462def_style(goal(meta,_), [colour(red4)]).
2463def_style(goal(foreign(_),_), [colour(darkturquoise)]).
2464def_style(goal(local(_),_), []).
2465def_style(goal(constraint(_),_), [colour(darkcyan)]).
2466def_style(goal(not_callable,_), [background(orange)]).
2467
2468def_style(option_name, [colour('#3434ba')]).
2469def_style(no_option_name, [colour(red)]).
2470
2471def_style(neck(_), [bold(true)]).
2472
2473def_style(head(exported,_), [colour(blue), bold(true)]).
2474def_style(head(public(_),_), [colour('#016300'), bold(true)]).
2475def_style(head(extern(_),_), [colour(blue), bold(true)]).
2476def_style(head(dynamic,_), [colour(magenta), bold(true)]).
2477def_style(head(multifile,_), [colour(navy_blue), bold(true)]).
2478def_style(head(unreferenced,_), [colour(red), bold(true)]).
2479def_style(head(hook,_), [colour(blue), underline(true)]).
2480def_style(head(meta,_), []).
2481def_style(head(constraint(_),_), [colour(darkcyan), bold(true)]).
2482def_style(head(imported(_),_), [colour(darkgoldenrod4), bold(true)]).
2483def_style(head(built_in,_), [background(orange), bold(true)]).
2484def_style(head(iso,_), [background(orange), bold(true)]).
2485def_style(head(def_iso,_), [colour(blue), bold(true)]).
2486def_style(head(def_swi,_), [colour(blue), bold(true)]).
2487def_style(head(_,_), [bold(true)]).
2488def_style(rule_condition, [background('#d4ffe3')]).
2489
2490def_style(module(_), [colour(dark_slate_blue)]).
2491def_style(comment(_), [colour(dark_green)]).
2492
2493def_style(directive, [background(grey90)]).
2494def_style(method(_), [bold(true)]).
2495
2496def_style(var, [colour(red4)]).
2497def_style(singleton, [bold(true), colour(red4)]).
2498def_style(unbound, [colour(red), bold(true)]).
2499def_style(quoted_atom, [colour(navy_blue)]).
2500def_style(string, [colour(navy_blue)]).
2501def_style(rational(_), [colour(steel_blue)]).
2502def_style(codes, [colour(navy_blue)]).
2503def_style(chars, [colour(navy_blue)]).
2504def_style(nofile, [colour(red)]).
2505def_style(file(_), [colour(blue), underline(true)]).
2506def_style(file_no_depend(_), [colour(blue), underline(true), background(pink)]).
2507def_style(directory(_), [colour(blue)]).
2508def_style(class(built_in,_), [colour(blue), underline(true)]).
2509def_style(class(library(_),_), [colour(navy_blue), underline(true)]).
2510def_style(class(local(_,_,_),_), [underline(true)]).
2511def_style(class(user(_),_), [underline(true)]).
2512def_style(class(user,_), [underline(true)]).
2513def_style(class(undefined,_), [colour(red), underline(true)]).
2514def_style(prolog_data, [colour(blue), underline(true)]).
2515def_style(flag_name(_), [colour(blue)]).
2516def_style(no_flag_name(_), [colour(red)]).
2517def_style(unused_import, [colour(blue), background(pink)]).
2518def_style(undefined_import, [colour(red)]).
2519
2520def_style(constraint(_), [colour(darkcyan)]).
2521
2522def_style(keyword(_), [colour(blue)]).
2523def_style(identifier, [bold(true)]).
2524def_style(delimiter, [bold(true)]).
2525def_style(expanded, [colour(blue), underline(true)]).
2526def_style(hook(_), [colour(blue), underline(true)]).
2527def_style(op_type(_), [colour(blue)]).
2528
2529def_style(qq_type, [bold(true)]).
2530def_style(qq(_), [colour(blue), bold(true)]).
2531def_style(qq_content(_), [colour(red4)]).
2532
2533def_style(dict_tag, [bold(true)]).
2534def_style(dict_key, [bold(true)]).
2535def_style(dict_function(_), [colour(navy_blue)]).
2536def_style(dict_return_op, [colour(blue)]).
2537
2538def_style(hook, [colour(blue), underline(true)]).
2539def_style(dcg_right_hand_ctx, [background('#d4ffe3')]).
2540
2541def_style(error, [background(orange)]).
2542def_style(type_error(_), [background(orange)]).
2543def_style(syntax_error(_,_), [background(orange)]).
2544def_style(instantiation_error, [background(orange)]).
2545
2546def_style(decl_option(_), [bold(true)]).
2547def_style(table_mode(_), [bold(true)]).
2548
2562
2563syntax_colour(Class, Attributes) :-
2564 ( style(Class, Attributes) 2565 ; def_style(Class, Attributes) 2566 ).
2567
2568
2572
2573term_colours((?- Directive), Colours) :-
2574 term_colours((:- Directive), Colours).
2575term_colours((prolog:Head --> _),
2576 neck(-->) - [ expanded - [ module(prolog),
2577 hook(message) - [ identifier
2578 ]
2579 ],
2580 dcg_body(prolog:Head)
2581 ]) :-
2582 prolog_message_hook(Head).
2583
2584prolog_message_hook(message(_)).
2585prolog_message_hook(deprecated(_)).
2586prolog_message_hook(error_message(_)).
2587prolog_message_hook(message_context(_)).
2588prolog_message_hook(message_location(_)).
2589
2591
2592term_colours(variable(_, _, _, _),
2593 expanded - [ identifier,
2594 classify,
2595 classify,
2596 comment(string)
2597 ]).
2598term_colours(variable(_, _, _),
2599 expanded - [ identifier,
2600 classify,
2601 atom
2602 ]).
2603term_colours(handle(_, _, _),
2604 expanded - [ classify,
2605 classify,
2606 classify
2607 ]).
2608term_colours(handle(_, _, _, _),
2609 expanded - [ classify,
2610 classify,
2611 classify,
2612 classify
2613 ]).
2614term_colours(class_variable(_,_,_,_),
2615 expanded - [ identifier,
2616 pce(type),
2617 pce(default),
2618 comment(string)
2619 ]).
2620term_colours(class_variable(_,_,_),
2621 expanded - [ identifier,
2622 pce(type),
2623 pce(default)
2624 ]).
2625term_colours(delegate_to(_),
2626 expanded - [ classify
2627 ]).
2628term_colours((:- encoding(_)),
2629 expanded - [ expanded - [ classify
2630 ]
2631 ]).
2632term_colours((:- pce_begin_class(_, _, _)),
2633 expanded - [ expanded - [ identifier,
2634 pce_new,
2635 comment(string)
2636 ]
2637 ]).
2638term_colours((:- pce_begin_class(_, _)),
2639 expanded - [ expanded - [ identifier,
2640 pce_new
2641 ]
2642 ]).
2643term_colours((:- pce_extend_class(_)),
2644 expanded - [ expanded - [ identifier
2645 ]
2646 ]).
2647term_colours((:- pce_end_class),
2648 expanded - [ expanded
2649 ]).
2650term_colours((:- pce_end_class(_)),
2651 expanded - [ expanded - [ identifier
2652 ]
2653 ]).
2654term_colours((:- use_class_template(_)),
2655 expanded - [ expanded - [ pce_new
2656 ]
2657 ]).
2658term_colours((:- emacs_begin_mode(_,_,_,_,_)),
2659 expanded - [ expanded - [ identifier,
2660 classify,
2661 classify,
2662 classify,
2663 classify
2664 ]
2665 ]).
2666term_colours((:- emacs_extend_mode(_,_)),
2667 expanded - [ expanded - [ identifier,
2668 classify
2669 ]
2670 ]).
2671term_colours((:- pce_group(_)),
2672 expanded - [ expanded - [ identifier
2673 ]
2674 ]).
2675term_colours((:- pce_global(_, new(_))),
2676 expanded - [ expanded - [ identifier,
2677 pce_arg
2678 ]
2679 ]).
2680term_colours((:- emacs_end_mode),
2681 expanded - [ expanded
2682 ]).
2683term_colours(pce_ifhostproperty(_,_),
2684 expanded - [ classify,
2685 classify
2686 ]).
2687term_colours((_,_),
2688 error - [ classify,
2689 classify
2690 ]).
2691
2696
2697specified_item(_Class, _Term, _TB, Pos) :-
2698 var(Pos),
2699 !.
2700specified_item(Class, Term, TB, parentheses_term_position(PO,PC,Pos)) :-
2701 !,
2702 colour_item(parentheses, TB, PO-PC),
2703 specified_item(Class, Term, TB, Pos).
2704specified_item(_, Var, TB, Pos) :-
2705 ( var(Var)
2706 ; qq_position(Pos)
2707 ),
2708 !,
2709 colourise_term_arg(Var, TB, Pos).
2710 2711specified_item(classify, Term, TB, Pos) :-
2712 !,
2713 colourise_term_arg(Term, TB, Pos).
2714 2715specified_item(head, Term, TB, Pos) :-
2716 !,
2717 colourise_clause_head(Term, TB, Pos).
2718 2719specified_item(head(+N), Term, TB, Pos) :-
2720 !,
2721 colourise_extended_head(Term, N, TB, Pos).
2722 2723specified_item(extern(M), Term, TB, Pos) :-
2724 !,
2725 colourise_extern_head(Term, M, TB, Pos).
2726 2727specified_item(body, Term, TB, Pos) :-
2728 !,
2729 colourise_body(Term, TB, Pos).
2730specified_item(body(Goal), _Term0, TB, Pos) :-
2731 !,
2732 colourise_body(Goal, TB, Pos).
2733specified_item(dcg_body(Head), Term, TB, Pos) :-
2734 !,
2735 colourise_dcg(Term, Head, TB, Pos).
2736specified_item(setof, Term, TB, Pos) :-
2737 !,
2738 colourise_setof(Term, TB, Pos).
2739specified_item(meta(MetaSpec), Term, TB, Pos) :-
2740 !,
2741 colourise_meta_arg(MetaSpec, Term, TB, Pos).
2742 2743specified_item(dcg, Term, TB, Pos) :-
2744 !,
2745 colourise_dcg(Term, [], TB, Pos).
2746 2747specified_item(db, Term, TB, Pos) :-
2748 !,
2749 colourise_db(Term, TB, Pos).
2750 2751specified_item(error(Error), _Term, TB, Pos) :-
2752 colour_item(Error, TB, Pos).
2753 2754specified_item(file(Path), _Term, TB, Pos) :-
2755 !,
2756 colour_item(file(Path), TB, Pos).
2757specified_item(file, Term, TB, Pos) :-
2758 !,
2759 colourise_files(Term, TB, Pos, any).
2760specified_item(imported_file, Term, TB, Pos) :-
2761 !,
2762 colourise_files(Term, TB, Pos, imported).
2763specified_item(langoptions, Term, TB, Pos) :-
2764 !,
2765 colourise_langoptions(Term, TB, Pos).
2766
2767 2768specified_item(directory, Term, TB, Pos) :-
2769 !,
2770 colourise_directory(Term, TB, Pos).
2771 2772specified_item(exports, Term, TB, Pos) :-
2773 !,
2774 colourise_exports(Term, TB, Pos).
2775 2776specified_item(imports(File), Term, TB, Pos) :-
2777 !,
2778 colourise_imports(Term, File, TB, Pos).
2779 2780specified_item(import(File), Term, TB, Pos) :-
2781 !,
2782 colourise_import(Term, File, TB, Pos).
2783 2784specified_item(predicates, Term, TB, Pos) :-
2785 !,
2786 colourise_declarations(Term, predicate_indicator, TB, Pos).
2787 2788specified_item(predicate, Term, TB, Pos) :-
2789 !,
2790 colourise_declaration(Term, predicate_indicator, TB, Pos).
2791 2792specified_item(meta_declarations, Term, TB, Pos) :-
2793 !,
2794 colourise_meta_declarations(Term, [], TB, Pos).
2795specified_item(meta_declarations(Extra), Term, TB, Pos) :-
2796 !,
2797 colourise_meta_declarations(Term, Extra, TB, Pos).
2798specified_item(declarations(Which), Term, TB, Pos) :-
2799 !,
2800 colourise_declarations(Term, Which, TB, Pos).
2801 2802specified_item(prolog_flag_name, Term, TB, Pos) :-
2803 !,
2804 colourise_prolog_flag_name(Term, TB, Pos).
2805 2806specified_item(pce_new, Term, TB, Pos) :-
2807 !,
2808 ( atom(Term)
2809 -> colourise_class(Term, TB, Pos)
2810 ; compound(Term)
2811 -> functor_name(Term, Class),
2812 Pos = term_position(_,_,FF, FT, ArgPos),
2813 colourise_class(Class, TB, FF-FT),
2814 specified_items(pce_arg, Term, TB, ArgPos)
2815 ; colourise_term_arg(Term, TB, Pos)
2816 ).
2817 2818specified_item(pce_arg, new(X), TB,
2819 term_position(_,_,_,_,[ArgPos])) :-
2820 !,
2821 specified_item(pce_new, X, TB, ArgPos).
2822specified_item(pce_arg, new(X, T), TB,
2823 term_position(_,_,_,_,[P1, P2])) :-
2824 !,
2825 colourise_term_arg(X, TB, P1),
2826 specified_item(pce_new, T, TB, P2).
2827specified_item(pce_arg, @(Ref), TB, Pos) :-
2828 !,
2829 colourise_term_arg(@(Ref), TB, Pos).
2830specified_item(pce_arg, prolog(Term), TB,
2831 term_position(_,_,FF,FT,[ArgPos])) :-
2832 !,
2833 colour_item(prolog_data, TB, FF-FT),
2834 colourise_term_arg(Term, TB, ArgPos).
2835specified_item(pce_arg, Term, TB, Pos) :-
2836 compound(Term),
2837 Term \= [_|_],
2838 \+ is_dict(Term),
2839 !,
2840 specified_item(pce_new, Term, TB, Pos).
2841specified_item(pce_arg, Term, TB, Pos) :-
2842 !,
2843 colourise_term_arg(Term, TB, Pos).
2844 2845specified_item(pce_arg_list, List, TB, list_position(F,T,Elms,Tail)) :-
2846 !,
2847 colour_item(list, TB, F-T),
2848 colourise_list_args(Elms, Tail, List, TB, pce_arg).
2849specified_item(pce_arg_list, Term, TB, Pos) :-
2850 !,
2851 specified_item(pce_arg, Term, TB, Pos).
2852 2853specified_item(pce_selector, Term, TB,
2854 term_position(_,_,_,_,ArgPos)) :-
2855 !,
2856 specified_items(pce_arg, Term, TB, ArgPos).
2857specified_item(pce_selector, Term, TB, Pos) :-
2858 colourise_term_arg(Term, TB, Pos).
2859 2860specified_item(FuncSpec-ArgSpecs, Term, TB,
2861 term_position(_,_,FF,FT,ArgPos)) :-
2862 !,
2863 specified_item(FuncSpec, Term, TB, FF-FT),
2864 specified_items(ArgSpecs, Term, TB, ArgPos).
2865 2866specified_item(FuncSpec-[ArgSpec], {Term}, TB,
2867 brace_term_position(F,T,ArgPos)) :-
2868 !,
2869 specified_item(FuncSpec, {Term}, TB, F-T),
2870 specified_item(ArgSpec, Term, TB, ArgPos).
2871 2872specified_item(FuncSpec-ElmSpec, List, TB,
2873 list_position(F,T,ElmPos,TailPos)) :-
2874 !,
2875 colour_item(FuncSpec, TB, F-T),
2876 specified_list(ElmSpec, List, TB, ElmPos, TailPos).
2877specified_item(Class, _, TB, Pos) :-
2878 colour_item(Class, TB, Pos).
2879
2881
2882specified_items(Specs, Term, TB, PosList) :-
2883 is_dict(Term),
2884 !,
2885 specified_dict_kv(PosList, Term, TB, Specs).
2886specified_items(Specs, Term, TB, PosList) :-
2887 is_list(Specs),
2888 !,
2889 specified_arglist(Specs, 1, Term, TB, PosList).
2890specified_items(Spec, Term, TB, PosList) :-
2891 specified_argspec(PosList, Spec, 1, Term, TB).
2892
2893
2894specified_arglist([], _, _, _, _).
2895specified_arglist(_, _, _, _, []) :- !. 2896specified_arglist([S0|ST], N, T, TB, [P0|PT]) :-
2897 ( S0 == options,
2898 colourization_module(TB, Module),
2899 colourise_option_arg(T, Module, N, TB, P0)
2900 -> true
2901 ; arg(N, T, Term),
2902 specified_item(S0, Term, TB, P0)
2903 ),
2904 NN is N + 1,
2905 specified_arglist(ST, NN, T, TB, PT).
2906
2907specified_argspec([], _, _, _, _).
2908specified_argspec([P0|PT], Spec, N, T, TB) :-
2909 arg(N, T, Term),
2910 specified_item(Spec, Term, TB, P0),
2911 NN is N + 1,
2912 specified_argspec(PT, Spec, NN, T, TB).
2913
2914
2916
2917specified_list([], [], _, [], _).
2918specified_list([HS|TS], [H|T], TB, [HP|TP], TailPos) :-
2919 !,
2920 specified_item(HS, H, TB, HP),
2921 specified_list(TS, T, TB, TP, TailPos).
2922specified_list(Spec, [H|T], TB, [HP|TP], TailPos) :-
2923 specified_item(Spec, H, TB, HP),
2924 specified_list(Spec, T, TB, TP, TailPos).
2925specified_list(_, _, _, [], none) :- !.
2926specified_list(Spec, Tail, TB, [], TailPos) :-
2927 specified_item(Spec, Tail, TB, TailPos).
2928
2932
2933specified_dict_kv([], _, _, _).
2934specified_dict_kv([key_value_position(_F,_T,SF,ST,K,KP,VP)|Pos],
2935 Dict, TB, Specs) :-
2936 specified_dict_kv1(K, Specs, KeySpec, ValueSpec),
2937 colour_item(KeySpec, TB, KP),
2938 colour_item(dict_sep, TB, SF-ST),
2939 get_dict(K, Dict, V),
2940 specified_item(ValueSpec, V, TB, VP),
2941 specified_dict_kv(Pos, Dict, TB, Specs).
2942
2943specified_dict_kv1(Key, Specs, KeySpec, ValueSpec) :-
2944 Specs = [_|_],
2945 memberchk(dict_kv(Key, KeySpec, ValueSpec), Specs),
2946 !.
2947specified_dict_kv1(Key, dict_kv(Key2, KeySpec, ValueSpec), KeySpec, ValueSpec) :-
2948 \+ Key \= Key2,
2949 !. 2950specified_dict_kv1(_, _, dict_key, classify).
2951
2952
2953 2956
2957syntax_message(Class) -->
2958 message(Class),
2959 !.
2960syntax_message(qq(_)) -->
2961 [ 'Quasi quote delimiter' ].
2962syntax_message(qq_type) -->
2963 [ 'Quasi quote type term' ].
2964syntax_message(qq_content(Type)) -->
2965 [ 'Quasi quote content (~w syntax)'-[Type] ].
2966syntax_message(goal(Class, Goal)) -->
2967 !,
2968 goal_message(Class, Goal).
2969syntax_message(class(Type, Class)) -->
2970 !,
2971 xpce_class_message(Type, Class).
2972syntax_message(dict_return_op) -->
2973 !,
2974 [ ':= separates function from return value' ].
2975syntax_message(dict_function) -->
2976 !,
2977 [ 'Function on a dict' ].
2978syntax_message(ext_quant) -->
2979 !,
2980 [ 'Existential quantification operator' ].
2981syntax_message(hook(message)) -->
2982 [ 'Rule for print_message/2' ].
2983syntax_message(module(Module)) -->
2984 ( { current_module(Module) }
2985 -> ( { module_property(Module, file(File)) }
2986 -> [ 'Module ~w defined in ~w'-[Module,File] ]
2987 ; [ 'Module ~w'-[Module] ]
2988 )
2989 ; [ 'Module ~w (not loaded)'-[Module] ]
2990 ).
2991syntax_message(decl_option(incremental)) -->
2992 [ 'Keep affected tables consistent' ].
2993syntax_message(decl_option(abstract)) -->
2994 [ 'Add abstracted goal to table dependency graph' ].
2995syntax_message(decl_option(volatile)) -->
2996 [ 'Do not include predicate in a saved program' ].
2997syntax_message(decl_option(multifile)) -->
2998 [ 'Clauses are spread over multiple files' ].
2999syntax_message(decl_option(discontiguous)) -->
3000 [ 'Clauses are not contiguous' ].
3001syntax_message(decl_option(private)) -->
3002 [ 'Tables or clauses are private to a thread' ].
3003syntax_message(decl_option(local)) -->
3004 [ 'Tables or clauses are private to a thread' ].
3005syntax_message(decl_option(shared)) -->
3006 [ 'Tables or clauses are shared between threads' ].
3007syntax_message(decl_option(_Opt)) -->
3008 [ 'Predicate property' ].
3009syntax_message(rational(Value)) -->
3010 [ 'Rational number ~w'-[Value] ].
3011syntax_message(rule_condition) -->
3012 [ 'Guard' ].
3013syntax_message(neck(=>)) -->
3014 [ 'Rule' ].
3015syntax_message(neck(-->)) -->
3016 [ 'Grammar rule' ].
3017
3018goal_message(meta, _) -->
3019 [ 'Meta call' ].
3020goal_message(not_callable, _) -->
3021 [ 'Goal is not callable (type error)' ].
3022goal_message(expanded, _) -->
3023 [ 'Expanded goal' ].
3024goal_message(Class, Goal) -->
3025 { predicate_name(Goal, PI) },
3026 [ 'Call to ~q'-PI ],
3027 goal_class(Class).
3028
3029goal_class(recursion) -->
3030 [ ' (recursive call)' ].
3031goal_class(undefined) -->
3032 [ ' (undefined)' ].
3033goal_class(global) -->
3034 [ ' (Auto-imported from module user)' ].
3035goal_class(global(Class, File:Line)) -->
3036 [ ' (~w in user module from ~w:~w)'-[Class, File, Line] ].
3037goal_class(global(Class, source_location(File,Line))) -->
3038 [ ' (~w in user module from ~w:~w)'-[Class, File, Line] ].
3039goal_class(global(Class, -)) -->
3040 [ ' (~w in user module)'-[Class] ].
3041goal_class(imported(From)) -->
3042 [ ' (imported from ~q)'-[From] ].
3043goal_class(extern(_, private)) -->
3044 [ ' (WARNING: private predicate)' ].
3045goal_class(extern(_, public)) -->
3046 [ ' (public predicate)' ].
3047goal_class(extern(_)) -->
3048 [ ' (cross-module call)' ].
3049goal_class(Class) -->
3050 [ ' (~p)'-[Class] ].
3051
3052xpce_class_message(Type, Class) -->
3053 [ 'XPCE ~w class ~q'-[Type, Class] ]