mirror of
https://github.com/google/ormolu.git
synced 2024-12-18 04:51:29 +03:00
Merge pull request #3 from tweag/implement-parser
Implement basic parser for fooling around
This commit is contained in:
commit
912ea9b28d
25
app/Main.hs
25
app/Main.hs
@ -1,4 +1,27 @@
|
|||||||
module Main (main) where
|
module Main (main) where
|
||||||
|
|
||||||
|
import Control.Monad
|
||||||
|
import Ormolu.Parser
|
||||||
|
import System.Environment (getArgs)
|
||||||
|
import qualified Outputable as GHC
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = return ()
|
main = do
|
||||||
|
(path:_) <- getArgs
|
||||||
|
input <- readFile path
|
||||||
|
(ws, r) <- parseModule [] path input
|
||||||
|
unless (null ws) $
|
||||||
|
putStrLn "dynamic option warnings:"
|
||||||
|
-- TODO print ws
|
||||||
|
case r of
|
||||||
|
Left (srcSpan, err) -> do
|
||||||
|
putStrLn (showOutputable srcSpan)
|
||||||
|
putStrLn err
|
||||||
|
Right (anns, parsedModule) -> do
|
||||||
|
putStrLn "\nannotations:\n"
|
||||||
|
putStrLn (showOutputable anns)
|
||||||
|
putStrLn "\nparsed module:\n"
|
||||||
|
putStrLn (showOutputable parsedModule)
|
||||||
|
|
||||||
|
showOutputable :: GHC.Outputable o => o -> String
|
||||||
|
showOutputable = GHC.showSDocUnsafe . GHC.ppr
|
||||||
|
11
ormolu.cabal
11
ormolu.cabal
@ -25,7 +25,11 @@ flag dev
|
|||||||
|
|
||||||
library
|
library
|
||||||
hs-source-dirs: src
|
hs-source-dirs: src
|
||||||
build-depends: base
|
build-depends: base >= 4.8 && < 5.0
|
||||||
|
, data-default-class
|
||||||
|
, ghc >= 8.4.3
|
||||||
|
, ghc-boot-th >= 8.4.3
|
||||||
|
, ghc-exactprint >= 0.5.6
|
||||||
exposed-modules: Ormolu
|
exposed-modules: Ormolu
|
||||||
, Ormolu.Parser
|
, Ormolu.Parser
|
||||||
, Ormolu.Printer
|
, Ormolu.Printer
|
||||||
@ -45,7 +49,7 @@ test-suite tests
|
|||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
hs-source-dirs: tests
|
hs-source-dirs: tests
|
||||||
type: exitcode-stdio-1.0
|
type: exitcode-stdio-1.0
|
||||||
build-depends: base
|
build-depends: base >= 4.8 && < 5.0
|
||||||
, ormolu
|
, ormolu
|
||||||
if flag(dev)
|
if flag(dev)
|
||||||
ghc-options: -Wall -Werror
|
ghc-options: -Wall -Werror
|
||||||
@ -56,7 +60,8 @@ test-suite tests
|
|||||||
executable ormolu
|
executable ormolu
|
||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
hs-source-dirs: app
|
hs-source-dirs: app
|
||||||
build-depends: base
|
build-depends: base >= 4.8 && < 5.0
|
||||||
|
, ghc >= 8.4.3
|
||||||
, ormolu
|
, ormolu
|
||||||
if flag(dev)
|
if flag(dev)
|
||||||
ghc-options: -Wall -Werror -Wcompat
|
ghc-options: -Wall -Werror -Wcompat
|
||||||
|
@ -1,3 +1,22 @@
|
|||||||
module Ormolu.Parser
|
module Ormolu.Parser
|
||||||
( )
|
( parseModule )
|
||||||
where
|
where
|
||||||
|
|
||||||
|
import Language.Haskell.GHC.ExactPrint.Parsers hiding (parseModule)
|
||||||
|
import Language.Haskell.GHC.ExactPrint.Types
|
||||||
|
import Ormolu.Type
|
||||||
|
import qualified CmdLineParser as GHC
|
||||||
|
import qualified DynFlags as GHC
|
||||||
|
import qualified GHC hiding (parseModule)
|
||||||
|
|
||||||
|
-- | Parse a complete module from string.
|
||||||
|
|
||||||
|
parseModule
|
||||||
|
:: [DynOption] -- ^ Dynamic options that affect parsing
|
||||||
|
-> FilePath -- ^ File name (only for source location annotations)
|
||||||
|
-> String -- ^ Input for parser
|
||||||
|
-> IO ([GHC.Warn], Either (GHC.SrcSpan, String) (Anns, GHC.ParsedSource))
|
||||||
|
parseModule dynOpts path input = ghcWrapper $ do
|
||||||
|
dynFlags0 <- initDynFlagsPure path input
|
||||||
|
(dynFlags1, _, ws) <- GHC.parseDynamicFilePragma dynFlags0 (dynOption <$> dynOpts)
|
||||||
|
return (ws, parseModuleFromStringInternal dynFlags1 path input)
|
||||||
|
@ -1,3 +1,35 @@
|
|||||||
module Ormolu.Type
|
module Ormolu.Type
|
||||||
( )
|
( Config (..)
|
||||||
|
, DynOption (..)
|
||||||
|
, dynOption
|
||||||
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
|
import Data.Default.Class
|
||||||
|
import qualified SrcLoc as GHC
|
||||||
|
|
||||||
|
-- | Ormolu configuration.
|
||||||
|
|
||||||
|
data Config = Config
|
||||||
|
{ cfgLineWidth :: Int
|
||||||
|
, cfgIndentStep :: Int
|
||||||
|
, cfgDynOptions :: [DynOption]
|
||||||
|
}
|
||||||
|
|
||||||
|
instance Default Config where
|
||||||
|
def = Config
|
||||||
|
{ cfgLineWidth = 80
|
||||||
|
, cfgIndentStep = 2
|
||||||
|
, cfgDynOptions = []
|
||||||
|
}
|
||||||
|
|
||||||
|
-- | A wrapper for dynamic options.
|
||||||
|
|
||||||
|
newtype DynOption = DynOption
|
||||||
|
{ unDynOption :: String
|
||||||
|
} deriving (Eq, Ord, Show)
|
||||||
|
|
||||||
|
-- | Convert 'DynOption' to @'GHC.Located' 'String'@.
|
||||||
|
|
||||||
|
dynOption :: DynOption -> GHC.Located String
|
||||||
|
dynOption (DynOption o) = GHC.L GHC.noSrcSpan o
|
||||||
|
Loading…
Reference in New Issue
Block a user