Skip to content

Commit b0d783c

Browse files
Merge pull request #31 from VSteveHL/pr/type
try to add type for lambda* and define*
2 parents bb13234 + 13aa459 commit b0d783c

2 files changed

Lines changed: 107 additions & 0 deletions

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
(library (scheme-langserver analysis type substitutions rules define*)
2+
(export define*-process)
3+
(import
4+
(chezscheme)
5+
(ufo-match)
6+
7+
(ufo-try)
8+
(scheme-langserver util cartesian-product)
9+
10+
(scheme-langserver analysis identifier reference)
11+
(scheme-langserver analysis type substitutions util)
12+
13+
(scheme-langserver virtual-file-system index-node)
14+
(scheme-langserver virtual-file-system document))
15+
16+
(define (define*-process document index-node)
17+
(let* ([ann (index-node-datum/annotations index-node)]
18+
[expression (annotation-stripped ann)]
19+
[children (index-node-children index-node)])
20+
(try
21+
(match expression
22+
[(_ ((? symbol? identifiers) parameters ... ) tail)
23+
(let* ([identifier-index-node (car (index-node-children (cadr (index-node-children index-node))))]
24+
[tail-index-node (car (reverse (index-node-children index-node)))]
25+
26+
[parameter-index-nodes (define*-parameter-index-node-extract (cdr (index-node-children (cadr (index-node-children index-node)))) document)]
27+
[parameter-index-nodes-products (construct-parameter-index-nodes-products-with parameter-index-nodes)]
28+
[lambda-details (construct-lambdas-with (list tail-index-node) parameter-index-nodes-products)])
29+
(map
30+
(lambda (t)
31+
(extend-index-node-substitution-list identifier-index-node t))
32+
lambda-details))]
33+
[else '()])
34+
(except c
35+
[else '()]))))
36+
37+
(define (define*-parameter-index-node-extract parameter-index-nodes current-document)
38+
;; for define*, the parameter could be (identifier1 identifier2 ...)
39+
;; and also ((identifier1 value1) identifier2 (identifier3 value3) ...) ,
40+
;; this function is used to get all identifier index-nodes.
41+
(map
42+
(lambda (index-node)
43+
(let* ([ann (index-node-datum/annotations index-node)]
44+
[expression (annotation-stripped ann)])
45+
(match expression
46+
[(? symbol? expression)
47+
index-node]
48+
[((? symbol? param) (? symbol? type))
49+
(map (lambda (id) (extend-index-node-substitution-list (car (index-node-children index-node)) id))
50+
(map root-ancestor (find-available-references-for current-document index-node type)))
51+
(car (index-node-children index-node))])))
52+
parameter-index-nodes))
53+
54+
)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
(library (scheme-langserver analysis type substitutions rules lambda*)
2+
(export lambda*-process)
3+
(import
4+
(chezscheme)
5+
(ufo-match)
6+
7+
(ufo-try)
8+
(scheme-langserver util cartesian-product)
9+
10+
(scheme-langserver analysis identifier reference)
11+
(scheme-langserver analysis type substitutions util)
12+
13+
(scheme-langserver virtual-file-system index-node)
14+
(scheme-langserver virtual-file-system document))
15+
16+
17+
(define (lambda*-process document index-node)
18+
(let* ([ann (index-node-datum/annotations index-node)]
19+
[expression (annotation-stripped ann)]
20+
[children (index-node-children index-node)])
21+
(try
22+
(match expression
23+
[(_ (identifiers ...) fuzzy **1 )
24+
(let* ([return-index-node (car (reverse children))]
25+
26+
;(identifier **1) index-nodes
27+
[parameter-index-nodes (lambda*-parameter-index-node-extract (cadr children) document)]
28+
[parameter-index-nodes-products (construct-parameter-index-nodes-products-with parameter-index-nodes)])
29+
(map
30+
(lambda (t) (extend-index-node-substitution-list index-node t))
31+
(construct-lambdas-with `(,return-index-node) parameter-index-nodes-products)))]
32+
[else '()])
33+
(except c
34+
[else '()]))))
35+
36+
(define (lambda*-parameter-index-node-extract parameter-index-nodes current-document)
37+
;; for lambda*, the parameter could be (identifier1 identifier2 ...)
38+
;; and also ((identifier1 value1) identifier2 (identifier3 value3) ...) ,
39+
;; this function is used to get all identifier index-nodes.
40+
(map
41+
(lambda (index-node)
42+
(let* ([ann (index-node-datum/annotations index-node)]
43+
[expression (annotation-stripped ann)])
44+
(match expression
45+
[(? symbol? expression)
46+
index-node]
47+
[((? symbol? param) (? symbol? type))
48+
(map (lambda (id) (extend-index-node-substitution-list (car (index-node-children index-node)) id))
49+
(map root-ancestor (find-available-references-for current-document index-node type)))
50+
(car (index-node-children index-node))])))
51+
(index-node-children parameter-index-nodes)))
52+
53+
)

0 commit comments

Comments
 (0)