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