[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/sweeprolog 4e612c0c3e 2/2: Use built-in file_autoload_dire
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/sweeprolog 4e612c0c3e 2/2: Use built-in file_autoload_directives/3 to update deps |
Date: |
Sun, 4 Dec 2022 13:59:39 -0500 (EST) |
branch: elpa/sweeprolog
commit 4e612c0c3ee8629e1099509f3ec69bff785f91a2
Author: Eshel Yaron <me@eshelyaron.com>
Commit: Eshel Yaron <me@eshelyaron.com>
Use built-in file_autoload_directives/3 to update deps
* sweep.pl (sweep_file_missing_dependencies/2): new predicate.
* sweeprolog.el (sweeprolog-update-dependencies): use it.
* sweeprolog-tests.el: add another test case for
sweeprolog-update-dependencies.
---
sweep.pl | 36 ++++++++++++++++++-
sweeprolog-tests.el | 32 +++++++++++++++++
sweeprolog.el | 101 ++++++++++++++++++++++++++++------------------------
3 files changed, 122 insertions(+), 47 deletions(-)
diff --git a/sweep.pl b/sweep.pl
index 360d9333af..4c0c12ea1d 100644
--- a/sweep.pl
+++ b/sweep.pl
@@ -69,7 +69,8 @@
sweep_exportable_predicates/2,
sweep_interrupt/0,
sweep_string_to_atom/2,
- sweep_file_path_in_library/2
+ sweep_file_path_in_library/2,
+ sweep_file_missing_dependencies/2
]).
:- use_module(library(pldoc)).
@@ -86,6 +87,7 @@
:- use_module(library(http/html_write)).
:- use_module(library(prolog_pack)).
:- use_module(library(prolog_deps)).
+:- use_module(library(dcg/high_order)).
:- if(exists_source(library(help))).
:- use_module(library(help)).
@@ -908,3 +910,35 @@ strip_mode_and_type(S, N) => strip_type(S, N).
strip_type(N:_, N) :- !.
strip_type(N, N).
+
+sweep_file_missing_dependencies(File0, Deps) :-
+ atom_string(File, File0),
+ file_autoload_directives(File, Directives, [missing(true)]),
+ phrase(dep_directives(Directives), Deps).
+
+dep_directives(Directives) --> sequence(dep_directive, Directives).
+
+dep_directive(:- use_module(Spec)) -->
+ !,
+ { absolute_file_name(Spec, Path0,
+ [ file_type(prolog),
+ access(read)
+ ]),
+ atom_string(Path0, Path)
+ },
+ [[Path, [], "use_module"]].
+dep_directive(:- Directive) -->
+ { compound_name_arguments(Directive, Kind0, [Spec, ImportList]),
+ atom_string(Kind0, Kind),
+ absolute_file_name(Spec, Path0,
+ [ file_type(prolog),
+ access(read)
+ ]),
+ atom_string(Path0, Path)
+ },
+ sequence(dep_import(Path, Kind), ImportList).
+
+dep_import(Path, Kind, PI0) -->
+ { term_string(PI0, PI)
+ },
+ [[Path, PI, Kind]].
diff --git a/sweeprolog-tests.el b/sweeprolog-tests.el
index 7124aee268..46a4c612a4 100644
--- a/sweeprolog-tests.el
+++ b/sweeprolog-tests.el
@@ -691,6 +691,38 @@ foo :- bar.
foo :- Body.
"))))
+(ert-deftest update-dependencies-no-autoload ()
+ "Tests making adding a use_module/1 directive."
+ (let ((temp (make-temp-file "sweeprolog-test"
+ nil
+ "pl"
+ "
+:- module(foo, [bar/1]).
+
+/** <module> Foo
+
+*/
+
+bar(X) :- arithmetic_function(X).
+"
+ )))
+ (find-file-literally temp)
+ (sweeprolog-mode)
+ (call-interactively #'sweeprolog-update-dependencies)
+ (should (string= (buffer-string)
+ "
+:- module(foo, [bar/1]).
+
+/** <module> Foo
+
+*/
+
+:- use_module(library(arithmetic), [ arithmetic_function/1
+ ]).
+
+bar(X) :- arithmetic_function(X).
+"))))
+
(ert-deftest append-dependencies ()
"Tests making implicit autoloads explicit with existing directive."
(let ((temp (make-temp-file "sweeprolog-test"
diff --git a/sweeprolog.el b/sweeprolog.el
index 514dd3acbb..88fde91240 100644
--- a/sweeprolog.el
+++ b/sweeprolog.el
@@ -4110,7 +4110,6 @@ valid Prolog atom."
"Add explicit dependencies for implicitly autoaloaded predicates."
(interactive "" sweeprolog-mode)
(let ((existing nil)
- (missing nil)
(current-directive-beg nil)
(current-directive-end nil)
(current-directive-file nil))
@@ -4137,57 +4136,67 @@ valid Prolog atom."
current-directive-end))
(push
(cons current-directive-file (copy-marker (1- end) t))
- existing)))
- (`("goal" ("autoload" . ,file) ,functor ,arity)
- (let ((autoloaded (list file functor arity)))
- (unless (member autoloaded missing)
- (push autoloaded missing)))))))
- (if missing
+ existing))))))
+ (if-let ((missing
+ (sweeprolog--query-once "sweep" "sweep_file_missing_dependencies"
+ (buffer-file-name))))
(progn
(dolist (autoloaded missing)
(let* ((file (nth 0 autoloaded))
- (functor (nth 1 autoloaded))
- (arity (nth 2 autoloaded))
- (pred (concat (sweeprolog-format-string-as-atom functor)
- "/" (number-to-string arity))))
- (message "Adding explicit dependency on %s from %s."
- pred file)
- (if-let ((marker (cdr (assoc-string file existing))))
+ (pred (nth 1 autoloaded))
+ (kind (nth 2 autoloaded)))
+ (if (not pred)
(save-mark-and-excursion
- (goto-char marker)
- (pcase (sweeprolog-last-token-boundaries)
- (`(open ,_ ,oend)
- (goto-char oend)
- (insert " " pred "\n"))
- (`(symbol ,_ ,oend)
- (let ((point (point)))
+ (goto-char (point-min))
+ (sweeprolog-end-of-top-term)
+ (while (forward-comment 1))
+ (insert ":- " kind "("
+ (sweeprolog--query-once "sweep"
+
"sweep_file_path_in_library"
+ file)
+ ").\n\n")
+ (indent-region-line-by-line (save-excursion
+
(sweeprolog-beginning-of-top-term)
+ (point))
+ (point)))
+ (message "Adding explicit dependency on %s from %s."
+ pred file)
+ (if-let ((marker (cdr (assoc-string file existing))))
+ (save-mark-and-excursion
+ (goto-char marker)
+ (pcase (sweeprolog-last-token-boundaries)
+ (`(open ,_ ,oend)
(goto-char oend)
- (insert ",")
- (goto-char (1+ point))
- (insert pred "\n")))
- (tok
- (user-error "Unexpected token %s while looking for
import list"
- tok)))
- (indent-region-line-by-line (save-excursion
-
(sweeprolog-beginning-of-top-term)
- (point))
- (save-excursion
- (sweeprolog-end-of-top-term)
- (point))))
- (save-mark-and-excursion
- (goto-char (point-min))
- (sweeprolog-end-of-top-term)
- (while (forward-comment 1))
- (insert ":- autoload("
- (sweeprolog--query-once "sweep"
- "sweep_file_path_in_library"
- file)
- ", [ " pred "\n]).\n\n")
- (indent-region-line-by-line (save-excursion
-
(sweeprolog-beginning-of-top-term)
+ (insert " " pred "\n"))
+ (`(symbol ,_ ,oend)
+ (let ((point (point)))
+ (goto-char oend)
+ (insert ",")
+ (goto-char (1+ point))
+ (insert pred "\n")))
+ (tok
+ (user-error "Unexpected token %s while looking for
import list"
+ tok)))
+ (indent-region-line-by-line (save-excursion
+
(sweeprolog-beginning-of-top-term)
+ (point))
+ (save-excursion
+
(sweeprolog-end-of-top-term)
+ (point))))
+ (save-mark-and-excursion
+ (goto-char (point-min))
+ (sweeprolog-end-of-top-term)
+ (while (forward-comment 1))
+ (insert ":- " kind "("
+ (sweeprolog--query-once "sweep"
+
"sweep_file_path_in_library"
+ file)
+ ", [ " pred "\n]).\n\n")
+ (indent-region-line-by-line (save-excursion
+
(sweeprolog-beginning-of-top-term)
+ (point))
(point))
- (point))
- (push (cons file (copy-marker (- (point) 5) t)) existing)))))
+ (push (cons file (copy-marker (- (point) 5) t))
existing))))))
(sweeprolog-analyze-buffer t))
(message "No implicit autoloads found."))))