Skip to content

The srcloc in grift0 is shifted for bingind structures with only one sub-expression in body. #116

@SuChengHao

Description

@SuChengHao

The bug is caused by the parsing algorithm in src/grift/syntax->grift0.rkt.

For example, consider the following Grift program

(let ([a 1])
  (+ a 2))

The syntax->grift0 will give the following AST:

(Prog
 '("bad-let-2.grift" 1)
 (list
  (Ann2
   (Observe
    (Ann
     (Let
      (list
       (Bnd
        (Uid "a" 0)
        #f
        (Ann (Quote 1) (srcloc "bad-let-2.grift" 1 9 10 1))))
      (Ann
       (Op
        '+
        (list
         (Ann (Var (Uid "a" 0)) (srcloc "bad-let-2.grift" 2 5 19 1))
         (Ann (Quote 2) (srcloc "bad-let-2.grift" 2 7 21 1))))
       (srcloc "bad-let-2.grift" 1 0 1 23)))
     (srcloc "bad-let-2.grift" 1 0 1 23))
    #f)
   (srcloc "bad-let-2.grift" 1 0 1 23))))

The problem is that, the srcloc for (let ([a 1]) (+ a 2)) is exactly the srcloc for (+ a 2). Both of them are (1 0 1 1 23).

In general, the description of this bug is: if let or let-rec only has one expression in its body, then the srcloc of this expression will be the same as the outer let or let-rec.
I believe that is because of the weird logic of parse-begin. It seems that when the body of (begin e) only has one expression, this parsing algorithm will omit the outer begin. And all let, let-rec, define transform their bodies into a begin.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions