add syntax-srcloc-lens, syntax-line-lens, etc. (#284)
* add syntax-srcloc-lens, syntax-line-lens, etc. * provide and document syntax-srcloc lenses in unstable
This commit is contained in:
parent
24ea97cb92
commit
1f6e77917a
146
lens-data/lens/private/syntax/srcloc.rkt
Normal file
146
lens-data/lens/private/syntax/srcloc.rkt
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
#lang sweet-exp racket/base
|
||||||
|
|
||||||
|
provide syntax-srcloc-lens
|
||||||
|
syntax-source-lens
|
||||||
|
syntax-line-lens
|
||||||
|
syntax-position-lens
|
||||||
|
syntax-column-lens
|
||||||
|
syntax-span-lens
|
||||||
|
|
||||||
|
require fancy-app
|
||||||
|
lens/common
|
||||||
|
syntax/srcloc
|
||||||
|
module+ test
|
||||||
|
require rackunit
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
;; Syntax
|
||||||
|
|
||||||
|
;; syntax-srcloc : Syntax -> Srcloc
|
||||||
|
(define (syntax-srcloc stx)
|
||||||
|
(source-location->srcloc stx))
|
||||||
|
|
||||||
|
;; syntax-set-source-location : Syntax Source-Location -> Syntax
|
||||||
|
(define (syntax-set-source-location stx src)
|
||||||
|
(datum->syntax stx
|
||||||
|
(syntax-e stx)
|
||||||
|
(source-location->list src)
|
||||||
|
stx))
|
||||||
|
|
||||||
|
(define syntax-srcloc-lens
|
||||||
|
(make-lens
|
||||||
|
syntax-srcloc
|
||||||
|
syntax-set-source-location))
|
||||||
|
|
||||||
|
(define syntax-source-lens
|
||||||
|
(make-lens
|
||||||
|
syntax-source
|
||||||
|
(update-source-location _ #:source _)))
|
||||||
|
|
||||||
|
(define syntax-line-lens
|
||||||
|
(make-lens
|
||||||
|
syntax-line
|
||||||
|
(update-source-location _ #:line _)))
|
||||||
|
|
||||||
|
(define syntax-column-lens
|
||||||
|
(make-lens
|
||||||
|
syntax-column
|
||||||
|
(update-source-location _ #:column _)))
|
||||||
|
|
||||||
|
(define syntax-position-lens
|
||||||
|
(make-lens
|
||||||
|
syntax-position
|
||||||
|
(update-source-location _ #:position _)))
|
||||||
|
|
||||||
|
(define syntax-span-lens
|
||||||
|
(make-lens
|
||||||
|
syntax-span
|
||||||
|
(update-source-location _ #:span _)))
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
;; Source Locations
|
||||||
|
|
||||||
|
;; source-location->srcloc : Source-Location -> Srcloc
|
||||||
|
(define (source-location->srcloc src)
|
||||||
|
(build-source-location src))
|
||||||
|
|
||||||
|
;; source-location->list : Source-Location -> Source-Location-List
|
||||||
|
(define (source-location->list src)
|
||||||
|
(build-source-location-list src))
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
;; Tests
|
||||||
|
|
||||||
|
(module+ test
|
||||||
|
(define-check (check-syntax actual-stx expected-datum expected-srcloc)
|
||||||
|
(check-pred syntax? actual-stx)
|
||||||
|
(check-equal? (syntax->datum actual-stx) expected-datum)
|
||||||
|
(check-equal? (syntax-srcloc actual-stx) expected-srcloc))
|
||||||
|
|
||||||
|
(define a-src (srcloc 'a 12 5 144 9))
|
||||||
|
(define b-src (srcloc 'b 49 7 343 14))
|
||||||
|
(define a (datum->syntax #f (list '+ 1 2 3) (source-location->list a-src)))
|
||||||
|
(define b (datum->syntax #f (list 'define 'x 987) (source-location->list b-src)))
|
||||||
|
|
||||||
|
(test-case "syntax-srcloc-lens"
|
||||||
|
(check-equal? (lens-view syntax-srcloc-lens a) a-src)
|
||||||
|
(check-equal? (lens-view syntax-srcloc-lens b) b-src)
|
||||||
|
(check-syntax (lens-set syntax-srcloc-lens a a-src) (list '+ 1 2 3) a-src)
|
||||||
|
(check-syntax (lens-set syntax-srcloc-lens b b-src) (list 'define 'x 987) b-src)
|
||||||
|
(check-syntax (lens-set syntax-srcloc-lens a b-src) (list '+ 1 2 3) b-src)
|
||||||
|
(check-syntax (lens-set syntax-srcloc-lens b a-src) (list 'define 'x 987) a-src)
|
||||||
|
)
|
||||||
|
(test-case "syntax-source-lens"
|
||||||
|
(check-equal? (lens-view syntax-source-lens a) 'a)
|
||||||
|
(check-equal? (lens-view syntax-source-lens b) 'b)
|
||||||
|
(check-syntax (lens-set syntax-source-lens a "bye.rkt")
|
||||||
|
(list '+ 1 2 3)
|
||||||
|
(srcloc "bye.rkt" 12 5 144 9))
|
||||||
|
(check-syntax (lens-set syntax-source-lens b "hellooo.rkt")
|
||||||
|
(list 'define 'x 987)
|
||||||
|
(srcloc "hellooo.rkt" 49 7 343 14))
|
||||||
|
)
|
||||||
|
(test-case "syntax-line-lens"
|
||||||
|
(check-equal? (lens-view syntax-line-lens a) 12)
|
||||||
|
(check-equal? (lens-view syntax-line-lens b) 49)
|
||||||
|
(check-syntax (lens-set syntax-line-lens a 8)
|
||||||
|
(list '+ 1 2 3)
|
||||||
|
(srcloc 'a 8 5 144 9))
|
||||||
|
(check-syntax (lens-set syntax-line-lens b 11)
|
||||||
|
(list 'define 'x 987)
|
||||||
|
(srcloc 'b 11 7 343 14))
|
||||||
|
)
|
||||||
|
(test-case "syntax-column-lens"
|
||||||
|
(check-equal? (lens-view syntax-column-lens a) 5)
|
||||||
|
(check-equal? (lens-view syntax-column-lens b) 7)
|
||||||
|
(check-syntax (lens-set syntax-column-lens a 8)
|
||||||
|
(list '+ 1 2 3)
|
||||||
|
(srcloc 'a 12 8 144 9))
|
||||||
|
(check-syntax (lens-set syntax-column-lens b 11)
|
||||||
|
(list 'define 'x 987)
|
||||||
|
(srcloc 'b 49 11 343 14))
|
||||||
|
)
|
||||||
|
(test-case "syntax-position-lens"
|
||||||
|
(check-equal? (lens-view syntax-position-lens a) 144)
|
||||||
|
(check-equal? (lens-view syntax-position-lens b) 343)
|
||||||
|
(check-syntax (lens-set syntax-position-lens a 233)
|
||||||
|
(list '+ 1 2 3)
|
||||||
|
(srcloc 'a 12 5 233 9))
|
||||||
|
(check-syntax (lens-set syntax-position-lens b 610)
|
||||||
|
(list 'define 'x 987)
|
||||||
|
(srcloc 'b 49 7 610 14))
|
||||||
|
)
|
||||||
|
(test-case "syntax-span-lens"
|
||||||
|
(check-equal? (lens-view syntax-span-lens a) 9)
|
||||||
|
(check-equal? (lens-view syntax-span-lens b) 14)
|
||||||
|
(check-syntax (lens-set syntax-span-lens a 10)
|
||||||
|
(list '+ 1 2 3)
|
||||||
|
(srcloc 'a 12 5 144 10))
|
||||||
|
(check-syntax (lens-set syntax-span-lens b 15)
|
||||||
|
(list 'define 'x 987)
|
||||||
|
(srcloc 'b 49 7 343 15))
|
||||||
|
)
|
||||||
|
)
|
62
lens-doc/lens/private/syntax/srcloc.scrbl
Normal file
62
lens-doc/lens/private/syntax/srcloc.scrbl
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
#lang scribble/manual
|
||||||
|
|
||||||
|
@(require lens/private/doc-util/main)
|
||||||
|
|
||||||
|
@title{Syntax object source locations}
|
||||||
|
|
||||||
|
@defthing[syntax-srcloc-lens (lens/c syntax? srcloc?)]{
|
||||||
|
A lens that views the source location of a syntax object as a
|
||||||
|
@racket[srcloc] structure.
|
||||||
|
|
||||||
|
@lens-unstable-examples[
|
||||||
|
(lens-view syntax-srcloc-lens #'here)
|
||||||
|
(lens-set syntax-srcloc-lens #'here (srcloc "a.rkt" 5 8 55 13))
|
||||||
|
(syntax-source (lens-set syntax-srcloc-lens #'here (srcloc "a.rkt" 5 8 55 13)))
|
||||||
|
(syntax-position (lens-set syntax-srcloc-lens #'here (srcloc "a.rkt" 5 8 55 13)))
|
||||||
|
]}
|
||||||
|
|
||||||
|
@defthing[syntax-source-lens (lens/c syntax? any/c)]{
|
||||||
|
A lens that views the source field of a syntax object.
|
||||||
|
|
||||||
|
@lens-unstable-examples[
|
||||||
|
(lens-view syntax-source-lens #'here)
|
||||||
|
(lens-set syntax-source-lens #'here "a.rkt")
|
||||||
|
(syntax-source (lens-set syntax-source-lens #'here "a.rkt"))
|
||||||
|
]}
|
||||||
|
|
||||||
|
@defthing[syntax-line-lens (lens/c syntax? (or/c exact-positive-integer? #f))]{
|
||||||
|
A lens that views the line number of a syntax object.
|
||||||
|
|
||||||
|
@lens-unstable-examples[
|
||||||
|
(lens-view syntax-line-lens #'here)
|
||||||
|
(lens-set syntax-line-lens #'here 8)
|
||||||
|
(syntax-line (lens-set syntax-line-lens #'here 8))
|
||||||
|
]}
|
||||||
|
|
||||||
|
@defthing[syntax-column-lens (lens/c syntax? (or/c exact-nonnegative-integer? #f))]{
|
||||||
|
A lens that views the column number of a syntax object within its line.
|
||||||
|
|
||||||
|
@lens-unstable-examples[
|
||||||
|
(lens-view syntax-column-lens #'here)
|
||||||
|
(lens-set syntax-column-lens #'here 13)
|
||||||
|
(syntax-column (lens-set syntax-column-lens #'here 13))
|
||||||
|
]}
|
||||||
|
|
||||||
|
@defthing[syntax-position-lens (lens/c syntax? (or/c exact-positive-integer? #f))]{
|
||||||
|
A lens that views the source position a syntax object.
|
||||||
|
|
||||||
|
@lens-unstable-examples[
|
||||||
|
(lens-view syntax-position-lens #'here)
|
||||||
|
(lens-set syntax-position-lens #'here 21)
|
||||||
|
(syntax-position (lens-set syntax-position-lens #'here 21))
|
||||||
|
]}
|
||||||
|
|
||||||
|
@defthing[syntax-span-lens (lens/c syntax? (or/c exact-nonnegative-integer? #f))]{
|
||||||
|
A lens that views the source span a syntax object.
|
||||||
|
|
||||||
|
@lens-unstable-examples[
|
||||||
|
(lens-view syntax-span-lens #'here)
|
||||||
|
(lens-set syntax-span-lens #'here 34)
|
||||||
|
(syntax-span (lens-set syntax-span-lens #'here 34))
|
||||||
|
]}
|
||||||
|
|
|
@ -34,6 +34,7 @@ this library being backwards-compatible.
|
||||||
"substring.scrbl"
|
"substring.scrbl"
|
||||||
"syntax.scrbl"
|
"syntax.scrbl"
|
||||||
(lib "lens/private/syntax/stx.scrbl")
|
(lib "lens/private/syntax/stx.scrbl")
|
||||||
|
(lib "lens/private/syntax/srcloc.scrbl")
|
||||||
"set-all.scrbl"
|
"set-all.scrbl"
|
||||||
"zoom.scrbl"
|
"zoom.scrbl"
|
||||||
)
|
)
|
||||||
|
|
|
@ -21,5 +21,6 @@
|
||||||
"substring.rkt"
|
"substring.rkt"
|
||||||
"syntax.rkt"
|
"syntax.rkt"
|
||||||
"syntax/stx.rkt"
|
"syntax/stx.rkt"
|
||||||
|
"syntax/srcloc.rkt"
|
||||||
"set-all.rkt"
|
"set-all.rkt"
|
||||||
"zoom.rkt"
|
"zoom.rkt"
|
||||||
|
|
2
lens-unstable/unstable/lens/syntax/srcloc.rkt
Normal file
2
lens-unstable/unstable/lens/syntax/srcloc.rkt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#lang reprovide
|
||||||
|
lens/private/syntax/srcloc
|
Loading…
Reference in New Issue
Block a user