diff options
author | Alan Zimmerman <alan.zimm@gmail.com> | 2017-01-23 20:23:28 +0200 |
---|---|---|
committer | Alan Zimmerman <alan.zimm@gmail.com> | 2017-01-26 15:20:14 +0200 |
commit | 0d1cb1574dd58d1026cac812e2098135823fa419 (patch) | |
tree | 2c7955bc45a085cf54bab5c7204f9ebd24686adf /compiler/rename/RnNames.hs | |
parent | ff9355e48d0cb04b3adf26e27e12e128f79618f4 (diff) | |
download | haskell-0d1cb1574dd58d1026cac812e2098135823fa419.tar.gz |
Make type import/export API Annotation friendly
Summary:
At the moment an export of the form
type C(..)
is parsed by the rule
```
| 'type' oqtycon {% amms (mkTypeImpExp (sLL $1 $> (unLoc $2)))
[mj AnnType $1,mj AnnVal $2] }
```
This means that the origiinal oqtycon loses its location which is then retained
in the AnnVal annotation.
The problem is if the oqtycon has its own annotations, these get lost.
e.g. in
type (?)(..)
the parens annotations for (?) get lost.
This patch adds a wrapper around the name in the IE type to
(a) provide a distinct location for the adornment annotation and
(b) identify the specific adornment, for use in the pretty printer rather than
occName magic.
Updates haddock submodule
Test Plan: ./validate
Reviewers: mpickering, dfeuer, bgamari, austin
Reviewed By: dfeuer
Subscribers: dfeuer, thomie, mpickering
Differential Revision: https://phabricator.haskell.org/D3016
GHC Trac Issues: #13163
Diffstat (limited to 'compiler/rename/RnNames.hs')
-rw-r--r-- | compiler/rename/RnNames.hs | 108 |
1 files changed, 71 insertions, 37 deletions
diff --git a/compiler/rename/RnNames.hs b/compiler/rename/RnNames.hs index 9d2de7439e..2cde294678 100644 --- a/compiler/rename/RnNames.hs +++ b/compiler/rename/RnNames.hs @@ -873,18 +873,19 @@ filterImports iface decl_spec (Just (want_hiding, L l import_items)) lookup_ie ie = handle_bad_import $ do case ie of IEVar (L l n) -> do - (name, avail, _) <- lookup_name n - return ([(IEVar (L l name), trimAvail avail name)], []) + (name, avail, _) <- lookup_name $ ieWrappedName n + return ([(IEVar (L l (replaceWrappedName n name)), + trimAvail avail name)], []) IEThingAll (L l tc) -> do - (name, avail, mb_parent) <- lookup_name tc + (name, avail, mb_parent) <- lookup_name $ ieWrappedName tc let warns = case avail of Avail {} -- e.g. f(..) - -> [DodgyImport tc] + -> [DodgyImport $ ieWrappedName tc] AvailTC _ subs fs | null (drop 1 subs) && null fs -- e.g. T(..) where T is a synonym - -> [DodgyImport tc] + -> [DodgyImport $ ieWrappedName tc] | not (is_qual decl_spec) -- e.g. import M( T(..) ) -> [MissingImportList] @@ -892,7 +893,7 @@ filterImports iface decl_spec (Just (want_hiding, L l import_items)) | otherwise -> [] - renamed_ie = IEThingAll (L l name) + renamed_ie = IEThingAll (L l (replaceWrappedName tc name)) sub_avails = case avail of Avail {} -> [] AvailTC name2 subs fs -> [(renamed_ie, AvailTC name2 (subs \\ [name]) fs)] @@ -902,23 +903,26 @@ filterImports iface decl_spec (Just (want_hiding, L l import_items)) Just parent -> return ((renamed_ie, AvailTC parent [name] []) : sub_avails, warns) -- associated type - IEThingAbs (L l tc) + IEThingAbs (L l tc') | want_hiding -- hiding ( C ) -- Here the 'C' can be a data constructor -- *or* a type/class, or even both - -> let tc_name = lookup_name tc + -> let tc = ieWrappedName tc' + tc_name = lookup_name tc dc_name = lookup_name (setRdrNameSpace tc srcDataName) in case catIELookupM [ tc_name, dc_name ] of [] -> failLookupWith BadImport - names -> return ([mkIEThingAbs l name | name <- names], []) + names -> return ([mkIEThingAbs tc' l name | name <- names], []) | otherwise - -> do nameAvail <- lookup_name tc - return ([mkIEThingAbs l nameAvail], []) + -> do nameAvail <- lookup_name (ieWrappedName tc') + return ([mkIEThingAbs tc' l nameAvail] + , []) - IEThingWith (L l rdr_tc) wc rdr_ns rdr_fs -> + IEThingWith (L l rdr_tc) wc rdr_ns' rdr_fs -> ASSERT2(null rdr_fs, ppr rdr_fs) do - (name, AvailTC _ ns subflds, mb_parent) <- lookup_name rdr_tc + (name, AvailTC _ ns subflds, mb_parent) + <- lookup_name (ieWrappedName rdr_tc) -- Look up the children in the sub-names of the parent let subnames = case ns of -- The tc is first in ns, @@ -926,32 +930,41 @@ filterImports iface decl_spec (Just (want_hiding, L l import_items)) -- See the AvailTC Invariant in Avail.hs (n1:ns1) | n1 == name -> ns1 | otherwise -> ns + rdr_ns = map ieLWrappedName rdr_ns' case lookupChildren (map Left subnames ++ map Right subflds) rdr_ns of Nothing -> failLookupWith BadImport Just (childnames, childflds) -> case mb_parent of -- non-associated ty/cls Nothing - -> return ([(IEThingWith (L l name) wc childnames childflds, + -> return ([(IEThingWith (L l name') wc childnames' + childflds, AvailTC name (name:map unLoc childnames) (map unLoc childflds))], []) + where name' = replaceWrappedName rdr_tc name + childnames' = map to_ie_post_rn childnames + -- childnames' = postrn_ies childnames -- associated ty Just parent - -> return ([(IEThingWith (L l name) wc childnames childflds, + -> return ([(IEThingWith (L l name') wc childnames' + childflds, AvailTC name (map unLoc childnames) (map unLoc childflds)), - (IEThingWith (L l name) wc childnames childflds, + (IEThingWith (L l name') wc childnames' + childflds, AvailTC parent [name] [])], []) + where name' = replaceWrappedName rdr_tc name + childnames' = map to_ie_post_rn childnames _other -> failLookupWith IllegalImport -- could be IEModuleContents, IEGroup, IEDoc, IEDocNamed -- all errors. where - mkIEThingAbs l (n, av, Nothing ) = (IEThingAbs (L l n), - trimAvail av n) - mkIEThingAbs l (n, _, Just parent) = (IEThingAbs (L l n), - AvailTC parent [n] []) + mkIEThingAbs tc l (n, av, Nothing ) + = (IEThingAbs (L l (replaceWrappedName tc n)), trimAvail av n) + mkIEThingAbs tc l (n, _, Just parent) + = (IEThingAbs (L l (replaceWrappedName tc n)), AvailTC parent [n] []) handle_bad_import m = catchIELookup m $ \err -> case err of BadImport | want_hiding -> return ([], [BadImportW]) @@ -995,7 +1008,7 @@ gresFromIE decl_spec (L loc ie, avail) = gresFromAvail prov_fn avail where is_explicit = case ie of - IEThingAll (L _ name) -> \n -> n == name + IEThingAll (L _ name) -> \n -> n == ieWrappedName name _ -> \_ -> True prov_fn name = Just (ImpSpec { is_decl = decl_spec, is_item = item_spec }) @@ -1251,15 +1264,19 @@ findImportUsage imports used_gres _other -> emptyNameSet -- No explicit import list => no unused-name list add_unused :: IE Name -> NameSet -> NameSet - add_unused (IEVar (L _ n)) acc = add_unused_name n acc - add_unused (IEThingAbs (L _ n)) acc = add_unused_name n acc - add_unused (IEThingAll (L _ n)) acc = add_unused_all n acc + add_unused (IEVar (L _ n)) acc + = add_unused_name (ieWrappedName n) acc + add_unused (IEThingAbs (L _ n)) acc + = add_unused_name (ieWrappedName n) acc + add_unused (IEThingAll (L _ n)) acc + = add_unused_all (ieWrappedName n) acc add_unused (IEThingWith (L _ p) wc ns fs) acc = - add_wc_all (add_unused_with p xs acc) - where xs = map unLoc ns ++ map (flSelector . unLoc) fs + add_wc_all (add_unused_with (ieWrappedName p) xs acc) + where xs = map (ieWrappedName . unLoc) ns + ++ map (flSelector . unLoc) fs add_wc_all = case wc of NoIEWildcard -> id - IEWildcard _ -> add_unused_all p + IEWildcard _ -> add_unused_all (ieWrappedName p) add_unused _ acc = acc add_unused_name n acc @@ -1394,24 +1411,29 @@ printMinimalImports imports_w_usage -- we want to say "T(..)", but if we're importing only a subset we want -- to say "T(A,B,C)". So we have to find out what the module exports. to_ie _ (Avail n) - = [IEVar (noLoc n)] + = [IEVar (to_ie_post_rn $ noLoc n)] to_ie _ (AvailTC n [m] []) - | n==m = [IEThingAbs (noLoc n)] + | n==m = [IEThingAbs (to_ie_post_rn $ noLoc n)] to_ie iface (AvailTC n ns fs) = case [(xs,gs) | AvailTC x xs gs <- mi_exports iface , x == n , x `elem` xs -- Note [Partial export] ] of - [xs] | all_used xs -> [IEThingAll (noLoc n)] - | otherwise -> [IEThingWith (noLoc n) NoIEWildcard - (map noLoc (filter (/= n) ns)) - (map noLoc fs)] + [xs] | all_used xs -> [IEThingAll (to_ie_post_rn $ noLoc n)] + | otherwise -> + [IEThingWith (to_ie_post_rn $ noLoc n) NoIEWildcard + (map (to_ie_post_rn . noLoc) (filter (/= n) ns)) + (map noLoc fs)] -- Note [Overloaded field import] _other | all_non_overloaded fs - -> map (IEVar . noLoc) $ ns ++ map flSelector fs - | otherwise -> [IEThingWith (noLoc n) NoIEWildcard - (map noLoc (filter (/= n) ns)) (map noLoc fs)] + -> map (IEVar . to_ie_post_rn_var . noLoc) $ ns + ++ map flSelector fs + | otherwise -> + [IEThingWith (to_ie_post_rn $ noLoc n) NoIEWildcard + (map (to_ie_post_rn . noLoc) (filter (/= n) ns)) + (map noLoc fs)] where + fld_lbls = map flLabel fs all_used (avail_occs, avail_flds) @@ -1420,6 +1442,18 @@ printMinimalImports imports_w_usage all_non_overloaded = all (not . flIsOverloaded) +to_ie_post_rn_var :: (HasOccName name) => Located name -> LIEWrappedName name +to_ie_post_rn_var (L l n) + | isDataOcc $ occName n = L l (IEPattern (L l n)) + | otherwise = L l (IEName (L l n)) + + +to_ie_post_rn :: (HasOccName name) => Located name -> LIEWrappedName name +to_ie_post_rn (L l n) + | isTcOcc occ && isSymOcc occ = L l (IEType (L l n)) + | otherwise = L l (IEName (L l n)) + where occ = occName n + {- Note [Partial export] ~~~~~~~~~~~~~~~~~~~~~ @@ -1528,7 +1562,7 @@ dodgyImportWarn item = dodgyMsg (text "import") item dodgyMsg :: (OutputableBndr n, HasOccName n) => SDoc -> n -> SDoc dodgyMsg kind tc = sep [ text "The" <+> kind <+> ptext (sLit "item") - <+> quotes (ppr (IEThingAll (noLoc tc))) + <+> quotes (ppr (IEThingAll (noLoc (IEName $ noLoc tc)))) <+> text "suggests that", quotes (ppr tc) <+> text "has (in-scope) constructors or class methods,", text "but it has none" ] |