From c8da4fbf74952593a33c74874d466a472aa8de47 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 23 Feb 2016 08:52:25 -0500 Subject: [PATCH] julia-mode: Indentation performance improvements These focus on the block indentation algorithm, and basically remove unnecessary checks. 1. If we jump out of any comments at the beginning of the block indentation routine we don't need to check later if we are in a comment because backward-sexp jumps over comment blocks. 2. We also don't need to check if an end keyword is inside of brackets, because any time we are in brackets indentation is handled by julia-paren-indent. For an example of performance improvements, the time to indent lapack.jl falls from ~9s to ~3s on my machine. Added an indentation test for the end keyword appearing in brackets. --- contrib/julia-mode-tests.el | 14 ++++++++++++++ contrib/julia-mode.el | 18 +++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/contrib/julia-mode-tests.el b/contrib/julia-mode-tests.el index 239d078debf1e..bd57f17cb8466 100644 --- a/contrib/julia-mode-tests.el +++ b/contrib/julia-mode-tests.el @@ -270,6 +270,20 @@ bar end \"\"\"")) +(ert-deftest julia--test-indent-of-end-in-brackets () + "Ignore end keyword in brackets for the purposes of indenting blocks." + (julia--should-indent + "begin + begin + arr[1: end - 1] + end +end" + "begin + begin + arr[1: end - 1] + end +end")) + (defun julia--run-tests () (interactive) (if (featurep 'ert) diff --git a/contrib/julia-mode.el b/contrib/julia-mode.el index 9bad39948f6e8..bf365a4ccfead 100644 --- a/contrib/julia-mode.el +++ b/contrib/julia-mode.el @@ -401,12 +401,13 @@ As a result, it is true inside \"foo\", `foo` and 'f'." (defun julia-at-keyword (kw-list) "Return the word at point if it matches any keyword in KW-LIST. KW-LIST is a list of strings. The word at point is not considered -a keyword if used as a field name, X.word, or quoted, :word." +a keyword if used as a field name, X.word, or quoted, :word. + +Assumes that point is not inside a comment." (and (or (= (point) 1) (and (not (equal (char-before (point)) ?.)) (not (equal (char-before (point)) ?:)))) (member (current-word t) kw-list) - (not (julia-in-comment)) ;; 'end' is not a keyword when used for indexing, e.g. foo[end-2] (or (not (equal (current-word t) "end")) (not (julia-in-brackets))))) @@ -426,9 +427,7 @@ Do not move back beyond position MIN." (setq count (cond ((julia-at-keyword julia-block-start-keywords) (+ count 1)) - ;; fixme: breaks on strings - ((and (equal (current-word t) "end") - (not (julia-in-comment)) (not (julia-in-brackets))) + ((equal (current-word t) "end") (- count 1)) (t count)))) (if (> count 0) @@ -547,13 +546,18 @@ meaning always increase indent on TAB and decrease on S-TAB." ;; note: if this first function returns nil the beginning of the line ;; cannot be in a string (julia-indent-in-string) - ;; If we're inside an open paren, indent to line up arguments. + ;; If we're inside an open paren, indent to line up arguments. After this, + ;; we cannot be inside parens which includes brackets (julia-paren-indent) - ;; indent due to hanging operators or a line ending in = + ;; indent due to hanging operators (lines ending in an operator) (julia-indent-hanging) ;; Indent according to how many nested blocks we are in. (save-excursion (beginning-of-line) + ;; jump out of any comments + (let ((state (syntax-ppss))) + (when (nth 4 state) + (goto-char (nth 8 state)))) (forward-to-indentation 0) (let ((endtok (julia-at-keyword julia-block-end-keywords)) (last-open-block (julia-last-open-block (- (point) julia-max-block-lookback))))