@@ -98,6 +98,8 @@ loadSource lidr f
9898 iLOG ("Finished " ++ f)
9999 let ibc = dropExtension f ++ ".ibc"
100100 iucheck
101+ i <- getIState
102+ addHides (hide_list i)
101103 ok <- noErrors
102104 when ok $
103105 idrisCatch (do writeIBC f ibc; clearIBC)
@@ -107,6 +109,18 @@ loadSource lidr f
107109 namespaces [] ds = ds
108110 namespaces (x:xs) ds = [PNamespace x (namespaces xs ds)]
109111
112+addHides :: [(Name, Maybe Accessibility)] -> Idris ()
113+addHides xs = let (hs, as) = partition isNothing xs in
114+ if null as then return ()
115+ else mapM_ doHide
116+ (map (\ (n, _) -> (n, Hidden)) hs ++
117+ map (\ (n, Just a) -> (n, a)) as)
118+ where isNothing (_, Nothing) = True
119+ isNothing _ = False
120+
121+ doHide (n, a) = do setAccessibility n a
122+ addIBC (IBCAccess n a)
123+
110124parseExpr i = runParser (pFullExpr defaultSyntax) i "(input)"
111125parseTac i = runParser (do t <- pTactic defaultSyntax
112126 eof
@@ -278,12 +292,14 @@ pSynSym = try (do lchar '['; n <- pName; lchar ']'
278292 return (Symbol sym)
279293
280294pFunDecl' :: SyntaxInfo -> IParser PDecl
281−pFunDecl' syn = try (do n_in <- pfName
295+pFunDecl' syn = try (do acc <- pAccessibility
296+ n_in <- pfName
282297 let n = expandNS syn n_in
283298 ty <- pTSig syn
284299 fc <- pfc
285300 lchar ';'
286301-- ty' <- implicit syn n ty
302+ addAcc n acc
287303 return (PTy syn fc n ty))
288304 <|> try (pPattern syn)
289305
@@ -349,7 +365,8 @@ fixity = try (do reserved "infixl"; return Infixl)
349365--------- Tyoe classes ---------
350366
351367pClass :: SyntaxInfo -> IParser [PDecl]
352−pClass syn = do reserved "class"
368+pClass syn = do acc <- pAccessibility
369+ reserved "class"
353370 fc <- pfc
354371 cons <- pConstList syn
355372 n_in <- pName; let n = expandNS syn n_in
@@ -357,7 +374,9 @@ pClass syn = do reserved "class"
357374 reserved "where"; lchar '{'
358375 ds <- many1 $ pFunDecl syn;
359376 lchar '}'
360− return [PClass syn fc cons n cs (concat ds)]
377+ let allDs = concat ds
378+ accData acc n (concatMap declared allDs)
379+ return [PClass syn fc cons n cs allDs]
361380 where
362381 carg = do lchar '('; i <- pName; lchar ':'; ty <- pExpr syn; lchar ')'
363382 return (i, ty)
@@ -465,6 +484,17 @@ pName = do i <- getState
465484pfName = try pName
466485 <|> do lchar '('; o <- operator; lchar ')'; return (UN o)
467486
487+pAccessibility :: IParser (Maybe Accessibility)
488+pAccessibility
489+ = do reserved "public"; return (Just Public)
490+ <|> do reserved "abstract"; return (Just Frozen)
491+ <|> do reserved "private"; return (Just Hidden)
492+ <|> return Nothing
493+
494+addAcc :: Name -> Maybe Accessibility -> IParser ()
495+addAcc n a = do i <- getState
496+ setState (i { hide_list = (n, a) : hide_list i })
497+
468498pSimpleExpr syn =
469499 try (do symbol "!["; t <- pTerm; lchar ']'
470500 return $ PQuote t)
@@ -670,16 +700,25 @@ prefix name f = Prefix (do { reservedOp name; fc <- pfc;
670700
671701--------- Data declarations ---------
672702
703+-- (works for classes too - 'abstract' means the data/class is visible but members not)
704+accData :: Maybe Accessibility -> Name -> [Name] -> IParser ()
705+accData (Just Frozen) n ns = do addAcc n (Just Frozen)
706+ mapM_ (\n -> addAcc n (Just Hidden)) ns
707+accData a n ns = do addAcc n a; mapM_ (\n -> addAcc n a) ns
708+
673709pData :: SyntaxInfo -> IParser PDecl
674−pData syn = try (do reserved "data"; fc <- pfc
710+pData syn = try (do acc <- pAccessibility
711+ reserved "data"; fc <- pfc
675712 tyn_in <- pfName; ty <- pTSig syn
676713 let tyn = expandNS syn tyn_in
677714 reserved "where"
678715-- ty' <- implicit syn tyn ty
679716 cons <- sepBy (pConstructor syn) (lchar '|')
680717 lchar ';'
718+ accData acc tyn (map (\ (n, _, _) -> n) cons)
681719 return $ PData syn fc (PDatadecl tyn ty cons))
682− <|> do reserved "data"; fc <- pfc
720+ <|> do acc <- pAccessibility
721+ reserved "data"; fc <- pfc
683722 tyn_in <- pfName; args <- many pName
684723 let tyn = expandNS syn tyn_in
685724 lchar '='
@@ -692,6 +731,7 @@ pData syn = try (do reserved "data"; fc <- pfc
692731 do let cty = bindArgs cargs conty
693732-- cty' <- implicit syn x cty
694733 return (x, cty, cfc)) cons
734+ accData acc tyn (map (\ (n, _, _) -> n) cons')
695735 return $ PData syn fc (PDatadecl tyn ty cons')
696736 where
697737 mkPApp fc t [] = t