Coverage report: /home/ellis/comp/core/lib/syn/gen/rs/ast.lisp

KindCoveredAll%
expression1759 28.8
branch410 40.0
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 ;;; ast.lisp --- GEN/RS AST Nodes
2
 
3
 ;; 
4
 
5
 ;;; Code:
6
 (in-package :syn/gen/rs)
7
 
8
 ;;; Nodes
9
 (defstmt rs-comment (comment) ())
10
 (defnode trait () ())
11
 (defnode rs-type (c-type) ())
12
 (defexpr raw-str-literal (literal-expr) ())
13
 (defexpr boolean-literal (literal-expr) ())
14
 (defexpr byte-literal (literal-expr) ())
15
 (defexpr byte-str-literal (literal-expr) ())
16
 (defexpr byte-str-raw-literal (literal-expr) ())
17
 (defexpr c-str-raw-literal (literal-expr) ())
18
 (defexpr c-str-literal (literal-expr) ())
19
 (defexpr err-literal (literal-expr) ())
20
 (defexpr match (prefix-expression) ())
21
 (defexpr range () ())
22
 
23
 (defnode rs-function-definition (gen/c::function-definition) ())
24
 ;;; Context Switches
25
 (build-context-switches
26
  :package :syn/gen/rs/sym
27
  :symbols *rs-symbols*)
28
 
29
 (build-swap-package
30
  :package :syn/gen/rs/sym
31
  :swap-package :syn/gen/rs/swap
32
  :symbols *rs-swap*)
33
 
34
 ;;; Syntax
35
 (defmacro rs-syntax (tags lambda-list &body body)
36
   `(defsyntax ,tags (:rs) ,lambda-list ,@body))
37
 
38
 ;; binary ops
39
 (rs-syntax (<= >= < > + - * / = || && == != % << >> ^ | & += /= *= %= >>= <<= -= |= &= ^=)
40
     (&rest rest)
41
   "Infix expressions for multiple inputs"
42
   `(make-instance 'infix-expression :op ',syn/gen::tag :members (make-nodes ,rest)))
43
 
44
 ;; unary ops
45
 (rs-syntax (* ! -) (&rest rest)
46
   (if (eql (length rest) 1)
47
       `(make-instance 'prefix-expression :op ',syn/gen::tag :object (make-node ,@rest))
48
       `(make-instance 'infix-expression :op ',syn/gen::tag :members (make-nodes ,rest))))
49
 
50
 ;; FIX 2025-03-06: 
51
 (rs-syntax fn (name params type &body body &environment env)
52
   "Define a Rust function"
53
   `(make-instance 'syn/gen/c::function-definition
54
      ;; function name + type
55
      :item ,(if (listp type)
56
                 (let ((first (first type)))
57
                   (if (and (not (listp first)) (std:fboundp! first env))
58
                       ;; type is macro or function
59
                       `(gen/c::make-declaration-node (,type ,name))
60
                       ;; type is list with type information
61
                       `(gen/c::make-declaration-node (,@type ,name))))
62
                 `(gen/c::make-declaration-node (,name ,type)))
63
                 
64
      :parameter
65
      (make-instance 'syn/gen/c::parameter-list
66
        :parameters
67
        (make-nodes ,params :prepend syn/gen/c::make-declaration-node))
68
      :body
69
      ,(when body
70
         `(make-block ,body))))
71