diff options
| -rw-r--r-- | src/HaddockDB.hs | 1 | ||||
| -rw-r--r-- | src/HaddockHtml.hs | 36 | ||||
| -rw-r--r-- | src/HaddockRename.hs | 11 | ||||
| -rw-r--r-- | src/HsLexer.lhs | 12 | ||||
| -rw-r--r-- | src/HsParseUtils.lhs | 42 | ||||
| -rw-r--r-- | src/HsParser.ly | 71 | ||||
| -rw-r--r-- | src/HsSyn.lhs | 26 | ||||
| -rw-r--r-- | src/Main.hs | 2 | 
8 files changed, 146 insertions, 55 deletions
diff --git a/src/HaddockDB.hs b/src/HaddockDB.hs index f1718149..87de75b5 100644 --- a/src/HaddockDB.hs +++ b/src/HaddockDB.hs @@ -112,6 +112,7 @@ ppHsType (HsForAllType (Just tvs) context htype) =       hsep (text "forall" : map ppHsName tvs ++ text "." :   	   ppHsContext context : text "=>" : [ppHsType htype])  ppHsType (HsTyFun a b) = fsep [ppHsBType a, text "->", ppHsType b] +ppHsType (HsTyIP n t)  = fsep [(char '?' <> ppHsName n), text "::", ppHsType t]  ppHsType t = ppHsBType t  ppHsBType (HsTyApp (HsTyCon (Qual (Module "Prelude") (HsTyClsName (HsSpecial "[]")))) b ) diff --git a/src/HaddockHtml.hs b/src/HaddockHtml.hs index fc65c4a1..001aa7a2 100644 --- a/src/HaddockHtml.hs +++ b/src/HaddockHtml.hs @@ -467,7 +467,7 @@ doDecl summary x d instances = do_decl d  ppTypeSig :: Bool -> HsName -> HsType -> Html -ppTypeSig summary nm ty = ppHsBinder summary nm <+> toHtml "::" <+> ppHsType ty +ppTypeSig summary nm ty = ppHsBinder summary nm <+> dcolon <+> ppHsType ty  -- -----------------------------------------------------------------------------  -- Data & newtype declarations @@ -566,7 +566,7 @@ ppSideBySideConstr (HsRecDecl _ nm tvs ctxt fields doc) =  ppSideBySideField :: HsFieldDecl -> HtmlTable  ppSideBySideField (HsFieldDecl ns ty doc) =    declBox (hsep (punctuate comma (map (ppHsBinder False) ns)) -	   <+> toHtml "::" <+> ppHsBangType ty) <-> +	   <+> dcolon <+> ppHsBangType ty) <->    maybeRDocBox doc  {- @@ -600,14 +600,14 @@ ppShortField :: Bool -> HsFieldDecl -> HtmlTable  ppShortField summary (HsFieldDecl ns ty _doc)     = tda [theclass "recfield"] << (  	  hsep (punctuate comma (map (ppHsBinder summary) ns)) -	    <+> toHtml "::" <+> ppHsBangType ty +	    <+> dcolon <+> ppHsBangType ty     )  {-  ppFullField :: HsFieldDecl -> Html  ppFullField (HsFieldDecl [n] ty doc)     = declWithDoc False doc ( -	ppHsBinder False n <+> toHtml "::" <+> ppHsBangType ty +	ppHsBinder False n <+> dcolon <+> ppHsBangType ty      )  ppFullField _ = error "ppFullField" @@ -737,11 +737,11 @@ ppFunSig summary nm ty0 doc  	  = (declBox (  		leader <+>   		hsep (keyword "forall" : map ppHsName tvs ++ [toHtml "."]) <+> -		ppHsContext ctxt) +		ppHsIPContext ctxt)  	      <-> rdocBox noHtml) </>   	    do_args darrow ty  	do_args leader (HsForAllType Nothing ctxt ty) -	  = (declBox (leader <+> ppHsContext ctxt) +	  = (declBox (leader <+> ppHsIPContext ctxt)  		<-> rdocBox noHtml) </>   	    do_args darrow ty  	do_args leader (HsTyFun (HsTyDoc ty doc0) r) @@ -758,27 +758,37 @@ ppFunSig summary nm ty0 doc  -- ----------------------------------------------------------------------------  -- Types and contexts -ppHsAsst	    :: HsAsst -> Html -ppHsAsst (c,args)   =  ppHsQName c <+> hsep (map ppHsAType args) +ppHsAsst	  :: HsAsst -> Html +ppHsAsst (c,args) =  ppHsQName c <+> hsep (map ppHsAType args) -ppHsContext	    :: HsContext -> Html +ppHsContext	  :: HsContext -> Html  ppHsContext []      =  empty -ppHsContext [asst]  =  ppHsAsst asst +ppHsContext [ctxt]  =  ppHsAsst ctxt  ppHsContext context =  parenList (map ppHsAsst context) -ppHsForAll :: Maybe [HsName] -> HsContext -> Html +ppHsCtxt :: HsCtxt -> Html +ppHsCtxt (HsAssump asst) = ppHsAsst asst +ppHsCtxt (HsIP n t)      = toHtml "?" +++ ppHsName n <+> dcolon <+> ppHsType t + +ppHsIPContext	      :: HsIPContext -> Html +ppHsIPContext []      =  empty +ppHsIPContext [ctxt]  =  ppHsCtxt ctxt +ppHsIPContext context =  parenList (map ppHsCtxt context) + +ppHsForAll :: Maybe [HsName] -> HsIPContext -> Html  ppHsForAll Nothing context =  -  hsep [ ppHsContext context, darrow ] +  hsep [ ppHsIPContext context, darrow ]  ppHsForAll (Just tvs) [] =     hsep (keyword "forall" : map ppHsName tvs ++ [toHtml "."])  ppHsForAll (Just tvs) context =    hsep (keyword "forall" : map ppHsName tvs ++  -	  [toHtml ".", ppHsContext context, darrow]) +	  [toHtml ".", ppHsIPContext context, darrow])  ppHsType :: HsType -> Html  ppHsType (HsForAllType maybe_tvs context htype) =    ppHsForAll maybe_tvs context <+> ppHsType htype  ppHsType (HsTyFun a b) = hsep [ppHsBType a, toHtml "->", ppHsType b] +ppHsType (HsTyIP n t)  = toHtml "?" +++ ppHsName n <+> dcolon <+> ppHsType t  ppHsType t = ppHsBType t  ppHsBType :: HsType -> Html diff --git a/src/HaddockRename.hs b/src/HaddockRename.hs index 994bf500..ef32ae80 100644 --- a/src/HaddockRename.hs +++ b/src/HaddockRename.hs @@ -151,6 +151,12 @@ renameBangTy (HsUnBangedTy ty) = HsUnBangedTy `liftM` renameType ty  renameContext :: HsContext -> RnM HsContext  renameContext = mapM renamePred +renameIPContext :: HsIPContext -> RnM HsIPContext +renameIPContext cs = mapM renameCtxt cs + where +   renameCtxt (HsIP n t)   = liftM (HsIP n) (renameType t) +   renameCtxt (HsAssump c) = liftM HsAssump (renamePred c) +  renamePred :: (HsQName,[HsType]) -> RnM (HsQName,[HsType])  renamePred (c,tys0) = do    tys <- mapM renameType tys0 @@ -158,13 +164,16 @@ renamePred (c,tys0) = do  renameType :: HsType -> RnM HsType  renameType (HsForAllType tvs ctx0 ty0) = do -  ctx <- mapM renamePred ctx0 +  ctx <- renameIPContext ctx0    ty <- renameType ty0    return (HsForAllType tvs ctx ty)  renameType (HsTyFun arg0 res0) = do    arg <- renameType arg0    res <- renameType res0    return (HsTyFun arg res) +renameType (HsTyIP n ty0) = do +  ty <- renameType ty0 +  return (HsTyIP n ty0)  renameType (HsTyTuple b tys0) = do    tys <- mapM renameType tys0    return (HsTyTuple b tys) diff --git a/src/HsLexer.lhs b/src/HsLexer.lhs index ddb6afc1..4202a406 100644 --- a/src/HsLexer.lhs +++ b/src/HsLexer.lhs @@ -1,5 +1,5 @@  ----------------------------------------------------------------------------- --- $Id: HsLexer.lhs,v 1.13 2003/08/18 10:04:47 simonmar Exp $ +-- $Id: HsLexer.lhs,v 1.14 2003/10/20 17:19:22 sof Exp $  --  -- (c) The GHC Team, 1997-2000  -- @@ -26,6 +26,7 @@ import Char  \begin{code}  data Token           = VarId String +	| IPVarId String          | QVarId (String,String)  	| ConId String          | QConId (String,String) @@ -186,6 +187,9 @@ isIdent  c = isAlpha c || isDigit c || c == '\'' || c == '_'  isSymbol c = elem c ":!#$%&*+./<=>?@\\^|-~"  isWhite  c = elem c " \n\r\t\v\f" +isIdentInitial :: Char -> Bool +isIdentInitial ch = isLower ch || ch == '_' +  tAB_LENGTH :: Int  tAB_LENGTH = 8 @@ -307,6 +311,8 @@ lexToken cont s0 loc y x =  						-- pop context on '}'                                 []       -> error "Internal error: empty context in lexToken" +        '?':s:ss   +	  | isIdentInitial s -> lexToken ( \ (VarId x) -> cont (IPVarId x)) (s:ss) loc y x          '\'':s -> lexChar cont s loc y (x+1)          '\"':s{-"-} -> lexString cont s loc y (x+1) @@ -321,7 +327,7 @@ lexToken cont s0 loc y x =  	   in  	   afterNum cont i rest loc y (x+length num) -        c:s | isLower c || c == '_' -> +        c:s | isIdentInitial c ->          	let           	    (idtail, rest) = slurpIdent s          	    id0 = c:idtail @@ -449,7 +455,7 @@ lexCon qual cont s0 loc y x =    in    case rest of      '.':c1:s1  -     | isLower c1 ->	-- qualified varid? +     | isIdentInitial c1 ->	-- qualified varid?  	let  	    (idtail, rest1) = slurpIdent s1  	    id0 = c1:idtail diff --git a/src/HsParseUtils.lhs b/src/HsParseUtils.lhs index de4a2562..5498cfd3 100644 --- a/src/HsParseUtils.lhs +++ b/src/HsParseUtils.lhs @@ -1,5 +1,5 @@  ----------------------------------------------------------------------------- --- $Id: HsParseUtils.lhs,v 1.5 2002/07/24 09:42:18 simonmar Exp $ +-- $Id: HsParseUtils.lhs,v 1.6 2003/10/20 17:19:23 sof Exp $  --  -- (c) The GHC Team 1997-2000  -- @@ -15,7 +15,8 @@ module HsParseUtils (  	, splitTyConApp		-- HsType -> P (HsName,[HsType])  	, mkRecConstrOrUpdate	-- HsExp -> [HsFieldUpdate] -> P HsExp  	, checkPrec 		-- String -> P String -	, checkContext		-- HsType -> P HsContext +	, checkContext		-- HsType -> P HsIPContext +	, checkIPContext        -- HsIPContext -> P HsContext  	, checkAssertion	-- HsType -> P HsAsst  	, checkInstHeader	-- HsType -> P (HsContext, HsAsst)  	, checkClassHeader	-- HsType -> P (HsContext, HsName, [HsType]) @@ -36,6 +37,7 @@ import HsSyn  import HsParseMonad  import Char(isDigit,isOctDigit,isHexDigit,digitToInt) +import List(partition)  import Ratio  \end{code} @@ -57,13 +59,26 @@ splitTyConApp t0 = split t0 []  -----------------------------------------------------------------------------  -- Various Syntactic Checks -checkContext :: HsType -> P HsContext -checkContext (HsTyTuple True ts) =  -     mapP checkAssertion ts `thenP` \cs -> -     returnP cs +checkContext :: HsType -> P HsIPContext +checkContext (HsTyTuple True ts) = mapP checkCtxt ts +  where +   checkCtxt (HsTyIP n ty) = returnP (HsIP n ty) +   checkCtxt t0 =  +      checkAssertion t0 `thenP` \ c -> +      returnP (HsAssump c) +checkContext (HsTyIP n t) = returnP [HsIP n t]  checkContext t =        checkAssertion t `thenP` \c -> -     returnP [c] +     returnP [HsAssump c] + +checkIPContext :: HsIPContext -> P HsContext +checkIPContext ls =  +  case partition isIP ls of +   ([],cs) -> returnP (map (\ (HsAssump c) -> c) cs) +   (_,_)   -> parseError "Unexpected implicit parameter in context" + where +  isIP HsIP{} = True +  isIP _      = False  -- Changed for multi-parameter type classes @@ -75,8 +90,9 @@ checkAssertion = checkAssertion' []  checkInstHeader :: HsType -> P (HsContext, HsAsst)  checkInstHeader (HsForAllType Nothing ctxt ty) = -  checkAssertion ty `thenP` \asst -> -  returnP (ctxt, asst) +  checkAssertion ty   `thenP` \asst -> +  checkIPContext ctxt `thenP` \ctxt' -> +  returnP (ctxt', asst)  checkInstHeader ty =    checkAssertion ty `thenP` \asst ->    returnP ([], asst) @@ -84,7 +100,8 @@ checkInstHeader ty =  checkDataHeader :: HsType -> P (HsContext,HsName,[HsName])  checkDataHeader (HsForAllType Nothing cs t) =  	checkSimple "data/newtype" t [] `thenP` \(c,ts) -> -	returnP (cs,c,ts) +        checkIPContext cs `thenP` \cs' -> +	returnP (cs',c,ts)  checkDataHeader ty =  	checkSimple "data/newtype" ty [] `thenP` \(c,ts) ->  	returnP ([],c,ts) @@ -92,7 +109,8 @@ checkDataHeader ty =  checkClassHeader :: HsType -> P (HsContext,HsName,[HsName])  checkClassHeader (HsForAllType Nothing cs t) =   	checkSimple "class" t [] `thenP` \(c,ts) -> -	returnP (cs,c,ts) +        checkIPContext cs        `thenP` \cs' -> +	returnP (cs',c,ts)  checkClassHeader ty =   	checkSimple "class" ty [] `thenP` \(c,ts) ->  	returnP ([],c,ts) @@ -157,6 +175,7 @@ patFail = parseError "Parse error in pattern"  checkExpr :: HsExp -> P HsExp  checkExpr e0 = case e0 of  	HsVar _			  -> returnP e0 +	HsIPVar _                 -> returnP e0  	HsCon _			  -> returnP e0  	HsLit _			  -> returnP e0  	HsInfixApp e1 e2 e3	  -> check3Exprs e1 e2 e3 HsInfixApp @@ -229,6 +248,7 @@ checkGAlt (HsGuardedAlt loc stmts0 e0) =  checkStmt :: HsStmt -> P HsStmt  checkStmt (HsGenerator p e) = check1Expr e (HsGenerator p) +checkStmt (HsParStmt ss)    = mapP checkStmt ss `thenP` \ ss1 -> returnP (HsParStmt ss1)  checkStmt (HsQualifier e)   = check1Expr e HsQualifier  checkStmt s@(HsLetStmt _)   = returnP s diff --git a/src/HsParser.ly b/src/HsParser.ly index 6855c2ef..4adbcef5 100644 --- a/src/HsParser.ly +++ b/src/HsParser.ly @@ -1,5 +1,5 @@  ----------------------------------------------------------------------------- -$Id: HsParser.ly,v 1.18 2002/07/19 10:00:16 simonmar Exp $ +$Id: HsParser.ly,v 1.19 2003/10/20 17:19:23 sof Exp $  (c) Simon Marlow, Sven Panne 1997-2002 @@ -44,6 +44,7 @@ Conflicts: 3 shift/reduce  > %token  >	VARID 	 { VarId $$ } +>       IPVARID  { IPVarId $$ }  >	QVARID 	 { QVarId $$ }  >	CONID	 { ConId $$ }  >	QCONID   { QConId $$ } @@ -407,8 +408,12 @@ Types  >	| btype docprev			{ HsTyDoc $1 $2 }  > type :: { HsType } -> 	: btype '->' type		{ HsTyFun $1 $3 } ->	| btype				{ $1 } +>       : ipvar '::' type1              { HsTyIP $1 $3 } +>       | type1                         { $1 } + +> type1 :: { HsType } +>       : btype				{ $1 } +> 	| btype '->' type1		{ HsTyFun $1 $3 }  > btype :: { HsType }  >	: btype atype			{ HsTyApp $1 $2 } @@ -450,7 +455,7 @@ C a, or (C1 a, C2 b, ... Cn z) and convert it into a context.  Blaach!  >	| context '=>' doctype		{ mkHsForAllType Nothing $1 $3 }  >	| doctype			{ $1 } -> context :: { HsContext } +> context :: { HsIPContext }  > 	: btype				{% checkContext $1 }  > types	:: { [HsType] } @@ -480,11 +485,11 @@ Datatype declarations  >	: srcloc maybe_docnext forall_stuff constr_stuff maybe_docprev  >		{ HsConDecl $1 (fst $4) $3 [] (snd $4) ($2 `mplus` $5) }  >	| srcloc maybe_docnext forall_stuff context '=>' constr_stuff maybe_docprev ->		{ HsConDecl $1 (fst $6) $3 $4 (snd $6) ($2 `mplus` $7) } +>		{% checkIPContext $4 `thenP` \ ctxt -> returnP (HsConDecl $1 (fst $6) $3 ctxt (snd $6) ($2 `mplus` $7)) }  > 	| srcloc maybe_docnext forall_stuff con '{' fielddecls '}' maybe_docprev  > 		{ HsRecDecl $1 $4 $3 [] $6 ($2 `mplus` $8) }  > 	| srcloc maybe_docnext forall_stuff context '=>' con '{' fielddecls '}' maybe_docprev -> 		{ HsRecDecl $1 $6 $3 $4 $8 ($2 `mplus` $10) } +> 		{% checkIPContext $4 `thenP` \ ctxt -> returnP (HsRecDecl $1 $6 $3 ctxt $8 ($2 `mplus` $10)) }  > forall_stuff :: { [HsName] }  > 	: 'forall' tyvars '.'		 	{ $2 } @@ -562,6 +567,24 @@ Class declarations  >	: 'where' decllist		{ $2 }  >	| {- empty -}			{ [] } +> dbinds :: { [HsDecl] } +> 	 : dbinds ';' dbind		{ $3 : $1 } +> 	 | dbinds ';'			{ $1 } +> 	 | dbind			{ [$1] } +>  +> dbind	:: { HsDecl } +> dbind	: ipvar '=' srcloc exp		{% checkValDef ($3, HsVar (UnQual $1), HsUnGuardedRhs $4, []) } + +> binds	::  { [HsDecl] } +>	: decllist			{ $1 } +>	| '{'            dbinds '}'	{ $2 } +> 	|     layout_on  dbinds close	{ $2 } + + +> wherebinds :: { [HsDecl] } +>	: 'where' binds			{ $2 } +>	| {- empty -}			{ [] } +  -----------------------------------------------------------------------------  Instance declarations @@ -580,14 +603,13 @@ Instance declarations  Value definitions  > valdef :: { HsDecl } ->	: exp0b srcloc rhs		{% checkValDef ($2, $1, $3, [])} ->	| exp0b srcloc rhs 'where' decllist ->					{% checkValDef ($2, $1, $3, $5)} +>	: exp0b srcloc rhs  +>					{% checkValDef ($2, $1, $3, [])}  > rhs	:: { HsRhs } ->	: '=' exp			{% checkExpr $2 `thenP` \e -> +>	: '=' exp wherebinds		{% checkExpr $2 `thenP` \e ->  >					   returnP (HsUnGuardedRhs e) } ->	| gdrhs				{ HsGuardedRhss  (reverse $1) } +>	| gdrhs	wherebinds		{ HsGuardedRhss  (reverse $1) }  > gdrhs :: { [HsGuardedRhs] }  >	: gdrhs gdrh			{ $2 : $1 } @@ -628,7 +650,7 @@ the exp0 productions to distinguish these from the others (exp0a).  > exp10a :: { HsExp }  >	: '\\' aexps '->' exp		{% checkPatterns (reverse $2) `thenP` \ps ->  >					   returnP (HsLambda ps $4) } ->  	| 'let' decllist 'in' exp	{ HsLet $2 $4 } +>  	| 'let' binds 'in' exp	         { HsLet $2 $4 }  >	| 'if' exp 'then' exp 'else' exp { HsIf $2 $4 $6 }  > exp10b :: { HsExp } @@ -667,7 +689,8 @@ different from specifying (exp0b qop).  The only consolation is that  other implementations don't manage this either.  > aexp1	:: { HsExp } ->	: qvar				{ HsVar $1 } +>	: ipvar                         { HsIPVar (UnQual $1) } +>       | qvar				{ HsVar $1 }  >	| gcon				{ HsCon $1 }  >  	| literal			{ $1 }  >	| '(' exp ')'			{ HsParen $2 } @@ -703,7 +726,7 @@ avoiding another shift/reduce-conflict.  >	| exp ',' exp '..' 		{ HsEnumFromThen $1 $3 }  >	| exp '..' exp	 		{ HsEnumFromTo $1 $3 }  >	| exp ',' exp '..' exp		{ HsEnumFromThenTo $1 $3 $5 } ->	| exp '|' quals			{ HsListComp $1 (reverse $3) } +>	| exp pquals			{ HsListComp $1 (reverse $2) }  > lexps :: { [HsExp] }  >	: lexps ',' exp 		{ $3 : $1 } @@ -712,6 +735,16 @@ avoiding another shift/reduce-conflict.  -----------------------------------------------------------------------------  List comprehensions +> pquals :: { [HsStmt] } +>	 : pquals1			{ case $1 of +> 					    [qs] -> qs +> 					    qss  -> [HsParStmt (concat qss)] +> 					} +			 +> pquals1 :: { [[HsStmt]] } +> 	: pquals1 '|' quals		{ $3 : $1 } +> 	| '|' quals			{ [$2] } +  > quals :: { [HsStmt] }  >	: quals ',' qual		{ $3 : $1 }  >	| qual				{ [$1] } @@ -719,7 +752,7 @@ List comprehensions  > qual  :: { HsStmt }  >	: pat '<-' exp			{ HsGenerator $1 $3 }  >	| exp				{ HsQualifier $1 } ->  	| 'let' decllist		{ HsLetStmt $2 } +>  	| 'let' binds   		{ HsLetStmt $2 }  -----------------------------------------------------------------------------  Case alternatives @@ -734,9 +767,8 @@ Case alternatives  >	| alt				{ [$1] }  > alt :: { HsAlt } ->	: pat srcloc ralt		{ HsAlt $2 $1 $3 [] } ->	| pat srcloc ralt 'where' decllist ->				 	{ HsAlt $2 $1 $3 $5 } +>	: pat srcloc ralt wherebinds +>				 	{ HsAlt $2 $1 $3 $4 }  > ralt :: { HsGuardedAlts }  >	: '->' exp			{ HsUnGuardedAlt $2 } @@ -803,6 +835,9 @@ Variables, Constructors and Operators.  >	: conid			{ $1 }  >	| '(' consym ')'        { $2 } +> ipvar :: { HsName } +>       : IPVARID               { HsVarName (HsIdent $1) } +  > qcon	:: { HsQName }  >	: qconid		{ $1 }  >	| '(' qconsym ')'	{ $2 } diff --git a/src/HsSyn.lhs b/src/HsSyn.lhs index 511dfd54..139ef327 100644 --- a/src/HsSyn.lhs +++ b/src/HsSyn.lhs @@ -1,5 +1,5 @@  % ----------------------------------------------------------------------------- -% $Id: HsSyn.lhs,v 1.17 2003/05/06 10:04:47 simonmar Exp $ +% $Id: HsSyn.lhs,v 1.18 2003/10/20 17:19:23 sof Exp $  %  % (c) The GHC Team, 1997-2002  % @@ -14,7 +14,7 @@ module HsSyn (      HsImportDecl(..), HsImportSpec(..), HsAssoc(..),      HsDecl(..), HsMatch(..), HsConDecl(..), HsFieldDecl(..),       HsBangType(..), HsRhs(..), -    HsGuardedRhs(..), HsType(..), HsContext, HsAsst, +    HsGuardedRhs(..), HsType(..), HsContext, HsAsst, HsIPContext, HsCtxt(..),      HsLiteral(..), HsExp(..), HsPat(..), HsPatField(..), HsStmt(..),      HsFieldUpdate(..), HsAlt(..), HsGuardedAlts(..), HsGuardedAlt(..),      HsCallConv(..), HsFISafety(..), HsFunDep, @@ -194,18 +194,26 @@ data HsGuardedRhs    deriving (Eq,Show)  data HsType -	 = HsForAllType (Maybe [HsName]) HsContext HsType +	 = HsForAllType (Maybe [HsName]) HsIPContext HsType  	 | HsTyFun   HsType HsType  	 | HsTyTuple Bool{-boxed-} [HsType]  	 | HsTyApp   HsType HsType  	 | HsTyVar   HsName  	 | HsTyCon   HsQName  	 | HsTyDoc   HsType Doc +	 | HsTyIP    HsName HsType    deriving (Eq,Show) -type HsFunDep  = ([HsName], [HsName]) -type HsContext = [HsAsst] -type HsAsst    = (HsQName,[HsType])	-- for multi-parameter type classes +type HsFunDep    = ([HsName], [HsName]) +type HsContext   = [HsAsst] +type HsIPContext = [HsCtxt] + +data HsCtxt + = HsAssump HsAsst	-- for multi-parameter type classes + | HsIP     HsName HsType +  deriving (Eq,Show) + +type HsAsst = (HsQName,[HsType])  data HsLiteral  	= HsInt		Integer @@ -221,7 +229,8 @@ data HsLiteral    deriving (Eq, Show)  data HsExp -	= HsVar HsQName +	= HsIPVar HsQName +	| HsVar HsQName  	| HsCon HsQName  	| HsLit HsLiteral  	| HsInfixApp HsExp HsExp HsExp @@ -274,6 +283,7 @@ data HsPatField  data HsStmt  	= HsGenerator HsPat HsExp +	| HsParStmt [HsStmt]  	| HsQualifier HsExp  	| HsLetStmt [HsDecl]   deriving (Eq,Show) @@ -299,7 +309,7 @@ data HsGuardedAlt  -- Smart constructors  -- pinched from GHC -mkHsForAllType :: Maybe [HsName] -> [HsAsst] -> HsType -> HsType +mkHsForAllType :: Maybe [HsName] -> HsIPContext -> HsType -> HsType  mkHsForAllType (Just []) [] ty = ty	-- Explicit for-all with no tyvars  mkHsForAllType mtvs1     [] (HsForAllType mtvs2 ctxt ty)   = mkHsForAllType (mtvs1 `plus` mtvs2) ctxt ty diff --git a/src/Main.hs b/src/Main.hs index 3e4afca2..c600f0b3 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -619,7 +619,7 @@ extractClassDecl c mdl tvs0 (HsTypeSig loc [n] ty doc)  	_ ->   	  HsTypeSig loc [n] (HsForAllType Nothing ctxt ty) doc   where -  ctxt = [(Qual mdl c, map HsTyVar tvs0)] +  ctxt = [HsAssump (Qual mdl c, map HsTyVar tvs0)]  extractClassDecl _ _ _ d =       error $ "Main.extractClassDecl: unexpected decl: " ++ show d  | 
