idea: tool to suggest adding imports

Evan Laforge qdunkan at gmail.com
Fri Mar 18 22:51:48 UTC 2016


I did this about 5 or 6 years ago for vim, and I'm so used to it I
wouldn't want to live without it.  So I definitely recommend just
doing it.  It was surprisingly easy to implement, it only took a few
hours, and then a day or so to refine the details.

I used haskell-src-exts for parsing and ghc-pkg for all visible
modules.  By far the slowest part is haskell-src-exts.  I have some
basic local preferences to resolve name clashes, and with that using
the global package list has never been much of a problem.  If it were
I could use a local sandbox.

I don't have any fancy suggestion list, just pick the most likely.  I
edit the import by hand if it was wrong, which is rare enough that I
don't mind.

On Fri, Mar 18, 2016 at 11:27 AM, John Williams <jrw at pobox.com> wrote:
> I have an idea for a tool I'd like to implement, and I'm looking for advice
> on the best way to do it.
>
> Ideally, I want to write an Emacs extension where, if I'm editing Haskell
> code and I try to use a symbol that's not defined or imported, it will try
> to automatically add an appropriate import for the symbol. If instance, if I
> have "import Data.Maybe (isNothing)" in my module, and I try to call
> "isJust", the extension would automatically change the import to "import
> Data.Maybe (isJust, isNothing)".
>
> The Emacs part is easy, but the Haskell part has me kind of lost. Basically
> I want to figure out how to heuristically resolve a name, using an existing
> set of imports as hints and constraints. The main heuristic I'd like to
> implement is that, if some symbols are imported from a module M, consider
> importing additional symbols from M. A more advanced heuristic might suggest
> that if a symbol is exported from a module M in a visible package P, the
> symbol should be imported from M. Finally, if a symbol is exported by a
> module in the Haskell platform, I'd like to suggest adding the relevant
> package as a dependency in the .cabal and/or stack.yaml file, and adding an
> import for it in the .hs file.
>
> Here are some implementation options I'm considering:
>
> 1. Add a ghci command to implement my heuristics directly, since ghc already
> understands modules, packages and import statements.
> 2. Load a modified version of the source file into ghci where imports like
> "import M (...)" are replaced with "import M", and parse the error messages
> about ambiguous symbols.
> 3. Write a separate tool that reads Haskell imports and duplicates ghc and
> cabal's name resolution mechanisms.
> 4. Write a tool that reads Haskell imports and suggests imports from a list
> of commonly imported symbols, ignoring which packages are actually visible.
>
> Right now the options that look best to me are 2 and 4, because the don't
> require me to understand or duplicate big parts of ghc, but if modifying ghc
> isn't actually that hard, then maybe 1 is the way to go. Option 3 might be a
> good way to go if there are libraries I can use to do the hard work for me.
>
> Any thoughts?
>
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users
>


More information about the Glasgow-haskell-users mailing list