Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions app/Command/Compile.hs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import Data.Text (Text)
import qualified Data.Text as T
import Data.Traversable (for)
import qualified Language.PureScript as P
import qualified Language.PureScript.CST as CST
import Language.PureScript.Errors.JSON
import Language.PureScript.Make
import qualified Options.Applicative as Opts
Expand Down Expand Up @@ -65,8 +66,8 @@ compile PSCMakeOptions{..} = do
exitFailure
moduleFiles <- readInput input
(makeErrors, makeWarnings) <- runMake pscmOpts $ do
ms <- P.parseModulesFromFiles id moduleFiles
let filePathMap = M.fromList $ map (\(fp, P.Module _ _ mn _ _) -> (mn, Right fp)) ms
ms <- CST.parseModulesFromFiles id moduleFiles
let filePathMap = M.fromList $ map (\(fp, pm) -> (P.getModuleName $ CST.resPartial pm, Right fp)) ms
foreigns <- inferForeignModules filePathMap
let makeActions = buildMakeActions pscmOutputDir filePathMap foreigns pscmUsePrefix
P.make makeActions (map snd ms)
Expand Down
3 changes: 2 additions & 1 deletion app/Command/Hierarchy.hs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import System.Exit (exitFailure, exitSuccess)
import System.IO (hPutStr, stderr)
import System.IO.UTF8 (readUTF8FileT)
import qualified Language.PureScript as P
import qualified Language.PureScript.CST as CST
import Language.PureScript.Hierarchy (Graph(..), _unDigraph, _unGraphName, typeClasses)

data HierarchyOptions = HierarchyOptions
Expand All @@ -43,7 +44,7 @@ data HierarchyOptions = HierarchyOptions
readInput :: [FilePath] -> IO (Either P.MultipleErrors [P.Module])
readInput paths = do
content <- mapM (\path -> (path, ) <$> readUTF8FileT path) paths
return $ map snd <$> P.parseModulesFromFiles id content
return $ map snd <$> CST.parseFromFiles id content

compile :: HierarchyOptions -> IO ()
compile (HierarchyOptions inputGlob mOutput) = do
Expand Down
5 changes: 3 additions & 2 deletions app/Command/REPL.hs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import Data.Text (Text, unpack)
import Data.Traversable (for)
import qualified Language.PureScript as P
import qualified Language.PureScript.Bundle as Bundle
import qualified Language.PureScript.CST as CST
import Language.PureScript.Interactive
import Network.HTTP.Types.Header (hContentType, hCacheControl,
hPragma, hExpires)
Expand Down Expand Up @@ -315,10 +316,10 @@ command = loop <$> options
when (null modules) . liftIO $ do
putStr noInputMessage
exitFailure
unless (supportModuleIsDefined (map snd modules)) . liftIO $ do
unless (supportModuleIsDefined (map (P.getModuleName . snd) modules)) . liftIO $ do
putStr supportModuleMessage
exitFailure
(externs, _) <- ExceptT . runMake . make $ modules
(externs, _) <- ExceptT . runMake . make $ fmap CST.pureResult <$> modules
return (modules, externs)
case psciBackend of
Backend setup eval reload (shutdown :: state -> IO ()) ->
Expand Down
5 changes: 5 additions & 0 deletions package.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,9 @@ library:
- ConstraintKinds
- DataKinds
- DeriveFunctor
- DeriveFoldable
- DeriveTraversable
- DeriveGeneric
- EmptyDataDecls
- FlexibleContexts
- KindSignatures
Expand Down Expand Up @@ -157,7 +160,9 @@ tests:
dependencies:
- purescript
- tasty
- tasty-golden
- tasty-hspec
- tasty-quickcheck
- hspec
- hspec-discover
- HUnit
Expand Down
2 changes: 2 additions & 0 deletions src/Language/PureScript/AST/Declarations.hs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import Language.PureScript.Comments
import Language.PureScript.Environment
import qualified Language.PureScript.Bundle as Bundle
import qualified Language.PureScript.Constants as C
import qualified Language.PureScript.CST.Errors as CST

import qualified Text.Parsec as P

Expand Down Expand Up @@ -68,6 +69,7 @@ data SimpleErrorMessage
= ModuleNotFound ModuleName
| ErrorParsingFFIModule FilePath (Maybe Bundle.ErrorMessage)
| ErrorParsingModule P.ParseError
| ErrorParsingCSTModule CST.ParserError
| MissingFFIModule ModuleName
| UnnecessaryFFIModule ModuleName FilePath
| MissingFFIImplementations ModuleName [Ident]
Expand Down
89 changes: 89 additions & 0 deletions src/Language/PureScript/CST.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
module Language.PureScript.CST
( parseFromFile
, parseFromFiles
, parseModuleFromFile
, parseModulesFromFiles
, unwrapParserError
, toMultipleErrors
, toPositionedError
, pureResult
, module Language.PureScript.CST.Convert
, module Language.PureScript.CST.Errors
, module Language.PureScript.CST.Parser
, module Language.PureScript.CST.Types
) where

import Prelude

import Control.Monad.Error.Class (MonadError(..))
import Control.Parallel.Strategies (withStrategy, parList, evalTuple2, r0, rseq)
import qualified Data.List.NonEmpty as NE
import Data.Text (Text)
import qualified Language.PureScript.AST as AST
import qualified Language.PureScript.Errors as E
import Language.PureScript.CST.Convert
import Language.PureScript.CST.Errors
import Language.PureScript.CST.Parser
import Language.PureScript.CST.Types

pureResult :: a -> PartialResult a
pureResult a = PartialResult a (pure a)

parseModulesFromFiles
:: forall m k
. MonadError E.MultipleErrors m
=> (k -> FilePath)
-> [(k, Text)]
-> m [(k, PartialResult AST.Module)]
parseModulesFromFiles toFilePath input =
flip E.parU (handleParserError toFilePath)
. inParallel
. flip fmap input
$ \(k, a) -> (k, parseModuleFromFile (toFilePath k) a)

parseFromFiles
:: forall m k
. MonadError E.MultipleErrors m
=> (k -> FilePath)
-> [(k, Text)]
-> m [(k, AST.Module)]
parseFromFiles toFilePath input =
flip E.parU (handleParserError toFilePath)
. inParallel
. flip fmap input
$ \(k, a) -> (k, parseFromFile (toFilePath k) a)

parseModuleFromFile :: FilePath -> Text -> Either (NE.NonEmpty ParserError) (PartialResult AST.Module)
parseModuleFromFile fp content = fmap (convertModule fp) <$> parseModule content

parseFromFile :: FilePath -> Text -> Either (NE.NonEmpty ParserError) AST.Module
parseFromFile fp content = convertModule fp <$> parse content

handleParserError
:: forall m k a
. MonadError E.MultipleErrors m
=> (k -> FilePath)
-> (k, Either (NE.NonEmpty ParserError) a)
-> m (k, a)
handleParserError toFilePath (k, res) =
(k,) <$> unwrapParserError (toFilePath k) res

unwrapParserError
:: forall m a
. MonadError E.MultipleErrors m
=> FilePath
-> Either (NE.NonEmpty ParserError) a
-> m a
unwrapParserError fp =
either (throwError . toMultipleErrors fp) pure

toMultipleErrors :: FilePath -> NE.NonEmpty ParserError -> E.MultipleErrors
toMultipleErrors fp =
E.MultipleErrors . NE.toList . fmap (toPositionedError fp)

toPositionedError :: FilePath -> ParserError -> E.ErrorMessage
toPositionedError name perr =
E.ErrorMessage [E.positionedError $ sourceSpan name $ errRange perr] (E.ErrorParsingCSTModule perr)

inParallel :: [(k, Either (NE.NonEmpty ParserError) a)] -> [(k, Either (NE.NonEmpty ParserError) a)]
inParallel = withStrategy (parList (evalTuple2 r0 rseq))
Loading