Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Some correct code that Elsa complains about #164

Closed
DarwinAwardWinner opened this issue Aug 25, 2019 · 3 comments
Closed

Some correct code that Elsa complains about #164

DarwinAwardWinner opened this issue Aug 25, 2019 · 3 comments
Labels

Comments

@DarwinAwardWinner
Copy link
Contributor

DarwinAwardWinner commented Aug 25, 2019

I've tried to pull out all the easily-extracted test cases from my ido-cr+ package and assemble them here. These are all things that should be correct, but Elsa doesn't like them for one reason or another.

; -*- lexical-binding: t -*-

;; This is OK
'message
;; But these are not: reference to free var "message"
#'message
(function message)

;; Elsa thinks the minor mode name is a free var
(define-minor-mode my-own-minor-mode
  "My minor mode")

;; Elsa thinks the macro name and arguments are free variables. I
;; guess it doesn't know about macros at all?
(defmacro my-macro (x) x)

;; Elsa doesn't know minibuffer-depth
(1+ (minibuffer-depth))

(defvar my-custom-var-1
  (or
   (if (memq completing-read-function
             '(ido-completing-read+
               ido-completing-read
               completing-read-ido-ubiquitous
               completing-read-ido
               ido-ubiquitous-completing-read))
       'completing-read-default
     completing-read-function)
   'completing-read-default))

(defun myfun1 (arg) arg)

;; Elsa thinks the argument's type is Unbound
(myfun1 my-custom-var-1)

(let ((my-lex-var nil))
  ;; Elsa thinks `my-lex-var' can only be nil
  (setq my-lex-var t)
  ;; Elsa thinks this conditional is always false because it thinks
  ;; the var is always nil.
  (when my-lex-var
    (message "hello"))
  my-lex-var)

(require 'cl-lib)
;; Elsa clearly knows nothing about cl loop macro
(cl-loop for x from 1 up to 10
         collect x)

;; I guess Elsa doesn't know the types of other cl-lib functions
;; either. Although maybe the problem is that the last line of
;; `cl-set-difference' is a call to `nreverse', which also doesn't
;; have type annotations.
(length (cl-set-difference '(1 2 3) '(1 2 4)))

Runing cask exec elsa on this file gives:

$ cask exec elsa elsa-doesnt-like-these.el
analyzer: updating variable my-custom-var-1, old type nil
elsa-doesnt-like-these.el:6:2:error:Reference to free variable `message'.
elsa-doesnt-like-these.el:7:10:error:Reference to free variable `message'.
elsa-doesnt-like-these.el:10:19:error:Reference to free variable `my-own-minor-mode'.
elsa-doesnt-like-these.el:15:10:error:Reference to free variable `my-macro'.
elsa-doesnt-like-these.el:15:23:error:Reference to free variable `x'.
elsa-doesnt-like-these.el:15:1:notice:Public functions should have a docstring.
elsa-doesnt-like-these.el:18:1:error:Argument 1 accepts type Number | Marker but received Mixed
elsa-doesnt-like-these.el:32:1:notice:Public functions should have a docstring.
elsa-doesnt-like-these.el:35:1:error:Argument 1 accepts type Mixed but received Unbound
elsa-doesnt-like-these.el:39:8:error:Variable my-lex-var expects Nil, got T
elsa-doesnt-like-these.el:42:8:warning:Condition always evaluates to non-nil.
elsa-doesnt-like-these.el:49:9:error:Reference to free variable `for'.
elsa-doesnt-like-these.el:49:13:error:Reference to free variable `x'.
elsa-doesnt-like-these.el:49:15:error:Reference to free variable `from'.
elsa-doesnt-like-these.el:49:22:error:Reference to free variable `up'.
elsa-doesnt-like-these.el:49:25:error:Reference to free variable `to'.
elsa-doesnt-like-these.el:50:9:error:Reference to free variable `collect'.
elsa-doesnt-like-these.el:50:17:error:Reference to free variable `x'.
elsa-doesnt-like-these.el:56:1:error:Argument 1 accepts type Sequence? but received Mixed
@DarwinAwardWinner
Copy link
Contributor Author

If you can point to where these can be fixed, I can take a stab at them.

@Fuco1
Copy link
Member

Fuco1 commented Aug 26, 2019

By the way the type annotations in the file which you updated is only a small selection. If you look into ./dev there is a file with all the defuns from .c files, and we also need to annotate 10k or so elisp functions form the core.

I'm also slowly working on an inference engine which can figure some of it out on its own (theoretically everything should be possible to infer once all the built-ins are annotated).

I'll split this issue into multiple issues to track each one separately, they seem to be quite diverse.

@Fuco1
Copy link
Member

Fuco1 commented Mar 14, 2023

All the issues except the setq and lexical var are solved. The macros are discussed in #196 #205. So I'll close this issue to keep the list clean.

@Fuco1 Fuco1 closed this as completed Mar 14, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants