thRdrName :: OccName.NameSpace -> TH.Name -> RdrName
-- This turns a Name into a RdrName
-thRdrName ns (TH.Name occ (TH.NameG ns' mod)) = mkOrig (mk_mod mod) (mk_occ ns occ)
-thRdrName ns (TH.Name occ TH.NameS) = mkDynName ns occ
+thRdrName ns (TH.Name occ TH.NameS) = mkRdrUnqual (mk_occ ns occ)
+thRdrName ns (TH.Name occ (TH.NameQ mod)) = mkRdrQual (mk_mod mod) (mk_occ ns occ)
+thRdrName ns (TH.Name occ (TH.NameG ns' mod)) = mkOrig (mk_mod mod) (mk_occ ns occ)
thRdrName ns (TH.Name occ (TH.NameU uniq))
= mkRdrUnqual (OccName.mkOccName ns uniq_str)
where
mk_mod :: TH.ModName -> Module
mk_mod mod = mkModule (TH.modString mod)
-
-mkDynName :: OccName.NameSpace -> TH.OccName -> RdrName
--- Parse the string to see if it has a "." in it
--- so we know whether to generate a qualified or unqualified name
--- It's a bit tricky because we need to parse
--- Foo.Baz.x as Qual Foo.Baz x
--- So we parse it from back to front
-
-mkDynName ns th_occ
- = split [] (reverse (TH.occString th_occ))
- where
- split occ [] = mkRdrUnqual (mk_occ occ)
- split occ ('.':rev) = mkRdrQual (mk_mod (reverse rev)) (mk_occ occ)
- split occ (c:rev) = split (c:occ) rev
-
- mk_occ occ = OccName.mkOccFS ns (mkFastString occ)
- mk_mod mod = mkModule mod
\end{code}
import Convert ( convertToHsExpr, convertToHsDecls, convertToHsType )
import RnExpr ( rnLExpr )
import RnEnv ( lookupFixityRn, lookupSrcOcc_maybe )
-import RdrName ( RdrName, mkRdrUnqual, lookupLocalRdrEnv )
+import RdrName ( RdrName, mkRdrQual, mkRdrUnqual, lookupLocalRdrEnv )
import RnTypes ( rnLHsType )
import TcExpr ( tcCheckRho, tcMonoExpr )
import TcHsSyn ( mkHsLet, zonkTopLExpr )
TH.TcClsName -> tcClsName
TH.VarName -> varName
-lookupThName th_name@(TH.Name occ TH.NameS)
- = do { let rdr_name = mkRdrUnqual (OccName.mkOccFS ns occ_fs)
+lookupThName (TH.Name occ (TH.NameU uniq))
+ = return (mkInternalName (mk_uniq uniq) (OccName.mkOccFS bogus_ns occ_fs) noSrcLoc)
+ where
+ occ_fs = mkFastString (TH.occString occ)
+ bogus_ns = OccName.varName -- Not yet recorded in the TH name
+ -- but only the unique matters
+
+lookupThName th_name@(TH.Name occ flavour) -- NameS or NameQ
+ = do { let occ = OccName.mkOccFS ns occ_fs
+ rdr_name = case flavour of
+ TH.NameS -> mkRdrUnqual occ
+ TH.NameQ m -> mkRdrQual (mkModule (TH.modString m)) occ
; rdr_env <- getLocalRdrEnv
; case lookupLocalRdrEnv rdr_env rdr_name of
Just name -> return name
| otherwise = OccName.varName
occ_fs = mkFastString (TH.occString occ)
-lookupThName (TH.Name occ (TH.NameU uniq))
- = return (mkInternalName (mk_uniq uniq) (OccName.mkOccFS bogus_ns occ_fs) noSrcLoc)
- where
- occ_fs = mkFastString (TH.occString occ)
- bogus_ns = OccName.varName -- Not yet recorded in the TH name
- -- but only the unique matters
-
tcLookupTh :: Name -> TcM TcTyThing
-- This is a specialised version of TcEnv.tcLookup; specialised mainly in that
-- it gives a reify-related error message on failure, whereas in the normal