on master help sign in
Refactored data declaration to use less lookahead for better errors and
d1b5cb9Ahmad Salim Al-Sibahi
src/Idris/Parser.hs+15−17
@@ -1963,25 +1963,23 @@ SimpleConstructorList ::=
1963 ;
1963 ;
1964-}
1964-}
1965data_ :: SyntaxInfo -> IdrisParser PDecl
1965data_ :: SyntaxInfo -> IdrisParser PDecl
1966−data_ syn = try (do doc <- option "" (docComment '|')
1966+data_ syn = do (doc, acc, co) <- try (do
1967− acc <- optional accessibility
1968− co <- dataI
1969− fc <- getFC
1970− tyn_in <- fnName
1971− lchar ':'
1972− ty <- typeExpr (allowImp syn)
1973− let tyn = expandNS syn tyn_in
1974− option (PData doc syn fc co (PLaterdecl tyn ty)) (do
1975− reserved "where"
1976− cons <- indentedBlock (constructor syn)
1977− accData acc tyn (map (\ (_, n, _, _) -> n) cons)
1978− return $ PData doc syn fc co (PDatadecl tyn ty cons)))
1979− <|> try (do doc <- option "" (docComment '|')
1967+ doc <- option "" (docComment '|')
1980 pushIndent
1968 pushIndent
1981 acc <- optional accessibility
1969 acc <- optional accessibility
1982 co <- dataI
1970 co <- dataI
1971+ return (doc, acc, co))
1983− fc <- getFC
1972+ fc <- getFC
1984− tyn_in <- fnName
1973+ tyn_in <- fnName
1974+ (do try (lchar ':')
1975+ popIndent
1976+ ty <- typeExpr (allowImp syn)
1977+ let tyn = expandNS syn tyn_in
1978+ option (PData doc syn fc co (PLaterdecl tyn ty)) (do
1979+ reserved "where"
1980+ cons <- indentedBlock (constructor syn)
1981+ accData acc tyn (map (\ (_, n, _, _) -> n) cons)
1982+ return $ PData doc syn fc co (PDatadecl tyn ty cons))) <|> (do
1985 args <- many name
1983 args <- many name
1986 let ty = bindArgs (map (const PType) args) PType
1984 let ty = bindArgs (map (const PType) args) PType
1987 let tyn = expandNS syn tyn_in
1985 let tyn = expandNS syn tyn_in
@@ -2005,7 +2003,7 @@ data_ syn = try (do doc <- option "" (docComment '|')
2005 return (doc, x, cty, cfc)) cons
2003 return (doc, x, cty, cfc)) cons
2006 accData acc tyn (map (\ (_, n, _, _) -> n) cons')
2004 accData acc tyn (map (\ (_, n, _, _) -> n) cons')
2007 return $ PData doc syn fc co (PDatadecl tyn ty cons')))
2005 return $ PData doc syn fc co (PDatadecl tyn ty cons')))
2008− <?> "data type declaration"
2006+ <?> "data type declaration"
2009 where
2007 where
2010 mkPApp :: FC -> PTerm -> [PTerm] -> PTerm
2008 mkPApp :: FC -> PTerm -> [PTerm] -> PTerm
2011 mkPApp fc t [] = t
2009 mkPApp fc t [] = t