forked from jrockway/elisp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cperl-project.el
85 lines (72 loc) · 3 KB
/
cperl-project.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
(require 'eproject)
(define-project-type perl (generic)
(or (look-for "dist.ini") (look-for "Makefile.PL") (look-for "Build.PL"))
:relevant-files ("\\.pm$" "\\.t$" "\\.pl$" "\\.PL$")
:irrelevant-files ("inc/" "blib/" "cover_db/")
:mxdeclare-project-p (lambda (root)
(file-exists-p (concat root ".mxdeclare_project")))
:file-name-map (lambda (root)
(lambda (root file)
(cond ((string-match "^lib/\\(.+\\)[.]pm$" file)
(let ((m (match-string 1 file)))
(while (string-match "/" m)
(setf m (replace-match "::" nil nil m)))
m))
(t file))))
:xs-project-p (lambda (root)
(let ((default-directory root))
(> (length (file-expand-wildcards "*.xs")) 0)))
:main-file "Makefile.PL")
(defun cperl-mxdeclare-project-p ()
"Determine if this project should use MooseX::Declare class definitions."
(ignore-errors
(eproject-attribute :mxdeclare-project-p)))
(defun cperl-convert-moose-to-mxdeclare ()
"Convert a regular 'use Moose' class to a MX::Declare class."
(interactive)
(save-match-data
(save-excursion
(goto-char (point-min))
(when (re-search-forward "package \\(.+\\);\n*" nil t)
(let (start (module (match-string 1)))
(replace-match "use MooseX::Declare;\n\n")
(cond ((re-search-forward "use Moose::Role;\n*" nil t)
(replace-match (format "role %s {\n" module)))
((re-search-forward "use Moose;\n*" nil t)
(replace-match (format "class %s {\n" module)))
(t (error "No Moose class found!")))
(setq start
(save-excursion
(goto-char (car (match-data 0)))
(line-beginning-position)))
(cond ((re-search-forward "\n*1;\n*")
(replace-match "\n};\n\n1;\n"))
(t
(goto-char (point-max))
(insert "\n\n};\n\n1;\n")))
(indent-region start (point-max)))))))
(defun cperl--tests ()
(eproject-assert-type 'perl)
(concat (eproject-root) "/t"))
(defun cperl--base-find-tests (find-function)
(funcall find-function (cperl--tests)))
(defun cperl-find-tests ()
(interactive)
(cperl--base-find-tests 'find-file))
(defun cperl-find-tests-other-window ()
(interactive)
(cperl--base-find-tests 'find-file-other-window))
(defun perl-project-includes ()
"Return list of -I flags to pass to perl."
(eproject-assert-type 'perl)
(list (concat (eproject-root) "/lib")))
(defun look-for-Makefile.PL ()
(eproject-assert-type 'perl)
(concat (eproject-root) "Makefile.PL"))
(defun perl-module-test-file-p (filename)
(if (string-match "/t/.+[.]t$" filename) t nil))
(defun perl-module-lib-file-p (filename)
(if (string-match "/lib/.+[.]pm$" filename) t nil))
(provide 'cperl-project)
(require 'cperl-project-starter)
(require 'cperl-makefile)