Make sure we're not suggesting a "_G" version of everything

This commit is contained in:
XeroOl 2025-04-23 21:40:48 -05:00
parent 163ea1fd80
commit 2800038005

View File

@ -32,43 +32,57 @@
seen []] seen []]
(fn add-completion [definition name] (fn add-completion [definition name]
(table.insert results
(doto (format.completion-item-format name definition)
(tset :filterText name)
(tset :textEdit {:newText name : range}))))
(fn add-completion-recursively [definition name]
"add the completion. also recursively adds the fields' completions" "add the completion. also recursively adds the fields' completions"
(when (not (. seen definition)) (when (not (. seen definition))
(set (. seen definition) true) (set (. seen definition) true)
(table.insert results (add-completion definition name)
(doto (format.completion-item-format name definition)
(tset :filterText name)
(tset :textEdit {:newText name : range})))
(when (= (type definition.definition) :string) (when (= (type definition.definition) :string)
(each [key value (pairs (-> (docs.get-global server :string) (. :fields)))] (each [key value (pairs (-> (docs.get-global server :string) (. :fields)))]
(add-completion value (.. name ":" key)))) (add-completion-recursively value (.. name ":" key))))
(when (fennel.table? definition.definition) (when (fennel.table? definition.definition)
(each [field value (pairs definition.definition)] (each [field value (pairs definition.definition)]
(when (= (type field) :string) (when (= (type field) :string)
(case (analyzer.search-ast server definition.file value [] {}) (case (analyzer.search-ast server definition.file value [] {})
def (do def (if (or (= :self (tostring (?. def :metadata :fnl/arglist 1)))
(when (or (?. def :metadata :fnl/arglist) (and (fennel.list? def.definition)
(and (fennel.list? def.definition) ;; TODO check that arg is called `self`
;; TODO check that arg is called `self` (or (and (fennel.sym? (. def.definition 1) "fn")
(or (fennel.sym? (. def.definition 1) "fn") (fennel.sym? (. def.definition 2) "self"))
(fennel.sym? (. def.definition 1) "λ")))) (and (fennel.sym? (. def.definition 1) "λ")
(add-completion def (.. name ":" field))) (fennel.sym? (. def.definition 2) "self")))))
(add-completion def (.. name "." field))) (add-completion-recursively def (.. name ":" field))
(add-completion-recursively def (.. name "." field)))
_ (do _ (do
(io.stderr:write "BAD!!!! undocumented field: " (tostring field) "\n") (io.stderr:write "BAD!!!! undocumented field: " (tostring field) "\n")
{:label field}))))) {:label field})))))
(when definition.fields (when definition.fields
(each [field value (pairs definition.fields)] (each [field value (pairs definition.fields)]
(when (= (type field) :string) (when (= (type field) :string)
(add-completion value (.. name ":" field))))) (if (or (= :self (tostring (?. value :metadata :fnl/arglist 1)))
(and (fennel.list? value.definition)
;; TODO check that arg is called `self`
(or (and (fennel.sym? (. value.definition 1) "fn")
(fennel.sym? (. value.definition 2) "self"))
(and (fennel.sym? (. value.definition 1) "λ")
(fennel.sym? (. value.definition 2) "self")))))
(add-completion-recursively value (.. name ":" field))
(add-completion-recursively value (.. name "." field))))))
(set (. seen definition) false))) (set (. seen definition) false)))
;; end yield ;; end yield
(each [_ global* (ipairs file.allowed-globals)] (each [_ global* (ipairs file.allowed-globals)]
(case (analyzer.search-name-and-scope server file global* scope) (case (analyzer.search-name-and-scope server file global* scope)
def (add-completion def global*) def (if (and (= :_G (tostring global*))
(not (: (tostring ?symbol) :match "_G[:.]")))
(add-completion def global*)
(add-completion-recursively def global*))
_ (do _ (do
(io.stderr:write "BAD!!!! undocumented global: " (tostring global*) "\n") (io.stderr:write "BAD!!!! undocumented global: " (tostring global*) "\n")
{:label global*}))) {:label global*})))
@ -76,18 +90,15 @@
(while scope (while scope
(each [mangling (pairs scope.manglings)] (each [mangling (pairs scope.manglings)]
(case (analyzer.search-name-and-scope server file mangling scope) (case (analyzer.search-name-and-scope server file mangling scope)
def (add-completion def mangling) def (add-completion-recursively def mangling)
_ (do _ (add-completion-recursively {} mangling)))
(io.stderr:write "BAD!!!! undocumented mangling: " (tostring mangling) "\n")
{:label mangling})))
(when in-call-position? (when in-call-position?
(each [macro* (pairs scope.macros)] (each [macro* (pairs scope.macros)]
;; TODO make it work like the other ones
(table.insert results {:label macro* :filterText macro* :textEdit {:newText macro* : range}})) (table.insert results {:label macro* :filterText macro* :textEdit {:newText macro* : range}}))
(each [special (pairs scope.specials)] (each [special (pairs scope.specials)]
(case (analyzer.search-name-and-scope server file special scope) (case (analyzer.search-name-and-scope server file special scope)
def (add-completion def special) def (add-completion-recursively def special)
_ (do _ (do
(io.stderr:write "BAD!!!! undocumented special: " (tostring special) "\n") (io.stderr:write "BAD!!!! undocumented special: " (tostring special) "\n")
{:label special})))) {:label special}))))