branch: externals/javaimp commit 7096049eaa7a5f7bddedb3baf4fac51c94a5aa86 Author: Filipp Gunbin <fgun...@fastmail.fm> Commit: Filipp Gunbin <fgun...@fastmail.fm>
* javaimp-parse.el: Fix class scope parsing when declaration contains Enum class name --- javaimp-parse.el | 21 +++++++++++++++++---- javaimp-tests.el | 2 ++ javaimp-util.el | 14 -------------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/javaimp-parse.el b/javaimp-parse.el index e123c2a..fca0369 100644 --- a/javaimp-parse.el +++ b/javaimp-parse.el @@ -73,6 +73,19 @@ present." (string-trim (substring str 0 end)) str))) +(defun javaimp--parse-rsb-keyword (regexp &optional bound noerror count) + "Like `re-search-backward', but count only occurences outside +syntactic context as given by `syntax-ppss-context'. Assumes +point is outside of any context initially." + (or count (setq count 1)) + (let ((step (if (>= count 0) 1 -1)) + (case-fold-search nil) + res) + (dotimes (_ (abs count)) + (while (and (setq res (re-search-backward regexp bound noerror step)) + (syntax-ppss-context (syntax-ppss))))) + res)) + (defun javaimp--parse-arglist (beg end &optional only-type) "Parse arg list between BEG and END, of the form 'TYPE NAME, ...'. Return list of conses (TYPE . NAME). If ONLY-TYPE is @@ -178,7 +191,7 @@ is checked to be SKIP-COUNT lists away from the SCOPE-START (1 is for scope start itself, so if you want to skip one additional list, use 2 etc.). If a match is found, then match-data is set, as for `re-search-backward'." - (and (javaimp--rsb-outside-context regexp nil t) + (and (javaimp--parse-rsb-keyword regexp nil t) (ignore-errors ;; Does our match belong to the right block? (= (scan-lists (match-end 0) (or skip-count 1) -1) @@ -192,7 +205,7 @@ is left before the match. Otherwise, the result is nil and point is unchanged." (let ((pos (point))) (catch 'found - (while (javaimp--rsb-outside-context regexp bound t) + (while (javaimp--parse-rsb-keyword regexp bound t) (let ((scan-pos (match-end 0))) (javaimp--parse-with-arglist-syntax scan-pos (while (and scan-pos (<= scan-pos (nth 1 state))) @@ -403,14 +416,14 @@ nil then goes all the way up." (defun javaimp--parse-get-package () (goto-char (point-max)) - (when (javaimp--rsb-outside-context + (when (javaimp--parse-rsb-keyword "^\\s-*package\\s-+\\([^;\n]+\\)\\s-*;" nil t 1) (match-string 1))) (defun javaimp--parse-get-file-classes () (goto-char (point-max)) (let (res) - (while (javaimp--rsb-outside-context + (while (javaimp--parse-rsb-keyword (regexp-opt javaimp--parse-class-keywords 'words) nil t) (save-excursion (let ((parse-sexp-ignore-comments t) ; FIXME remove with major mode diff --git a/javaimp-tests.el b/javaimp-tests.el index d46ee37..0ca4593 100644 --- a/javaimp-tests.el +++ b/javaimp-tests.el @@ -58,6 +58,8 @@ implements Interface1<Bar, Baz>, Interface2 {" class "Foo") '("class Foo<E extends Bar> {" class "Foo") + '("class Foo<Enum<?>> {" + class "Foo") '("class Foo<T extends Baz<? extends Baz2>> \ extends Bar<? extends Baz<? extends Baz2>> {" class "Foo") diff --git a/javaimp-util.el b/javaimp-util.el index 0231f17..1544cc4 100644 --- a/javaimp-util.el +++ b/javaimp-util.el @@ -137,20 +137,6 @@ buffer and returns its result" (concat "[" path-separator "\n]+") t))) - -(defun javaimp--rsb-outside-context (regexp &optional bound noerror count) - "Like `re-search-backward', but count only occurences outside -syntactic context as given by `syntax-ppss-context'. Assumes -point is outside of any context initially." - (or count (setq count 1)) - (let ((step (if (>= count 0) 1 -1)) - res) - (dotimes (_ (abs count)) - (while (and (setq res (re-search-backward regexp bound noerror step)) - (syntax-ppss-context (syntax-ppss))))) - res)) - - ;; Tree building & search