From f7eb0063d358cda7f647e4be5997996aae897e5d Mon Sep 17 00:00:00 2001 From: VSteveHL Date: Fri, 29 Aug 2025 16:23:33 +0800 Subject: [PATCH 1/2] try to add type for lambda* try to add type define* for process --- analysis/type/substitutions/rules/define*.sls | 52 +++++++++++++++++++ analysis/type/substitutions/rules/lambda*.sls | 51 ++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 analysis/type/substitutions/rules/define*.sls create mode 100644 analysis/type/substitutions/rules/lambda*.sls diff --git a/analysis/type/substitutions/rules/define*.sls b/analysis/type/substitutions/rules/define*.sls new file mode 100644 index 0000000..1957648 --- /dev/null +++ b/analysis/type/substitutions/rules/define*.sls @@ -0,0 +1,52 @@ +(library (scheme-langserver analysis type substitutions rules define*) + (export define*-process) + (import + (chezscheme) + (ufo-match) + + (ufo-try) + (scheme-langserver util cartesian-product) + + (scheme-langserver analysis identifier reference) + (scheme-langserver analysis type substitutions util) + + (scheme-langserver virtual-file-system index-node) + (scheme-langserver virtual-file-system document)) + +(define (define*-process document index-node) + (let* ([ann (index-node-datum/annotations index-node)] + [expression (annotation-stripped ann)] + [children (index-node-children index-node)]) + (try + (match expression + [(_ ((? symbol? identifiers) parameters ... ) tail) + (let* ([identifier-index-node (car (index-node-children (cadr (index-node-children index-node))))] + [tail-index-node (car (reverse (index-node-children index-node)))] + + [parameter-index-nodes (define*-parameter-index-node-extract (cdr (index-node-children (cadr (index-node-children index-node)))))] + [parameter-index-nodes-products (construct-parameter-index-nodes-products-with parameter-index-nodes)] + [lambda-details (construct-lambdas-with (list tail-index-node) parameter-index-nodes-products)]) + (map + (lambda (t) + (extend-index-node-substitution-list identifier-index-node t)) + lambda-details))] + [else '()]) + (except c + [else '()])))) + +(define (define*-parameter-index-node-extract parameter-index-nodes) + ;; for define*, the parameter could be (identifier1 identifier2 ...) + ;; and also ((identifier1 value1) identifier2 (identifier3 value3) ...) , + ;; this function is used to get all identifier index-nodes. + (map + (lambda (index-node) + (let ([ann (index-node-datum/annotations index-node)] + [expression (annotation-stripped ann)]) + (match expression + [(? symbol? expression) + index-node] + [(? pair? expression) + (car (index-node-children index-node))]))) + parameter-index-nodes)) + +) \ No newline at end of file diff --git a/analysis/type/substitutions/rules/lambda*.sls b/analysis/type/substitutions/rules/lambda*.sls new file mode 100644 index 0000000..fcf3f0d --- /dev/null +++ b/analysis/type/substitutions/rules/lambda*.sls @@ -0,0 +1,51 @@ +(library (scheme-langserver analysis type substitutions rules lambda*) + (export lambda*-process) + (import + (chezscheme) + (ufo-match) + + (ufo-try) + (scheme-langserver util cartesian-product) + + (scheme-langserver analysis identifier reference) + (scheme-langserver analysis type substitutions util) + + (scheme-langserver virtual-file-system index-node) + (scheme-langserver virtual-file-system document)) + + +(define (lambda*-process document index-node) + (let* ([ann (index-node-datum/annotations index-node)] + [expression (annotation-stripped ann)] + [children (index-node-children index-node)]) + (try + (match expression + [(_ (identifiers ...) fuzzy **1 ) + (let* ([return-index-node (car (reverse children))] + + ;(identifier **1) index-nodes + [parameter-index-nodes (lambda*-parameter-index-node-extract (cadr children))] + [parameter-index-nodes-products (construct-parameter-index-nodes-products-with parameter-index-nodes)]) + (map + (lambda (t) (extend-index-node-substitution-list index-node t)) + (construct-lambdas-with `(,return-index-node) parameter-index-nodes-products)))] + [else '()]) + (except c + [else '()])))) + +(define (lambda*-parameter-index-node-extract parameter-index-nodes) + ;; for lambda*, the parameter could be (identifier1 identifier2 ...) + ;; and also ((identifier1 value1) identifier2 (identifier3 value3) ...) , + ;; this function is used to get all identifier index-nodes. + (map + (lambda (index-node) + (let ([ann (index-node-datum/annotations index-node)] + [expression (annotation-stripped ann)]) + (match expression + [(? symbol? expression) + index-node] + [(? pair? expression) + (car (index-node-children index-node))]))) + (index-node-children parameter-index-nodes))) + +) From 13aa45998c5d7b74fc41f4072c91685865814174 Mon Sep 17 00:00:00 2001 From: VSteveHL Date: Fri, 5 Sep 2025 16:46:51 +0800 Subject: [PATCH 2/2] change the logic of parameter-index-node-extract for define* and lambda* --- analysis/type/substitutions/rules/define*.sls | 10 ++++++---- analysis/type/substitutions/rules/lambda*.sls | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/analysis/type/substitutions/rules/define*.sls b/analysis/type/substitutions/rules/define*.sls index 1957648..2552883 100644 --- a/analysis/type/substitutions/rules/define*.sls +++ b/analysis/type/substitutions/rules/define*.sls @@ -23,7 +23,7 @@ (let* ([identifier-index-node (car (index-node-children (cadr (index-node-children index-node))))] [tail-index-node (car (reverse (index-node-children index-node)))] - [parameter-index-nodes (define*-parameter-index-node-extract (cdr (index-node-children (cadr (index-node-children index-node)))))] + [parameter-index-nodes (define*-parameter-index-node-extract (cdr (index-node-children (cadr (index-node-children index-node)))) document)] [parameter-index-nodes-products (construct-parameter-index-nodes-products-with parameter-index-nodes)] [lambda-details (construct-lambdas-with (list tail-index-node) parameter-index-nodes-products)]) (map @@ -34,18 +34,20 @@ (except c [else '()])))) -(define (define*-parameter-index-node-extract parameter-index-nodes) +(define (define*-parameter-index-node-extract parameter-index-nodes current-document) ;; for define*, the parameter could be (identifier1 identifier2 ...) ;; and also ((identifier1 value1) identifier2 (identifier3 value3) ...) , ;; this function is used to get all identifier index-nodes. (map (lambda (index-node) - (let ([ann (index-node-datum/annotations index-node)] + (let* ([ann (index-node-datum/annotations index-node)] [expression (annotation-stripped ann)]) (match expression [(? symbol? expression) index-node] - [(? pair? expression) + [((? symbol? param) (? symbol? type)) + (map (lambda (id) (extend-index-node-substitution-list (car (index-node-children index-node)) id)) + (map root-ancestor (find-available-references-for current-document index-node type))) (car (index-node-children index-node))]))) parameter-index-nodes)) diff --git a/analysis/type/substitutions/rules/lambda*.sls b/analysis/type/substitutions/rules/lambda*.sls index fcf3f0d..f034977 100644 --- a/analysis/type/substitutions/rules/lambda*.sls +++ b/analysis/type/substitutions/rules/lambda*.sls @@ -24,7 +24,7 @@ (let* ([return-index-node (car (reverse children))] ;(identifier **1) index-nodes - [parameter-index-nodes (lambda*-parameter-index-node-extract (cadr children))] + [parameter-index-nodes (lambda*-parameter-index-node-extract (cadr children) document)] [parameter-index-nodes-products (construct-parameter-index-nodes-products-with parameter-index-nodes)]) (map (lambda (t) (extend-index-node-substitution-list index-node t)) @@ -33,18 +33,20 @@ (except c [else '()])))) -(define (lambda*-parameter-index-node-extract parameter-index-nodes) +(define (lambda*-parameter-index-node-extract parameter-index-nodes current-document) ;; for lambda*, the parameter could be (identifier1 identifier2 ...) ;; and also ((identifier1 value1) identifier2 (identifier3 value3) ...) , ;; this function is used to get all identifier index-nodes. (map (lambda (index-node) - (let ([ann (index-node-datum/annotations index-node)] + (let* ([ann (index-node-datum/annotations index-node)] [expression (annotation-stripped ann)]) (match expression [(? symbol? expression) index-node] - [(? pair? expression) + [((? symbol? param) (? symbol? type)) + (map (lambda (id) (extend-index-node-substitution-list (car (index-node-children index-node)) id)) + (map root-ancestor (find-available-references-for current-document index-node type))) (car (index-node-children index-node))]))) (index-node-children parameter-index-nodes)))