X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FcoreSyn%2FMkExternalCore.lhs;h=99ea425251dfbced9b6d4526fc0567bc82bbf3c8;hp=5ca43452f7d030e1aaf858e685a0d50e47108496;hb=e4417dcd4679da9c6b18c02ff667199c572bed89;hpb=d89d0f0a7d39a4390894b7b36c2b0ce24b1b300e diff --git a/compiler/coreSyn/MkExternalCore.lhs b/compiler/coreSyn/MkExternalCore.lhs index 5ca4345..99ea425 100644 --- a/compiler/coreSyn/MkExternalCore.lhs +++ b/compiler/coreSyn/MkExternalCore.lhs @@ -63,9 +63,18 @@ mkExternalCore :: CgGuts -> C.Module -- not been injected, so we have to add them manually here -- We don't include the strange data-con *workers* because they are -- implicit in the data type declaration itself -mkExternalCore (CgGuts {cg_module=this_mod, cg_tycons = tycons, cg_binds = binds}) - = (C.Module mname tdefs (runCoreM (mapM (make_vdef True) binds) - this_mod)) +mkExternalCore (CgGuts {cg_module=this_mod, cg_tycons = tycons, + cg_binds = binds}) + -- Note that we flatten binds at the top level: + -- every module is just a single recursive bag of declarations. + -- Rationale: since modules can be mutually recursive, + -- there's not much reason to preserve dependency info within a module. + = C.Module mname tdefs (case flattenBinds binds of + -- check for empty list so we don't create an + -- empty Rec group + [] -> [] + bs -> [(runCoreM (make_vdef True + (Rec bs)) this_mod)]) where mname = make_mid this_mod tdefs = foldr collect_tdefs [] tycons @@ -75,14 +84,12 @@ collect_tdefs tcon tdefs | isAlgTyCon tcon = tdef: tdefs where tdef | isNewTyCon tcon = - C.Newtype (qtc tcon) (map make_tbind tyvars) + C.Newtype (qtc tcon) (case newTyConCo_maybe tcon of - Just co -> (qtc co, - map make_tbind vs, - make_kind (mkCoKind l r)) - where (vs,l,r) = coercionAxiom co + Just co -> qtc co Nothing -> pprPanic ("MkExternalCore: newtype tcon\ should have a coercion: ") (ppr tcon)) + (map make_tbind tyvars) repclause | otherwise = C.Data (qtc tcon) (map make_tbind tyvars) @@ -90,18 +97,6 @@ collect_tdefs tcon tdefs where repclause | isRecursiveTyCon tcon || isOpenTyCon tcon= Nothing | otherwise = Just (make_ty (snd (newTyConRhs tcon))) tyvars = tyConTyVars tcon - coercionAxiom co = - case isCoercionTyCon_maybe co of - -- See Note [Newtype coercions] in - -- types/TyCon - Just (arity,coKindFun) | (l,r) <- (coKindFun $ map mkTyVarTy vs) -> - -- Here we eta-expand the newtype coercion, - -- which makes the ext-core typechecker somewhat simpler. - (tyvars,mkAppTys l extraVs,mkAppTys r extraVs) - where (vs, extraVs) = (take arity tyvars, - map mkTyVarTy $ drop arity tyvars) - Nothing -> pprPanic "MkExternalCore: coercion tcon lacks a kind fun" - (ppr tcon) collect_tdefs _ tdefs = tdefs @@ -261,7 +256,9 @@ make_kind _ = error "MkExternalCore died: make_kind" {- Id generation. -} make_id :: Bool -> Name -> C.Id -make_id _is_var nm = (occNameString . nameOccName) nm +-- include uniques for internal names in order to avoid name shadowing +make_id _is_var nm = ((occNameString . nameOccName) nm) + ++ (if isInternalName nm then (show . nameUnique) nm else "") make_var_id :: Name -> C.Id make_var_id = make_id True