Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions doc-trace.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"service/definition.rkt"
"service/diagnostic.rkt"
"service/declaration.rkt"
"service/project-references.rkt"
"service/highlight.rkt")

(define build-trace%
Expand All @@ -21,6 +22,7 @@
(define definitions (new definition% [src src]))
(define diag (new diag% [src src] [doc-text doc-text]))
(define decls (new declaration%))
(define project-references (new project-references% [src src]))
(define semantic-tokens (new highlight% [src src] [doc-text doc-text]))

(define services
Expand Down Expand Up @@ -67,6 +69,7 @@
(define/public (get-definitions) (send definitions get))
(define/public (get-quickfixs) (cadr (send diag get)))
(define/public (get-semantic-tokens) (send semantic-tokens get))
(define/public (get-nonlocal-references uri symbol) (find-nonlocal-references uri symbol))

;; Overrides
(define/override (syncheck:find-source-object stx)
Expand Down
3 changes: 2 additions & 1 deletion service/declaration.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@
(define/override (syncheck:add-jump-to-definition _src-obj start end id filename _submods)
(define decl (Decl filename id 0 0))
;; NOTE start <= end. In some situations, it may be that start = end.
(interval-map-set! sym-bindings start (if (= start end) (add1 end) end) decl))
(define end- (if (= start end) (add1 end) end))
(interval-map-set! sym-bindings start end- decl))

(define/override (syncheck:add-arrow/name-dup _start-src-obj start-left start-right
_end-src-obj end-left end-right
Expand Down
41 changes: 41 additions & 0 deletions service/project-references.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#lang racket/base

(require "interface.rkt"
"../struct.rkt"
racket/class
racket/set
racket/file
racket/path
drracket/check-syntax)

(provide project-references%
find-nonlocal-references)

(define (project-files)
(define files (mutable-set))

;; FIXME: use loaded sufficies
;; FIXME: use workspace folders
(for ([path (find-files (lambda (path) (path-has-extension? path #".rkt")) (current-directory))])
(set-add! files (path->complete-path path)))

files)

(define projectwise-references (make-hash))
(define (find-nonlocal-references uri symbol)
(hash-ref projectwise-references (list uri symbol)))

(define project-references%
(class base-service%
(init-field src)
(super-new)

(define/override (syncheck:add-jump-to-definition _src-obj start end id filename _submods)
;; NOTE start <= end. In some situations, it may be that start = end.
(define end- (if (= start end) (add1 end) end))
(when (set-member? (project-files) filename)
(println "Reference to other file!")
(hash-update! projectwise-references
(list filename id)
(lambda (refs) (set-add refs (list src start end-)))
(set))))))
5 changes: 4 additions & 1 deletion text-document.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -404,10 +404,13 @@

(define doc-decls (send doc-trace get-sym-decls))
(match-define (Decl req? id left right) decl)

(define nonlocal-refs (send doc-trace get-nonlocal-references uri id))

(define-values (bind-start bind-end bindings)
(interval-map-ref/bounds doc-decls left #f))
(if bindings
(for/list ([range (in-set bindings)])
(for/list ([range (in-set (set-union bindings nonlocal-refs))])
(start/end->range doc (car range) (cdr range)))
empty))))

Expand Down
3 changes: 2 additions & 1 deletion workspace.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
didChangeWorkspaceFolders
didChangeWatchedFiles
didChangeConfiguration
update-configuration)
update-configuration
workspace-folders)
(require compiler/module-suffix)
(require "json-util.rkt"
"doc.rkt"
Expand Down
Loading