1{-# OPTIONS_GHC -Wwarn #-}
2
3-- | GHC language options parser
4module Ide.Plugin.Eval.Parse.Option (
5    langOptions,
6    parseSetFlags,
7) where
8
9import           Control.Arrow        (left)
10import           Data.Void            (Void)
11import           Text.Megaparsec
12import           Text.Megaparsec.Char
13
14{- |
15>>> langOptions ":set   -XBinaryLiterals  -XOverloadedStrings "
16Right ["BinaryLiterals","OverloadedStrings"]
17
18>>> langOptions ":set"
19Right []
20
21>>> langOptions ""
22Left "No match"
23-}
24langOptions :: String -> Either String [String]
25langOptions =
26  left errorBundlePretty
27  . parse (space *> languageOpts <* eof) ""
28
29parseSetFlags :: String -> Maybe String
30parseSetFlags = parseMaybe
31    (hspace *> chunk ":set"
32        *> hspace1 *> takeRest
33        :: Parsec Void String String
34    )
35
36-- >>> parseMaybe languageOpts ":set -XBinaryLiterals -XOverloadedStrings"
37-- Just ["BinaryLiterals","OverloadedStrings"]
38languageOpts :: Parsec Void String [String]
39languageOpts = string ":set" *> space1
40  *> many (string "-X" *> many letterChar <* space)
41