unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
From: Holger Peters <holger.peters@posteo.de>
To: guile-devel@gnu.org
Cc: Holger Peters <holger.peters@posteo.de>
Subject: [PATCH 1/1] Preserve source properties in unparse-tree-il
Date: Fri, 30 Oct 2020 17:00:48 +0100	[thread overview]
Message-ID: <bae97b72061ca44069aee83898ee996cffacb5f0.1604073054.git.holger.peters@posteo.de> (raw)
In-Reply-To: <cover.1604073054.git.holger.peters@posteo.de>

* 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




      reply	other threads:[~2020-10-30 16:00 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-30 16:00 [PATCH 0/1] Preserve source properties in unparse-tree-il Holger Peters
2020-10-30 16:00 ` Holger Peters [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bae97b72061ca44069aee83898ee996cffacb5f0.1604073054.git.holger.peters@posteo.de \
    --to=holger.peters@posteo.de \
    --cc=guile-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).