@@ -98,6 +98,8 @@ loadSource lidr f
98 iLOG ("Finished " ++ f)
98 iLOG ("Finished " ++ f)
99 let ibc = dropExtension f ++ ".ibc"
99 let ibc = dropExtension f ++ ".ibc"
102+ addHides (hide_list i)
101 ok <- noErrors
103 ok <- noErrors
102 when ok $
104 when ok $
103 idrisCatch (do writeIBC f ibc; clearIBC)
105 idrisCatch (do writeIBC f ibc; clearIBC)
@@ -107,6 +109,18 @@ loadSource lidr f
107 namespaces [] ds = ds
109 namespaces [] ds = ds
108 namespaces (x:xs) ds = [PNamespace x (namespaces xs ds)]
110 namespaces (x:xs) ds = [PNamespace x (namespaces xs ds)]
112+addHides :: [(Name, Maybe Accessibility)] -> Idris ()
113+addHides xs = let (hs, as) = partition isNothing xs in
114+ if null as then return ()
116+ (map (\ (n, _) -> (n, Hidden)) hs ++
117+ map (\ (n, Just a) -> (n, a)) as)
118+ where isNothing (_, Nothing) = True
121+ doHide (n, a) = do setAccessibility n a
122+ addIBC (IBCAccess n a)
110parseExpr i = runParser (pFullExpr defaultSyntax) i "(input)"
124parseExpr i = runParser (pFullExpr defaultSyntax) i "(input)"
111parseTac i = runParser (do t <- pTactic defaultSyntax
125parseTac i = runParser (do t <- pTactic defaultSyntax
@@ -278,12 +292,14 @@ pSynSym = try (do lchar '['; n <- pName; lchar ']'
278 return (Symbol sym)
292 return (Symbol sym)
280pFunDecl' :: SyntaxInfo -> IParser PDecl
294pFunDecl' :: SyntaxInfo -> IParser PDecl
295+pFunDecl' syn = try (do acc <- pAccessibility
281−pFunDecl' syn = try (do n_in <- pfName
296+ n_in <- pfName
282 let n = expandNS syn n_in
297 let n = expandNS syn n_in
283 ty <- pTSig syn
298 ty <- pTSig syn
284 fc <- pfc
299 fc <- pfc
285 lchar ';'
300 lchar ';'
286-- ty' <- implicit syn n ty
301-- ty' <- implicit syn n ty
287 return (PTy syn fc n ty))
303 return (PTy syn fc n ty))
288 <|> try (pPattern syn)
304 <|> try (pPattern syn)
@@ -349,7 +365,8 @@ fixity = try (do reserved "infixl"; return Infixl)
349--------- Tyoe classes ---------
365--------- Tyoe classes ---------
351pClass :: SyntaxInfo -> IParser [PDecl]
367pClass :: SyntaxInfo -> IParser [PDecl]
368+pClass syn = do acc <- pAccessibility
352−pClass syn = do reserved "class"
369+ reserved "class"
353 fc <- pfc
370 fc <- pfc
354 cons <- pConstList syn
371 cons <- pConstList syn
355 n_in <- pName; let n = expandNS syn n_in
372 n_in <- pName; let n = expandNS syn n_in
@@ -357,7 +374,9 @@ pClass syn = do reserved "class"
357 reserved "where"; lchar '{'
374 reserved "where"; lchar '{'
358 ds <- many1 $ pFunDecl syn;
375 ds <- many1 $ pFunDecl syn;
359 lchar '}'
376 lchar '}'
377+ let allDs = concat ds
378+ accData acc n (concatMap declared allDs)
360− return [PClass syn fc cons n cs (concat ds)]
379+ return [PClass syn fc cons n cs allDs]
362 carg = do lchar '('; i <- pName; lchar ':'; ty <- pExpr syn; lchar ')'
381 carg = do lchar '('; i <- pName; lchar ':'; ty <- pExpr syn; lchar ')'
363 return (i, ty)
382 return (i, ty)
@@ -465,6 +484,17 @@ pName = do i <- getState
465pfName = try pName
484pfName = try pName
466 <|> do lchar '('; o <- operator; lchar ')'; return (UN o)
485 <|> do lchar '('; o <- operator; lchar ')'; return (UN o)
487+pAccessibility :: IParser (Maybe Accessibility)
489+ = do reserved "public"; return (Just Public)
490+ <|> do reserved "abstract"; return (Just Frozen)
491+ <|> do reserved "private"; return (Just Hidden)
494+addAcc :: Name -> Maybe Accessibility -> IParser ()
495+addAcc n a = do i <- getState
496+ setState (i { hide_list = (n, a) : hide_list i })
468pSimpleExpr syn =
498pSimpleExpr syn =
469 try (do symbol "!["; t <- pTerm; lchar ']'
499 try (do symbol "!["; t <- pTerm; lchar ']'
470 return $ PQuote t)
500 return $ PQuote t)
@@ -670,16 +700,25 @@ prefix name f = Prefix (do { reservedOp name; fc <- pfc;
671--------- Data declarations ---------
701--------- Data declarations ---------
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
673pData :: SyntaxInfo -> IParser PDecl
709pData :: SyntaxInfo -> IParser PDecl
710+pData syn = try (do acc <- pAccessibility
674−pData syn = try (do reserved "data"; fc <- pfc
711+ reserved "data"; fc <- pfc
675 tyn_in <- pfName; ty <- pTSig syn
712 tyn_in <- pfName; ty <- pTSig syn
676 let tyn = expandNS syn tyn_in
713 let tyn = expandNS syn tyn_in
677 reserved "where"
714 reserved "where"
678-- ty' <- implicit syn tyn ty
715-- ty' <- implicit syn tyn ty
679 cons <- sepBy (pConstructor syn) (lchar '|')
716 cons <- sepBy (pConstructor syn) (lchar '|')
680 lchar ';'
717 lchar ';'
718+ accData acc tyn (map (\ (n, _, _) -> n) cons)
681 return $ PData syn fc (PDatadecl tyn ty cons))
719 return $ PData syn fc (PDatadecl tyn ty cons))
720+ <|> do acc <- pAccessibility
682− <|> do reserved "data"; fc <- pfc
721+ reserved "data"; fc <- pfc
683 tyn_in <- pfName; args <- many pName
722 tyn_in <- pfName; args <- many pName
684 let tyn = expandNS syn tyn_in
723 let tyn = expandNS syn tyn_in
685 lchar '='
724 lchar '='
@@ -692,6 +731,7 @@ pData syn = try (do reserved "data"; fc <- pfc
692 do let cty = bindArgs cargs conty
731 do let cty = bindArgs cargs conty
693-- cty' <- implicit syn x cty
732-- cty' <- implicit syn x cty
694 return (x, cty, cfc)) cons
733 return (x, cty, cfc)) cons
734+ accData acc tyn (map (\ (n, _, _) -> n) cons')
695 return $ PData syn fc (PDatadecl tyn ty cons')
735 return $ PData syn fc (PDatadecl tyn ty cons')
697 mkPApp fc t [] = t
737 mkPApp fc t [] = t