diff options
Diffstat (limited to 'compiler/GHC/Hs/Utils.hs')
-rw-r--r-- | compiler/GHC/Hs/Utils.hs | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/compiler/GHC/Hs/Utils.hs b/compiler/GHC/Hs/Utils.hs index 8252d91249..da55ebf89e 100644 --- a/compiler/GHC/Hs/Utils.hs +++ b/compiler/GHC/Hs/Utils.hs @@ -1259,29 +1259,36 @@ hsConDeclsBinders cons in case unLoc r of -- remove only the first occurrence of any seen field in order to -- avoid circumventing detection of duplicate fields (#9156) - ConDeclGADT { con_names = names, con_args = args } + ConDeclGADT { con_names = names, con_g_args = args } -> (map (L loc . unLoc) names ++ ns, flds ++ fs) where - (remSeen', flds) = get_flds remSeen args + (remSeen', flds) = get_flds_gadt remSeen args (ns, fs) = go remSeen' rs ConDeclH98 { con_name = name, con_args = args } -> ([L loc (unLoc name)] ++ ns, flds ++ fs) where - (remSeen', flds) = get_flds remSeen args + (remSeen', flds) = get_flds_h98 remSeen args (ns, fs) = go remSeen' rs - get_flds :: Seen p -> HsConDeclDetails (GhcPass p) + get_flds_h98 :: Seen p -> HsConDeclH98Details (GhcPass p) + -> (Seen p, [LFieldOcc (GhcPass p)]) + get_flds_h98 remSeen (RecCon flds) = get_flds remSeen flds + get_flds_h98 remSeen _ = (remSeen, []) + + get_flds_gadt :: Seen p -> HsConDeclGADTDetails (GhcPass p) + -> (Seen p, [LFieldOcc (GhcPass p)]) + get_flds_gadt remSeen (RecConGADT flds) = get_flds remSeen flds + get_flds_gadt remSeen _ = (remSeen, []) + + get_flds :: Seen p -> Located [LConDeclField (GhcPass p)] -> (Seen p, [LFieldOcc (GhcPass p)]) - get_flds remSeen (RecCon flds) - = (remSeen', fld_names) + get_flds remSeen flds = (remSeen', fld_names) where fld_names = remSeen (concatMap (cd_fld_names . unLoc) (unLoc flds)) remSeen' = foldr (.) remSeen [deleteBy ((==) `on` unLoc . rdrNameFieldOcc . unLoc) v | v <- fld_names] - get_flds remSeen _ - = (remSeen, []) {- |