PageRenderTime 44ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/src/simple-snippet.lisp

https://bitbucket.org/mmontone/clgrs
Lisp | 151 lines | 123 code | 28 blank | 0 comment | 2 complexity | a4a6aeb376021e62f4782daa0df4b5ef MD5 | raw file
  1. (in-package :clgrs/assist)
  2. (defvar *indentation* 0)
  3. (defvar *indent-size* 4)
  4. (defvar *in-newline* t)
  5. (defun indent-node-before (node stream)
  6. (apply-node-format node (getf (clgrs::node-format node) :before) stream)
  7. (when *in-newline*
  8. (dotimes (i *indentation*)
  9. (write-char #\space stream))))
  10. (defun indent-node-after (node stream)
  11. (apply-node-format node (getf (clgrs::node-format node) :after) stream))
  12. (defun apply-node-format (node format stream)
  13. (apply-node-format-rule format node stream))
  14. (defmethod apply-node-format-rule ((format list) node stream)
  15. (mapcar (lambda (rule)
  16. (apply-node-format-rule rule node stream))
  17. format))
  18. (defmethod apply-node-format-rule ((format (eql :newline)) node stream)
  19. (write-char #\newline stream)
  20. (setf *in-newline* t))
  21. (defmethod apply-node-format-rule ((format (eql :indent)) node stream)
  22. (incf *indentation* *indent-size*))
  23. (defmethod apply-node-format-rule ((format (eql :unindent)) node stream)
  24. (decf *indentation* *indent-size*))
  25. (defun simple-snippet* (node)
  26. (let ((*snippet-n* 0)
  27. (*print-case* :downcase)
  28. (*indentation* 0)
  29. (*in-newline* nil))
  30. (with-output-to-string (out)
  31. (simple-snippet node out))))
  32. (defgeneric simple-snippet (node stream))
  33. (defmethod simple-snippet :before ((node clgrs::node) stream)
  34. (indent-node-before node stream))
  35. (defmethod simple-snippet :after ((node clgrs::node) stream)
  36. (setf *in-newline* nil)
  37. (indent-node-after node stream))
  38. (defmethod simple-snippet ((node clgrs::symbol-node) stream)
  39. (if (clgrs::node-symbol node)
  40. (prin1 (clgrs::node-symbol node) stream)
  41. (format stream "${~A:~A~@[~A~]}"
  42. (next-snippet-n)
  43. (or
  44. (clgrs::node-name node)
  45. 'symbol)
  46. (when (clgrs::node-completer node)
  47. (format nil "$(clgrs/complete-func \"~S\")"
  48. (clgrs::node-completer node))
  49. ))))
  50. (defmethod simple-snippet ((node clgrs::keyword-node) stream)
  51. (if (clgrs::node-keyword node)
  52. (prin1 (clgrs::node-keyword node) stream)
  53. (format stream ":${~A:~A~@[~A~]}"
  54. (next-snippet-n)
  55. (or (clgrs::node-name node)
  56. 'keyword)
  57. (when (clgrs::node-completer node)
  58. (format nil "$(clgrs/complete-func \"~S\")"
  59. (clgrs::node-completer node))
  60. ))))
  61. (defmethod simple-snippet ((node clgrs::string-node) stream)
  62. (if (clgrs::node-string node)
  63. (prin1 (clgrs::node-string node) stream)
  64. (format stream "\"${~A:~A}\""
  65. (next-snippet-n)
  66. (or (clgrs::node-name node)
  67. "string"))))
  68. (defmethod simple-snippet ((node clgrs::integer-node) stream)
  69. (format stream "${~A:~S}"
  70. (next-snippet-n)
  71. (or (clgrs::node-integer node)
  72. (clgrs::node-name node)
  73. 'integer)))
  74. (defmethod simple-snippet ((node clgrs::boolean-node) stream)
  75. (format stream "~A"
  76. (or (clgrs::node-boolean node)
  77. (clgrs::node-name node)
  78. 'boolean)))
  79. (defun yas-assist (stream &optional (placeholder "$"))
  80. (format stream "${~A:~A$(clgrs/yas-assist-placeholder)}"
  81. (next-snippet-n)
  82. (or placeholder "$")))
  83. (defmethod simple-snippet ((node clgrs::list-node) stream)
  84. (write-string "(" stream)
  85. (let ((children (clgrs::children node)))
  86. (when (first children)
  87. (simple-snippet (first children) stream))
  88. (loop
  89. for child in (cdr children)
  90. do
  91. (write-char #\space stream)
  92. (simple-snippet child stream)))
  93. (write-string ")" stream))
  94. (defmethod simple-snippet ((node clgrs::or-node) stream)
  95. (yas-assist stream (clgrs::node-name node)))
  96. (defmethod simple-snippet ((node clgrs::rule-node) stream)
  97. (if (and (clgrs::node-name node) nil)
  98. (format stream "${~A:~A}"
  99. (next-snippet-n)
  100. (clgrs::node-name node))
  101. (simple-snippet (clgrs::node-rule node) stream)))
  102. (defmethod simple-snippet ((node clgrs::many-node) stream)
  103. (yas-assist stream (clgrs::node-name node)))
  104. (defmethod simple-snippet ((node clgrs::seq-node) stream)
  105. (if (and nil (clgrs::node-name node))
  106. (yas-assist stream (clgrs::node-name node))
  107. (progn
  108. (when (first (clgrs::children node))
  109. (simple-snippet (first (clgrs::children node)) stream))
  110. (loop for child in (cdr (clgrs::children node))
  111. do
  112. (write-char #\space stream)
  113. (simple-snippet child stream)))))
  114. (defmethod simple-snippet ((node clgrs::any-node) stream)
  115. (if (clgrs::node-name node)
  116. (format stream "${~A:~A}" (next-snippet-n)
  117. (clgrs::node-name node))
  118. (format stream "$~A" (next-snippet-n))))
  119. (defmethod simple-snippet ((node clgrs::optional-node) stream)
  120. (format stream "${~A:[~A]$(clgrs/yas-optional)}"
  121. (next-snippet-n)
  122. (with-output-to-string (s)
  123. (assist-template (clgrs::child node) s))))