[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/1] Preserve source properties in unparse-tree-il
From: |
Holger Peters |
Subject: |
[PATCH 1/1] Preserve source properties in unparse-tree-il |
Date: |
Fri, 30 Oct 2020 17:00:48 +0100 |
* module/language/tree-il.scm (unparse-tree-il): Add source properties if
available.
* module/language/tree-il.scm (add-src-loc): New procedure.
---
module/language/tree-il.scm | 75 +++++++++++++++++++++----------------
1 file changed, 42 insertions(+), 33 deletions(-)
diff --git a/module/language/tree-il.scm b/module/language/tree-il.scm
index 974fce29e..732edaf19 100644
--- a/module/language/tree-il.scm
+++ b/module/language/tree-il.scm
@@ -256,84 +256,93 @@
(else
(error "unrecognized tree-il" exp)))))
+(define (add-src-loc src-loc expr)
+ "Annotate expression with source location"
+ (when src-loc
+ (set-source-properties! expr src-loc))
+ expr)
+
(define (unparse-tree-il tree-il)
(match tree-il
(($ <void> src)
'(void))
(($ <call> src proc args)
- `(call ,(unparse-tree-il proc) ,@(map unparse-tree-il args)))
+ (add-src-loc src `(call ,(unparse-tree-il proc) ,@(map unparse-tree-il
args))))
(($ <primcall> src name args)
- `(primcall ,name ,@(map unparse-tree-il args)))
+ (add-src-loc src `(primcall ,name ,@(map unparse-tree-il args))))
(($ <conditional> src test consequent alternate)
- `(if ,(unparse-tree-il test)
- ,(unparse-tree-il consequent)
- ,(unparse-tree-il alternate)))
+ (add-src-loc src `(if ,(unparse-tree-il test)
+ ,(unparse-tree-il consequent)
+ ,(unparse-tree-il alternate))))
(($ <primitive-ref> src name)
- `(primitive ,name))
+ (add-src-loc src `(primitive ,name)))
(($ <lexical-ref> src name gensym)
- `(lexical ,name ,gensym))
+ (add-src-loc src `(lexical ,name ,gensym)))
(($ <lexical-set> src name gensym exp)
- `(set! (lexical ,name ,gensym) ,(unparse-tree-il exp)))
+ (add-src-loc `(set! (lexical ,name ,gensym) ,(unparse-tree-il exp))))
(($ <module-ref> src mod name public?)
- `(,(if public? '@ '@@) ,mod ,name))
+ (add-src-loc `(,(if public? '@ '@@) ,mod ,name)))
(($ <module-set> src mod name public? exp)
- `(set! (,(if public? '@ '@@) ,mod ,name) ,(unparse-tree-il exp)))
+ (add-src-loc `(set! (,(if public? '@ '@@) ,mod ,name) ,(unparse-tree-il
exp)) ))
(($ <toplevel-ref> src mod name)
- `(toplevel ,name))
+ (add-src-loc src `(toplevel ,name) ))
(($ <toplevel-set> src mod name exp)
- `(set! (toplevel ,name) ,(unparse-tree-il exp)))
+ (add-src-loc src `(set! (toplevel ,name) ,(unparse-tree-il exp))))
(($ <toplevel-define> src mod name exp)
- `(define ,name ,(unparse-tree-il exp)))
+ (add-src-loc src `(define ,name ,(unparse-tree-il exp))))
(($ <lambda> src meta body)
- (if body
- `(lambda ,meta ,(unparse-tree-il body))
- `(lambda ,meta (lambda-case))))
+ (let ((res (if body
+ `(lambda ,meta ,(unparse-tree-il body))
+ `(lambda ,meta (lambda-case)))))
+ (add-src-loc src res)))
(($ <lambda-case> src req opt rest kw inits gensyms body alternate)
- `(lambda-case ((,req ,opt ,rest ,kw ,(map unparse-tree-il inits) ,gensyms)
- ,(unparse-tree-il body))
- . ,(if alternate (list (unparse-tree-il alternate)) '())))
-
+ (let ((res `(lambda-case ((,req ,opt ,rest ,kw ,(map unparse-tree-il
inits) ,gensyms)
+ ,(unparse-tree-il body))
+ . ,(if alternate (list (unparse-tree-il
alternate)) '()))))
+ (add-src-loc src res)))
+
(($ <const> src exp)
- `(const ,exp))
+ (add-src-loc src `(const ,exp)))
(($ <seq> src head tail)
- `(seq ,(unparse-tree-il head) ,(unparse-tree-il tail)))
+ (add-src-loc src `(seq ,(unparse-tree-il head) ,(unparse-tree-il tail))))
(($ <let> src names gensyms vals body)
- `(let ,names ,gensyms ,(map unparse-tree-il vals) ,(unparse-tree-il
body)))
+ (add-src-loc `(let ,names ,gensyms ,(map unparse-tree-il vals)
,(unparse-tree-il body)) ))
(($ <letrec> src in-order? names gensyms vals body)
- `(,(if in-order? 'letrec* 'letrec) ,names ,gensyms
- ,(map unparse-tree-il vals) ,(unparse-tree-il body)))
+ (add-src-loc src `(,(if in-order? 'letrec* 'letrec) ,names ,gensyms
+ ,(map unparse-tree-il vals) ,(unparse-tree-il body))))
(($ <fix> src names gensyms vals body)
- `(fix ,names ,gensyms ,(map unparse-tree-il vals) ,(unparse-tree-il
body)))
+ (add-src-loc src `(fix ,names ,gensyms ,(map unparse-tree-il vals)
,(unparse-tree-il body))))
(($ <let-values> src exp body)
- `(let-values ,(unparse-tree-il exp) ,(unparse-tree-il body)))
+ (add-src-loc src `(let-values ,(unparse-tree-il exp) ,(unparse-tree-il
body))))
(($ <prompt> src escape-only? tag body handler)
- `(prompt ,escape-only?
- ,(unparse-tree-il tag)
- ,(unparse-tree-il body)
- ,(unparse-tree-il handler)))
+ (add-src-loc src `(prompt ,escape-only?
+ ,(unparse-tree-il tag)
+ ,(unparse-tree-il body)
+ ,(unparse-tree-il handler))))
(($ <abort> src tag args tail)
- `(abort ,(unparse-tree-il tag) ,(map unparse-tree-il args)
- ,(unparse-tree-il tail)))))
+ (add-src-loc `(abort ,(unparse-tree-il tag)
+ ,(map unparse-tree-il args)
+ ,(unparse-tree-il tail))))))
(define* (tree-il->scheme e #:optional (env #f) (opts '()))
(values ((@ (language scheme decompile-tree-il)
--
2.28.0