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+ )
0 commit comments