[project @ 2004-04-21 12:38:20 by simonpj]
authorsimonpj <unknown>
Wed, 21 Apr 2004 12:38:20 +0000 (12:38 +0000)
committersimonpj <unknown>
Wed, 21 Apr 2004 12:38:20 +0000 (12:38 +0000)
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

index 480c64e..8c30abb 100644 (file)
@@ -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}