Problem with 'use' Macro in VSCode + ElixirLS

I use Visual Studio Code with the ElixirLS Fork extension.

I am trying out Elixir/Phoenix and when i call the ‘use’ Macro for something like

defmodule TestWeb.MyController
    use TestWeb :controller
...

or

defmodule Test.mySchema
    use Ecto.Schema
...

there is no Autocomplete or Documentation available from the Modules that are imported or aliased in the __using__/1 macro. The Code does work and there are no Errors or Warnings from ElixirLS or Dialyzer.

Importing/Aliasing the needed Modules directly, like

defmodule TestWeb.MyController
    use TestWeb :controller

    import Phoenix.Controller
    import Plug.Conn
    import TestWeb.Gettext
    alias TestWeb.Router.Helpers, as: Routes
...

does provide autocomplete and Documentation in VSCode.
So is ElixirLS not evaluating the __using__ macro for autocomplete? Or is maybe something wrong with my Setup?
And is there a way to make autocomplete work without importing/aliasing the Modules directly?

1 Like

I have never realized an issue with that, as modules are compiled to get their “context”.

Could you please tell us what version of the LS is used?

Recent version of the LS do print this information in the ElixirLS ouptut pane.

It prints language_server 0.3.2 in the output pane.

And on startup it also prints the Elixir/Erlang version if that helps

Started ElixirLS Fork v0.3.2
Elixir version: "1.10.2 (compiled with Erlang/OTP 21)"
Erlang version: "22"

@axelson do you know about any problems like this?

Well that isn’t expected. Are you getting any errors in the ElixirLS Fork output? Also can you try with elixir 1.10.2-otp22 (instead of elixir 1.10.2-otp21).

After installing Elixir 1.10.2-otp22 the log looks like this:

Started ElixirLS Fork v0.3.2
Elixir version: "1.10.2 (compiled with Erlang/OTP 22)"
Erlang version: "22"

but this also doesn’t work.
And i don’t see any errors in the ElixirLS Output.
I also tried a clean install of VSCode, with default Settings and ElixirLS Fork as the only plugin, but with no success.

Have you already tried removing the .elixir_ls directory and restarting your editor? Also what operating system are you on and are you using docker?

Yes, I tried removing the folder and restarting the Editor. I’m on Ubuntu 18.04 LTS, but I also tried it on Windows 10 with the same result.
No, I do not use Docker.

Hmm, ok. Can you post or create a project that suffers from the issue? I haven’t been able to reproduce it on my projects.

I do not have autocompletion/Documentation on any imports/alias from ‘use’ macros.
I noticed it while trying out Phoenix, after creating a new Phoenix (1.4.16) Project with mix phx.new ..
I also made a simple example, created with mix new ., with only 2 .ex files in /lib and without any dependencies here: https://github.com/JanKneiphof/autocomplete_problem

1 Like

Thanks for the reproduction. I’m able to reproduce on my machines. Now just need to dig in.

2 Likes

FYI, we’re tracking this in #193:

Unfortunately I’m not sure there is an easy fix.

2 Likes

Nice, thank you for looking into it.
So now i tried it out with Elixir 1.9.4 and it does work.

1 Like

I just followed the instructions linked in the Github issue : Fix: VSCode + ElixirLS Intellisense for code imported with `use` - Dragosh Mocrii and it works well.

(It is to compile ElixirLS with the local system Elixir install)

3 Likes

I have a similar problem, but for some reason it occurs only with Absinthe: there is no auto-completion or docs on hover for macros like query, field, arg, object.

This issue does not occur for Phoenix macros like pipeline, plug or pipe_through.

Every time I hover on a Absinthe macro, ElixirLS outputs this warnings:

[Warn  - 9:23:43 AM] ** (ErlangError) Erlang error: "ArgumentError during metadata build pre:\ncould not call Module.register_attribute/3 because the module BlogWeb.Schema.AccountTypes is already compiled\nast node: {:use, [end_of_expression: [newlines: 0, line: 2, column: 31], line: 2, column: 3], [{:__aliases__, [last: [line: 2, column: 23], line: 2, column: 7], [:Absinthe, :Schema, :Notation]}]}"
    (elixir 1.14.5) lib/module.ex:2504: Module.assert_not_readonly!/2
    (elixir 1.14.5) lib/module.ex:1626: Module.register_attribute/3
    (absinthe 1.7.5) expanding macro: Absinthe.Schema.Notation.__using__/1
    nofile: BlogWeb.Schema.AccountTypes (module)

What I have tried but without success:

  • Different versions of Elixir and Erlang (even the latest ones)
  • Different versions of Absinthe (1.6.1 and 1.7.5)
  • Removing _build, .elixir_ls folders and reloading the VSCode window
  • Tried the fix from VSCode + ElixirLS Intellisense for code imported with use with elixir-ls 0.16.0 and elixirLS.languageServerOverridePath set
  • Use an older version from ElixirLS VSCode extension
  • Tried with simple code (there is a “Compilation failed” but the same warning on hover is still logged):
defmodule MyApp.Schema.Schema do
  use Absinthe.Schema

  query do
    field :place, :place do
      arg :slug, non_null(:string)
    end
  end
end

@aifrak I opened Metadata build crashes on Absinthe schema · Issue #999 · elixir-lsp/elixir-ls · GitHub for tracking

2 Likes