From 2c27ee79158bccc16c0c817de00e737d304836cf Mon Sep 17 00:00:00 2001 From: simonpj Date: Wed, 21 Apr 2004 12:38:20 +0000 Subject: [PATCH] [project @ 2004-04-21 12:38:20 by simonpj] In Template Haskell suppport dyn "M.x" to mean "look up the qualified name M.x in the environment", which is what you'd expect. George Russel wanted this. --- ghc/compiler/hsSyn/Convert.lhs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/ghc/compiler/hsSyn/Convert.lhs b/ghc/compiler/hsSyn/Convert.lhs index 480c64e..8c30abb 100644 --- a/ghc/compiler/hsSyn/Convert.lhs +++ b/ghc/compiler/hsSyn/Convert.lhs @@ -395,7 +395,7 @@ thRdrName :: OccName.NameSpace -> TH.Name -> RdrName -- "x_77" etc, but that could conceivably clash.) thRdrName ns (TH.Name occ (TH.NameG ns' mod)) = mkOrig (mk_mod mod) (mk_occ ns occ) -thRdrName ns (TH.Name occ TH.NameS) = mkRdrUnqual (mk_occ ns occ) +thRdrName ns (TH.Name occ TH.NameS) = mkDynName ns occ thRdrName ns (TH.Name occ (TH.NameU uniq)) = nameRdrName (mkInternalName (mk_uniq uniq) (mk_occ ns occ) noSrcLoc) mk_uniq :: Int# -> Unique @@ -407,5 +407,22 @@ mk_occ ns occ = OccName.mkOccFS ns (mkFastString (TH.occString occ)) mk_mod :: TH.ModName -> ModuleName mk_mod mod = mkModuleName (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 = mkModuleName mod \end{code} -- 1.7.10.4