<div dir="ltr">That's cool, I'd love to have that feature in my editor. Have you seen this:<div><br></div><div><a href="https://hackage.haskell.org/package/halberd">https://hackage.haskell.org/package/halberd</a><br></div><div><br></div><div>The readme says:</div><div><br></div><div>---cut---</div><div><p style="margin:0.8em 0px;padding:0px;color:rgb(0,0,0);font-family:sans-serif;font-size:14.6667px;line-height:20.5333px">Halberd is a tool to help you add missing imports to your Haskell source files. With it, you can write your source without imports, call Halberd, and just paste in the import lines.</p><p style="margin:0.8em 0px;padding:0px;color:rgb(0,0,0);font-family:sans-serif;font-size:14.6667px;line-height:20.5333px">Currently, it tries to automatically choose an import if there is a single sensible option. If it can't, it will prompt you with a simple menu. After running, it prints the imports, which you need to copy manually. Editor integration is planned.</p><p style="margin:0.8em 0px;padding:0px;color:rgb(0,0,0);font-family:sans-serif;font-size:14.6667px;line-height:20.5333px">---cut---</p><p style="margin:0.8em 0px;padding:0px;color:rgb(0,0,0);font-family:sans-serif;font-size:14.6667px;line-height:20.5333px"><br></p><p style="margin:0.8em 0px;padding:0px;color:rgb(0,0,0);font-family:sans-serif;font-size:14.6667px;line-height:20.5333px">I have been thinking of exactly the same problem. That's how found this. I have not tried it yet but this could be a starting point even if its not working perfectly. In the best case you will have to just do the editor integration part.</p></div><div><br></div><div>-harendra</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 18 March 2016 at 23:57, John Williams <span dir="ltr"><<a href="mailto:jrw@pobox.com" target="_blank">jrw@pobox.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr" style="font-size:12.8px">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.<div><br></div><div>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)".</div><div><br></div><div>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.</div><div><br></div><div>Here are some implementation options I'm considering:</div><div><br></div><div>1. Add a ghci command to implement my heuristics directly, since ghc already understands modules, packages and import statements.</div><div>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.</div><div>3. Write a separate tool that reads Haskell imports and duplicates ghc and cabal's name resolution mechanisms.</div><div>4. Write a tool that reads Haskell imports and suggests imports from a list of commonly imported symbols, ignoring which packages are actually visible.</div><div><br></div><div>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.</div><div><br></div><div>Any thoughts?</div></div></div>
<br>_______________________________________________<br>
Glasgow-haskell-users mailing list<br>
<a href="mailto:Glasgow-haskell-users@haskell.org">Glasgow-haskell-users@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users</a><br>
<br></blockquote></div><br></div>