GhcPlugins: Fix lookup of TH names
authorBen Gamari <ben@smart-cactus.org>
Sat, 19 Jan 2019 18:59:18 +0000 (13:59 -0500)
committerBen Gamari <ben@smart-cactus.org>
Sun, 27 Jan 2019 13:32:12 +0000 (08:32 -0500)
Previously `thNameToGhcName` was calling `lookupOrigNameCache` directly, which
failed to handle the case that the name wasn't already in the name cache. This
happens, for instance, when the name was in scope in a plugin being used during
compilation but not in scope in the module being compiled. In this case we the
interface file containing the name won't be loaded and `lookupOrigNameCache`
fails. This was the cause of #16104.

The solution is simple: use the nicely packaged `lookupOrigIO` instead.

compiler/main/GhcPlugins.hs

index 3e0facf..5649237 100644 (file)
@@ -87,7 +87,7 @@ import Unique           ( Unique, Uniquable(..) )
 import FastString
 import Data.Maybe
 
-import NameCache (lookupOrigNameCache)
+import IfaceEnv         ( lookupOrigIO )
 import GhcPrelude
 import MonadUtils       ( mapMaybeM )
 import Convert          ( thRdrNameGuesses )
@@ -127,6 +127,6 @@ thNameToGhcName th_name
       | Just n <- isExact_maybe rdr_name   -- This happens in derived code
       = return $ if isExternalName n then Just n else Nothing
       | Just (rdr_mod, rdr_occ) <- isOrig_maybe rdr_name
-      = do { cache <- getOrigNameCache
-           ; return $ lookupOrigNameCache cache rdr_mod rdr_occ }
+      = do { hsc_env <- getHscEnv
+           ; Just <$> liftIO (lookupOrigIO hsc_env rdr_mod rdr_occ) }
       | otherwise = return Nothing