branch: externals/beardbolt
commit c9f3b839e92b1564784337526787639e8ad395ca
Author: Duncan Paterson <[email protected]>
Commit: Duncan Paterson <[email protected]>
Add support for D
---
doc/rmsbolt.texi | 7 +++++++
rmsbolt.el | 22 ++++++++++++++++++++++
starters/rmsbolt-starter.d | 27 +++++++++++++++++++++++++++
3 files changed, 56 insertions(+)
diff --git a/doc/rmsbolt.texi b/doc/rmsbolt.texi
index bfba0134c2..291c66c7a1 100644
--- a/doc/rmsbolt.texi
+++ b/doc/rmsbolt.texi
@@ -55,6 +55,7 @@ Languages
* Pony::
* Emacs Lisp::
* Common Lisp::
+* D::
Integrations
@@ -202,6 +203,7 @@ This section covers languages-specific quirks and features.
* Pony::
* Emacs Lisp::
* Common Lisp::
+* D::
@end menu
@node C/C++
@@ -271,6 +273,11 @@ Emacs 26 or the @code{cl-print} package are required.
No support for source->asm matching or filtering. Only @code{sbcl} and
@code{clisp}
supported at the moment, with @code{sbcl} giving much better results.
+@node D
+@section D
+
+Assembly listing is supported through @code{ldc}
+
@node Integrations
@chapter Integrations
diff --git a/rmsbolt.el b/rmsbolt.el
index b903ff599a..be221a86b9 100644
--- a/rmsbolt.el
+++ b/rmsbolt.el
@@ -489,6 +489,21 @@ Return value is quoted for passing to the shell."
(concat "-Cllvm-args=--x86-asm-syntax="
asm-format)))
" ")))
cmd)))
+(cl-defun rmsbolt--d-compile-cmd (&key src-buffer)
+ "Process a compile command for d"
+ (rmsbolt--with-files
+ src-buffer
+ (let* ((language (rmsbolt--get-lang))
+ (compiler (or (buffer-local-value 'rmsbolt-command src-buffer)
+ (rmsbolt-l-cmd-function language)))
+ (demangle-off (not (buffer-local-value 'rmsbolt-demangle
src-buffer)))
+ (demangle-tmp-file (string-join (list rmsbolt--temp-dir
"/demangled")))
+ (demangler (rmsbolt-l-demangler language))
+ (cmd (string-join (list compiler "-g" "-output-s" src-filename "-of"
output-filename) " "))
+ (cmd (if demangle-off
+ cmd
+ (string-join (list cmd "&&" demangler output-filename ">"
demangle-tmp-file "&&" "mv" demangle-tmp-file output-filename) " "))))
+ cmd)))
(cl-defun rmsbolt--pony-compile-cmd (&key src-buffer)
"Process a compile command for ponyc."
(let* ((cmd (buffer-local-value 'rmsbolt-command src-buffer))
@@ -693,6 +708,12 @@ return t if successful."
:demangler "c++filt"
:compile-cmd-function #'rmsbolt--c-compile-cmd
:disass-hidden-funcs rmsbolt--hidden-func-c))
+ (d-mode
+ . ,(make-rmsbolt-lang :compile-cmd "ldc2"
+ :supports-asm t
+ :supports-disass t
+ :demangler "ddemangle"
+ :compile-cmd-function #'rmsbolt--d-compile-cmd))
;; In order to parse ocaml files, you need the emacs ocaml mode, tuareg
(tuareg-mode
. ,(make-rmsbolt-lang :compile-cmd "ocamlopt"
@@ -1345,6 +1366,7 @@ Are you running two compilations at the same time?"))
("php" . "rmsbolt.php")
("pony" . "rmsbolt.pony")
("emacs-lisp" . "rmsbolt-starter.el")
+ ("d" . "rmsbolt-starter.d")
;; Rmsbolt is capitalized here because of Java convention of Capitalized
;; class names.
("java" . "Rmsbolt.java")))
diff --git a/starters/rmsbolt-starter.d b/starters/rmsbolt-starter.d
new file mode 100644
index 0000000000..637f63bda1
--- /dev/null
+++ b/starters/rmsbolt-starter.d
@@ -0,0 +1,27 @@
+// Local Variables:
+// rmsbolt-command: "ldc2"
+// End:
+
+import std.stdio : writeln;
+
+int isRMS(char a) {
+ switch(a) {
+ case 'R':
+ return 1;
+ case 'M':
+ return 2;
+ case 'S':
+ return 3;
+ default:
+ return 0;
+ }
+}
+
+int main() {
+ int a = 1 + 1;
+ if(isRMS(cast(char) a)) {
+ writeln(a);
+ }
+ return 0;
+}
+