@@ -216,19 +216,28 @@ decl' syn = fixity
216216-}
217217syntaxDecl :: SyntaxInfo -> IdrisParser PDecl
218218syntaxDecl syn = do s <- syntaxRule syn
219− i <- get
220− let rs = syntax_rules i
221− let ns = syntax_keywords i
222− let ibc = ibc_write i
223− let ks = map show (names s)
224− put (i { syntax_rules = s : rs,
225− syntax_keywords = ks ++ ns,
226− ibc_write = IBCSyntax s : map IBCKeyword ks ++ ibc })
219+ i <- get
220+ put (i `addSyntax` s)
227221 fc <- getFC
228− return (PSyntax fc s)
229− where names (Rule syms _ _) = mapMaybe ename syms
230− ename (Keyword n) = Just n
231− ename _ = Nothing
222+ return (PSyntax fc s)
223+
224+-- | Extend an 'IState' with a new syntax extension. See also 'addReplSyntax'.
225+addSyntax :: IState -> Syntax -> IState
226+addSyntax i s = i { syntax_rules = s : rs,
227+ syntax_keywords = ks ++ ns,
228+ ibc_write = IBCSyntax s : map IBCKeyword ks ++ ibc }
229+ where rs = syntax_rules i
230+ ns = syntax_keywords i
231+ ibc = ibc_write i
232+ ks = map show (syntaxNames s)
233+
234+-- | Like 'addSyntax', but no effect on the IBC.
235+addReplSyntax :: IState -> Syntax -> IState
236+addReplSyntax i s = i { syntax_rules = s : rs,
237+ syntax_keywords = ks ++ ns }
238+ where rs = syntax_rules i
239+ ns = syntax_keywords i
240+ ks = map show (syntaxNames s)
232241
233242{- | Parses a syntax extension declaration
234243