branch: elpa/sweeprolog
commit 447c530c26b52d7678fed4a7b123249fda40e3c2
Author: Eshel Yaron <m...@eshelyaron.com>
Commit: Eshel Yaron <m...@eshelyaron.com>

    ENHANCED: use docs from the SWI-Prolog manual to guess hole names
    
    * sweep.pl (predicate_argument_names/2): also consult the SWI-Prolog
    manual via pldoc_man:load_man_object/4 to find argument names for
    built-in predicates.
---
 README.org          |  6 +++---
 sweep.pl            | 28 +++++++++++++++++++++++++++-
 sweeprolog-tests.el |  2 +-
 3 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/README.org b/README.org
index 67d436cec0..784c417570 100644
--- a/README.org
+++ b/README.org
@@ -1455,9 +1455,9 @@ prefix argument (~C-u C-c C-e~).
 ~sweeprolog-mode~ empowers Emacs's standard ~completion-at-point~ command,
 bound by default to ~C-M-i~ and ~M-TAB~, with context-aware completion for
 Prolog terms.  For background about completion-at-point in Emacs, see 
[[info:emacs#Symbol
-Completion][Symbol Completion in the Emacs manual]].
+Completion][Symbol Completion]] in the Emacs manual.
 
-In ~sweeprolog-mode~ buffers, the following enhancements are provided:
+Sweep provides the following Prolog-specific completion facilities:
 
 - Variable name completion :: If the text before point can be
   completed to one or more variable names that appear elsewhere in the
@@ -1468,7 +1468,7 @@ In ~sweeprolog-mode~ buffers, the following enhancements 
are provided:
   candidates.  Predicate calls are inserted as complete term.  If the
   chosen predicate takes arguments, holes are inserted in their places
   (see [[#holes][Holes]]).
-- Atom completion :: If point is at a non-callable,
+- Atom completion :: If point is at a non-callable position,
   ~completion-at-point~ suggests matching atoms as completion
   candidates.
 
diff --git a/sweep.pl b/sweep.pl
index 302f9fea0b..0a02caf452 100644
--- a/sweep.pl
+++ b/sweep.pl
@@ -959,13 +959,39 @@ sweep_file_path_in_library(Path, Spec) :-
     ;   term_string(Spec1, Spec)
     ).
 
+predicate_argument_names(M:F/A, Args) :-
+    (   M == system
+    ->  true
+    ;   sub_atom(M, 0, 1, _, '$')
+    ),
+    pldoc_man:load_man_object(F/A, _, _, DOM0),
+    memberchk(element(dt, _, DOM1), DOM0),
+    memberchk(element(a, _, DOM2), DOM1),
+    catch(findall(Arg,
+                  (   member(element(var, _, Vars), DOM2),
+                      member(ArgsSpec, Vars),
+                      term_string(CommaSeparatedArgs,
+                                  ArgsSpec,
+                                  [module(pldoc_modes),
+                                   variable_names(VN)]),
+                      maplist(call, VN),
+                      comma_list(CommaSeparatedArgs, ArgsList),
+                      member(Arg, ArgsList)
+                  ),
+                  Args0),
+          error(syntax_error(_),_),
+          fail),
+    predicate_argument_names_(A, Args0, Args).
 predicate_argument_names(M:F/A, Args) :-
     doc_comment(M:F/A, _, _, C),
     comment_modes(C, ModeAndDets),
     member(ModeAndDet, ModeAndDets),
     strip_det(ModeAndDet, Head),
     Head =.. [_|Args0],
-    length(Args0, A),
+    predicate_argument_names_(A, Args0, Args).
+
+predicate_argument_names_(Arity, Args0, Args) :-
+    length(Args0, Arity),
     maplist(strip_mode_and_type, Args0, Args).
 
 strip_mode_and_type(S, N), compound(S) => arg(1, S, N0), strip_type(N0, N).
diff --git a/sweeprolog-tests.el b/sweeprolog-tests.el
index c4e3b1fc8f..c1551c38a6 100644
--- a/sweeprolog-tests.el
+++ b/sweeprolog-tests.el
@@ -443,7 +443,7 @@ baz(Baz) :- findall(X, b_g
     (call-interactively #'completion-at-point)
     (should (string= (buffer-string)
                      "
-baz(Baz) :- findall(X, b_getval(_, _)
+baz(Baz) :- findall(X, b_getval(Name, Value)
 "
                      ))))
 

Reply via email to