Elixir could suggest functions in other modules

When Elixir doesn’t recognize a variable name, it tries to make helpful suggestions. It could also make suggestions when a program tries to use a function that isn’t available.

For example, when the user tries to run List.join/2, Elixir could suggest Enum.join/2. (I’d submit this as an Issue on GitHub, but I don’t know where it should go. :-})

-r

3 Likes

The relevant function clause appears fo be Exception.message/4 on line 925: defp message(:"function not exported", module, function, arity) do ...

That’s the type of suggestion it will probably never be able to give. The existing suggestions just iterate through all variables or all function names and compare what you wrote in your code with what’s available. So it’s a simple similarity check of strings.

Knowing that List.join should be Enum.join on the other hand requires a whole lot of extra knowledge about elixir – even knowing that List might correspond to Enum in the first place. As most Enum functions return lists it does fit quite well as suggestion for List, but what about other modules of enumerable types like Map or Tuple. For Map.map/2 I’d expect different behaviour as Enum.map, as it should return a map not a list. The proper suggestion would imho rather be Map,new/2, which takes an enumerable (so also a map), maps over it and returns a map. Or e.g. Tuple.filter/2: Even though there’s a Enum function of that name filterering doesn’t make very much sense for tuples, which are meant to be fixed-size containers of data. Even List.group_by doesn’t fit Enum.group_by very well, as it’s one of the few Enum functions not to return a list, but a map of data.

1 Like