shithub: MicroHs

Download patch

ref: b9fe0f800888e890a4e2fc300f9957a80d3f66f7
parent: 405cddb412eae4af7cefb1091612290f875d5dc4
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Sat Feb 10 09:48:00 EST 2024

Allow (but ignore) explicit import/export list on types/classes.

--- a/src/MicroHs/Parse.hs
+++ b/src/MicroHs/Parse.hs
@@ -56,6 +56,7 @@
                       (pSpec '(' *> esepEndBy pExportItem (pSpec ',') <* pSpec ')') <*>
                       (pKeyword "where" *> pBlock pDef)
 
+-- Possibly qualified alphanumeric identifier
 pQIdent :: P Ident
 pQIdent = do
   fn <- getFileName
@@ -64,6 +65,7 @@
     is _ = Nothing
   satisfyM "QIdent" is
 
+-- Upper case, unqualified, alphanumeric identifier
 pUIdentA :: P Ident
 pUIdentA = do
   fn <- getFileName
@@ -72,14 +74,17 @@
     is _ = Nothing
   satisfyM "UIdent" is
 
+-- Upper case, unqualified, identifier
 pUIdent :: P Ident
 pUIdent =
       pUIdentA
   <|< pUIdentSpecial
 
+-- Upper case, unqualified, identifier or symbol
 pUIdentSym :: P Ident
 pUIdentSym = pUIdent <|< pParens pUSymOper
 
+-- Special "identifiers": () [] (,) ...
 pUIdentSpecial :: P Ident
 pUIdentSpecial = do
   fn <- getFileName
@@ -91,6 +96,7 @@
     <|< (mk "()" <$ (pSpec '(' *> pSpec ')'))  -- Allow () as a constructor name
     <|< (mk "[]" <$ (pSpec '[' *> pSpec ']'))  -- Allow [] as a constructor name
 
+-- Upper case, possibly qualified, alphanumeric identifier
 pUQIdentA :: P Ident
 pUQIdentA = do
   fn <- getFileName
@@ -99,11 +105,13 @@
     is _ = Nothing
   satisfyM "UQIdent" is
 
+-- Upper case, possibly qualified, identifier
 pUQIdent :: P Ident
 pUQIdent =
       pUQIdentA
   <|< pUIdentSpecial
 
+-- Lower case, unqualified identifier
 pLIdent :: P Ident
 pLIdent = do
   fn <- getFileName
@@ -112,6 +120,7 @@
     is _ = Nothing
   satisfyM "LIdent" is
 
+-- Lower case, possibly qualified identifier
 pLQIdent :: P Ident
 pLQIdent = do
   fn <- getFileName
@@ -249,7 +258,7 @@
 pExportItem :: P ExportItem
 pExportItem =
       ExpModule <$> (pKeyword "module" *> pUQIdent)
-  <|< ExpTypeCon <$> (pUQIdentSym <* pSpec '(' <* pSymbol ".." <* pSpec ')')
+  <|< ExpTypeCon <$> (pUQIdentSym <* pSpec '(' <* pConList <* pSpec ')')
   <|< ExpType <$> pUQIdentSym
   <|< ExpValue <$> pLQIdentSym
 
@@ -280,7 +289,7 @@
       TSpec _ '>' -> pSpec '>'
       _           -> mapTokenState popLayout
     pure as
-  where body = esepBy p (pSpec ';') <* eoptional (pSpec ';')
+  where body = esepBy p (esome (pSpec ';')) <* eoptional (pSpec ';')
 
 
 pDef :: P EDef
@@ -361,9 +370,12 @@
 
 pImportItem :: P ImportItem
 pImportItem =
-      ImpTypeCon <$> (pUQIdentSym <* pSpec '(' <* pSymbol ".." <* pSpec ')')
+      ImpTypeCon <$> (pUQIdentSym <* pSpec '(' <* pConList <* pSpec ')')
   <|< ImpType <$> pUQIdentSym
   <|< ImpValue <$> pLQIdentSym
+
+pConList :: P ()
+pConList = pSymbol ".." <|< (() <$ esepBy1 pQIdent (pSpec ','))   -- XXX treat list as ..
 
 --------
 -- Types
--