matlab-complete.el:
(matlab-find-recent-variable-list): Use new search APIs for keyword searches. Fix some misc bugs. (matlab--complete-compute-search-functions): New - pulled from below: (matlab-complete-symbol-local): Remove code for deriving which functions to use. Pulled out to support testing. matlab.el: (matlab-mcos-innerblock-regexp, matlab-mcos-regexp, matlab-block-beg-pre-if) (matlab-block-beg-pre-no-if, matlab-block-beg-pre): DELETED tests/metest.el: (matlab-complete): New require (metest-all-syntax-tests): Move stuff around. Add metest-complete-test. (met-complete-files, met-complete-tools, metest-complete-test): NEW tests/complete.m: New file for testing local completion stuff.
This commit is contained in:
parent
2f6958d102
commit
21b33abd51
|
@ -248,28 +248,28 @@ If the list is empty, then searches continue backwards through the code."
|
||||||
(nreverse lst)))
|
(nreverse lst)))
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(let ((lst nil))
|
(let ((lst nil))
|
||||||
(while (and (re-search-backward
|
(while (and
|
||||||
(concat "\\<\\(" matlab-block-beg-pre-no-if
|
(< (length lst) 10)
|
||||||
"\\)\\s-+(?\\s-*\\(" prefix
|
(matlab-re-search-keyword-backward (matlab-keyword-regex 'ctrl) bounds t))
|
||||||
"\\w+\\)\\>")
|
(when (looking-at (concat "\\w+\\s-+(?\\(" prefix "\\w+\\)\\_>"))
|
||||||
bounds t)
|
(setq lst (cons (match-string 1) lst))))
|
||||||
(< (length lst) 10))
|
|
||||||
(setq lst (cons (match-string 2) lst)))
|
|
||||||
(nreverse lst)))
|
(nreverse lst)))
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(if (re-search-backward "^\\s-*global\\s-+" bounds t)
|
(let ((lst nil) m e)
|
||||||
(let ((lst nil) m e)
|
(while (matlab-re-search-keyword-backward
|
||||||
|
(matlab-keyword-regex 'vardecl) bounds t)
|
||||||
|
(save-excursion
|
||||||
(goto-char (match-end 0))
|
(goto-char (match-end 0))
|
||||||
(while (looking-at "\\(\\w+\\)\\([ \t]+\\|$\\)")
|
(while (looking-at "\\s-*\\(\\w+\\)\\([ \t]+\\|$\\)")
|
||||||
(setq m (match-string 1)
|
(setq m (match-string 1)
|
||||||
e (match-end 0))
|
e (match-end 0))
|
||||||
(if (equal 0 (string-match prefix m))
|
(if (equal 0 (string-match prefix m))
|
||||||
(setq lst (cons m lst)))
|
(setq lst (cons m lst)))
|
||||||
(goto-char e))
|
(goto-char e))))
|
||||||
(nreverse lst))))
|
(nreverse lst)))
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(if (and (re-search-backward "^\\s-*function\\>" bounds t)
|
(if (and (re-search-backward "^\\s-*function\\>" bounds t)
|
||||||
(re-search-forward "\\<\\(\\w+\\)("
|
(re-search-forward "\\_<\\(\\w+\\)\\s-*("
|
||||||
(matlab-point-at-eol) t))
|
(matlab-point-at-eol) t))
|
||||||
(let ((lst nil) m e)
|
(let ((lst nil) m e)
|
||||||
(while (looking-at "\\(\\w+\\)\\s-*[,)]\\s-*")
|
(while (looking-at "\\(\\w+\\)\\s-*[,)]\\s-*")
|
||||||
|
@ -315,7 +315,7 @@ In NEXT is non-nil, than continue through the list of elements."
|
||||||
(let ((lst nil))
|
(let ((lst nil))
|
||||||
(while (re-search-forward "^\\s-*function\\>" nil t)
|
(while (re-search-forward "^\\s-*function\\>" nil t)
|
||||||
(if (re-search-forward
|
(if (re-search-forward
|
||||||
(concat "\\(" prefix "\\w+\\)\\s-*\\($\\|(\\)")
|
(concat "\\_<\\(" prefix "\\w+\\)\\s-*\\($\\|(\\)")
|
||||||
(matlab-point-at-eol) t)
|
(matlab-point-at-eol) t)
|
||||||
(setq lst (cons (match-string 1) lst))))
|
(setq lst (cons (match-string 1) lst))))
|
||||||
(nreverse lst)))
|
(nreverse lst)))
|
||||||
|
@ -463,7 +463,33 @@ Use `completion-in-region' to support the completion behavior."
|
||||||
(completion-in-region common-substr-start-pt common-substr-end-pt completions)
|
(completion-in-region common-substr-start-pt common-substr-end-pt completions)
|
||||||
))
|
))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
(defun matlab--complete-compute-search-functions (semantics)
|
||||||
|
"Return the search functions for context specified by SEMATNICS."
|
||||||
|
(cond ((eq semantics 'solo)
|
||||||
|
'(matlab-solo-completions
|
||||||
|
matlab-find-user-functions
|
||||||
|
matlab-find-recent-variable))
|
||||||
|
((eq semantics 'boolean)
|
||||||
|
'(matlab-find-recent-variable
|
||||||
|
matlab-boolean-completions
|
||||||
|
matlab-find-user-functions
|
||||||
|
matlab-value-completions))
|
||||||
|
((eq semantics 'value)
|
||||||
|
'(matlab-find-recent-variable
|
||||||
|
matlab-find-user-functions
|
||||||
|
matlab-value-completions
|
||||||
|
matlab-boolean-completions))
|
||||||
|
((eq semantics 'property)
|
||||||
|
'(matlab-property-completions
|
||||||
|
matlab-find-user-functions
|
||||||
|
matlab-find-recent-variable
|
||||||
|
matlab-value-completions))
|
||||||
|
(t '(matlab-find-recent-variable
|
||||||
|
matlab-find-user-functions
|
||||||
|
matlab-value-completions
|
||||||
|
matlab-boolean-completions))))
|
||||||
|
|
||||||
(defun matlab-complete-symbol-local (&optional arg)
|
(defun matlab-complete-symbol-local (&optional arg)
|
||||||
"Complete a partially typed symbol in a MATLAB mode buffer.
|
"Complete a partially typed symbol in a MATLAB mode buffer.
|
||||||
If the previously entered command was also `matlab-complete-symbol'
|
If the previously entered command was also `matlab-complete-symbol'
|
||||||
|
@ -496,29 +522,7 @@ to change it temporarily."
|
||||||
(setq matlab-last-prefix prefix
|
(setq matlab-last-prefix prefix
|
||||||
matlab-last-semantic sem
|
matlab-last-semantic sem
|
||||||
matlab-completion-search-state
|
matlab-completion-search-state
|
||||||
(cond ((eq sem 'solo)
|
(matlab--complete-compute-search-functions sem)))
|
||||||
'(matlab-solo-completions
|
|
||||||
matlab-find-user-functions
|
|
||||||
matlab-find-recent-variable))
|
|
||||||
((eq sem 'boolean)
|
|
||||||
'(matlab-find-recent-variable
|
|
||||||
matlab-boolean-completions
|
|
||||||
matlab-find-user-functions
|
|
||||||
matlab-value-completions))
|
|
||||||
((eq sem 'value)
|
|
||||||
'(matlab-find-recent-variable
|
|
||||||
matlab-find-user-functions
|
|
||||||
matlab-value-completions
|
|
||||||
matlab-boolean-completions))
|
|
||||||
((eq sem 'property)
|
|
||||||
'(matlab-property-completions
|
|
||||||
matlab-find-user-functions
|
|
||||||
matlab-find-recent-variable
|
|
||||||
matlab-value-completions))
|
|
||||||
(t '(matlab-find-recent-variable
|
|
||||||
matlab-find-user-functions
|
|
||||||
matlab-value-completions
|
|
||||||
matlab-boolean-completions)))))
|
|
||||||
(cond
|
(cond
|
||||||
((eq matlab-completion-technique 'increment)
|
((eq matlab-completion-technique 'increment)
|
||||||
(let ((r nil) (donext (eq last-command 'matlab-complete-symbol)))
|
(let ((r nil) (donext (eq last-command 'matlab-complete-symbol)))
|
||||||
|
|
29
matlab.el
29
matlab.el
|
@ -1447,35 +1447,6 @@ Ignore comments and whitespace."
|
||||||
|
|
||||||
;;; Regexps for MATLAB language ===============================================
|
;;; Regexps for MATLAB language ===============================================
|
||||||
|
|
||||||
;; "-pre" means "partial regular expression"
|
|
||||||
;; "-if" and "-no-if" means "[no] Indent Function"
|
|
||||||
|
|
||||||
(defconst matlab-mcos-innerblock-regexp "properties\\|methods\\|events\\|enumeration\\|arguments"
|
|
||||||
"Keywords which mark the beginning of mcos blocks.
|
|
||||||
These keywords can be overriden as variables or functions in other contexts
|
|
||||||
asside from that which they declare their content.")
|
|
||||||
|
|
||||||
(defconst matlab-mcos-regexp (concat "\\|classdef\\|" matlab-mcos-innerblock-regexp)
|
|
||||||
"Keywords which mark the beginning of mcos blocks.")
|
|
||||||
|
|
||||||
(defconst matlab-block-beg-pre-if
|
|
||||||
(concat "function\\|parfor\\|spmd\\|for\\|while\\|if\\|switch\\|try"
|
|
||||||
matlab-mcos-regexp)
|
|
||||||
"Keywords which mark the beginning of an indented block.
|
|
||||||
Includes function.")
|
|
||||||
|
|
||||||
(defconst matlab-block-beg-pre-no-if
|
|
||||||
(concat "parfor\\|for\\|spmd\\|while\\|if\\|switch\\|try"
|
|
||||||
matlab-mcos-regexp)
|
|
||||||
"Keywords which mark the beginning of an indented block.
|
|
||||||
Excludes function.")
|
|
||||||
|
|
||||||
(defun matlab-block-beg-pre ()
|
|
||||||
"Partial regular expression to recognize MATLAB block-begin keywords."
|
|
||||||
(if matlab-functions-have-end
|
|
||||||
matlab-block-beg-pre-if
|
|
||||||
matlab-block-beg-pre-no-if))
|
|
||||||
|
|
||||||
(defun matlab-match-function-re ()
|
(defun matlab-match-function-re ()
|
||||||
"Expression to match a function start line.
|
"Expression to match a function start line.
|
||||||
There are no reliable numeric matches in this expression.
|
There are no reliable numeric matches in this expression.
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
function complete (a_arg1, b_arg2)
|
||||||
|
% This function is for testing completion tools
|
||||||
|
|
||||||
|
arguments
|
||||||
|
a_arg1 (1,1) double
|
||||||
|
b_arg2 (2,1) int
|
||||||
|
end
|
||||||
|
|
||||||
|
global a_global
|
||||||
|
global b_global
|
||||||
|
|
||||||
|
a_localvar = 1;
|
||||||
|
b_localvar = 1;
|
||||||
|
|
||||||
|
for a_for=1:10
|
||||||
|
end
|
||||||
|
|
||||||
|
if bool_var
|
||||||
|
end
|
||||||
|
|
||||||
|
switch a_switch
|
||||||
|
end
|
||||||
|
|
||||||
|
a_
|
||||||
|
% @@(solo var "a_localvar" "a_switch" "a_for" "a_global" "a_arg1")
|
||||||
|
% @@(solo fcn )
|
||||||
|
|
||||||
|
% Note: For b, there are other test files the completion
|
||||||
|
% engine will find, so they are included.
|
||||||
|
b
|
||||||
|
% @@(solo fcn "blocal_fcn" "blazy_fcn" "buggy" "blocks")
|
||||||
|
% @@(solo var "b_localvar" "bool_var" "b_global" "b_arg2")
|
||||||
|
|
||||||
|
|
||||||
|
% quiet mlint
|
||||||
|
blocal_fcn(a_arg1, b_arg2, a_localvar, b_localvar, a_global, b_global);
|
||||||
|
end
|
||||||
|
|
||||||
|
function blocal_fcn(varargin)
|
||||||
|
|
||||||
|
blazy_fcn(varargin{:});
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function blazy_fcn(varargin)
|
||||||
|
end
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
(require 'matlab-load)
|
(require 'matlab-load)
|
||||||
(require 'matlab)
|
(require 'matlab)
|
||||||
(require 'cedet-matlab)
|
(require 'cedet-matlab)
|
||||||
|
(require 'matlab-complete)
|
||||||
(require 'semantic-matlab)
|
(require 'semantic-matlab)
|
||||||
|
|
||||||
;; Enable semantic
|
;; Enable semantic
|
||||||
|
@ -52,6 +53,7 @@
|
||||||
(setq-default matlab-indent-function-body 'MathWorks-Standard) ;; put it back
|
(setq-default matlab-indent-function-body 'MathWorks-Standard) ;; put it back
|
||||||
|
|
||||||
(metest-run 'metest-comment-string-syntax-test)
|
(metest-run 'metest-comment-string-syntax-test)
|
||||||
|
(metest-run 'metest-fontlock-test)
|
||||||
(metest-run 'metest-sexp-counting-test)
|
(metest-run 'metest-sexp-counting-test)
|
||||||
(metest-run 'metest-sexp-traversal-test)
|
(metest-run 'metest-sexp-traversal-test)
|
||||||
|
|
||||||
|
@ -61,10 +63,10 @@
|
||||||
(metest-indents-randomize-files)
|
(metest-indents-randomize-files)
|
||||||
(metest-run 'metest-indents-test)
|
(metest-run 'metest-indents-test)
|
||||||
|
|
||||||
|
;; Parsing and completion are high level tools
|
||||||
(metest-run 'metest-parse-test)
|
(metest-run 'metest-parse-test)
|
||||||
|
(metest-run 'metest-complete-test)
|
||||||
|
|
||||||
(metest-run 'metest-fontlock-test)
|
|
||||||
|
|
||||||
(metest-log-report (metest-log-write))
|
(metest-log-report (metest-log-write))
|
||||||
|
|
||||||
(matlab-scan-stats-print)
|
(matlab-scan-stats-print)
|
||||||
|
@ -446,7 +448,52 @@
|
||||||
( "df" . nil )
|
( "df" . nil )
|
||||||
)
|
)
|
||||||
"List of testing keywords and associated faces.")
|
"List of testing keywords and associated faces.")
|
||||||
|
|
||||||
|
|
||||||
|
(defvar met-complete-files '("complete.m")
|
||||||
|
"List of files for running font completion tests.")
|
||||||
|
|
||||||
|
(defvar met-complete-tools '((var . matlab-find-recent-variable)
|
||||||
|
(fcn . matlab-find-user-functions)
|
||||||
|
)
|
||||||
|
"List of tools that generate completions.")
|
||||||
|
|
||||||
|
(defvar metest-complete-test (cons "completion" met-complete-files))
|
||||||
|
(defun metest-complete-test (F)
|
||||||
|
"Test the completion tools in matlab-complete.el"
|
||||||
|
(let ((buf (metest-find-file F))
|
||||||
|
exp act
|
||||||
|
(cnt 0))
|
||||||
|
(with-current-buffer buf
|
||||||
|
(goto-char (point-min))
|
||||||
|
|
||||||
|
(while (re-search-forward "%\\s-*@@" nil t)
|
||||||
|
(setq exp (read (buffer-substring-no-properties (point) (scan-sexps (point) 1))))
|
||||||
|
;; Move to end of previous line, and try to do a complete
|
||||||
|
(matlab-with-context-line (matlab-previous-code-line (matlab-compute-line-context 2))
|
||||||
|
(end-of-line)
|
||||||
|
(let* ((prefix (buffer-substring-no-properties
|
||||||
|
(save-excursion (forward-word -1) (point))
|
||||||
|
(point)))
|
||||||
|
(sem (matlab-lattr-semantics prefix))
|
||||||
|
)
|
||||||
|
;; Did we get the expected semantics of this location?
|
||||||
|
(when (not (eq sem (car exp)))
|
||||||
|
(metest-error "Completion Semantic Missmatch: Expected %s but found %s" (car exp) sem))
|
||||||
|
|
||||||
|
(let* ((expR (nthcdr 2 exp))
|
||||||
|
(fcn (assoc (nth 1 exp) met-complete-tools))
|
||||||
|
(act (funcall (cdr fcn) prefix)))
|
||||||
|
(when (not (equal act expR))
|
||||||
|
(metest-error "Completion Missmatch: Expected %S but found %S using function %S"
|
||||||
|
expR act fcn))
|
||||||
|
)
|
||||||
|
))
|
||||||
|
(setq cnt (1+ cnt))
|
||||||
|
;; Skip this match, find the next.
|
||||||
|
(end-of-line)))
|
||||||
|
(list cnt "tests")))
|
||||||
|
|
||||||
|
|
||||||
(defvar met-fontlock-files '("fontlock.m" "mclass.m" "blocks.m")
|
(defvar met-fontlock-files '("fontlock.m" "mclass.m" "blocks.m")
|
||||||
"List of files for running font lock tests.")
|
"List of files for running font lock tests.")
|
||||||
|
|
Loading…
Reference in New Issue