2019-10-01 18:25:14 +03:00
|
|
|
{-# LANGUAGE ApplicativeDo #-}
|
2019-10-02 00:01:50 +03:00
|
|
|
{-# LANGUAGE TypeApplications #-}
|
2019-10-02 00:02:08 +03:00
|
|
|
module CLI (main) where
|
2019-10-01 18:25:14 +03:00
|
|
|
|
2019-10-02 00:03:02 +03:00
|
|
|
import System.Environment
|
2019-10-02 00:03:37 +03:00
|
|
|
import TreeSitter.Unmarshal
|
|
|
|
import TreeSitter.Python.AST
|
|
|
|
import TreeSitter.Python
|
2019-10-02 00:03:18 +03:00
|
|
|
import Source.Range
|
|
|
|
import Source.Span
|
2019-10-02 01:35:50 +03:00
|
|
|
import Data.ByteString (readFile, ByteString)
|
2019-10-02 01:36:00 +03:00
|
|
|
import System.IO (FilePath)
|
2019-10-02 21:34:58 +03:00
|
|
|
import Options.Applicative hiding (style)
|
|
|
|
import Data.Semigroup ((<>))
|
2019-10-01 18:25:14 +03:00
|
|
|
|
2019-10-04 01:11:28 +03:00
|
|
|
main :: IO ()
|
|
|
|
main = generateAST =<< execParser opts
|
|
|
|
|
|
|
|
opts :: ParserInfo SemanticAST
|
|
|
|
opts = info (parseAST <**> helper)
|
|
|
|
( fullDesc
|
|
|
|
<> progDesc "Read a file, output an AST"
|
|
|
|
<> header "semantic-ast - generates ASTs" )
|
2019-10-04 01:11:44 +03:00
|
|
|
|
|
|
|
generateAST :: SemanticAST -> IO ()
|
|
|
|
generateAST (SemanticAST file _) = do
|
|
|
|
bytestring <- Data.ByteString.readFile file
|
|
|
|
print =<< parseByteString @TreeSitter.Python.AST.Module @(Range, Span) tree_sitter_python bytestring
|
2019-10-02 22:24:17 +03:00
|
|
|
data SemanticAST = SemanticAST
|
|
|
|
{ sourceFilePath :: Prelude.String
|
|
|
|
, format :: Prelude.String
|
|
|
|
}
|
2019-10-02 22:24:33 +03:00
|
|
|
|
|
|
|
parseAST :: Parser SemanticAST
|
|
|
|
parseAST = SemanticAST
|
|
|
|
<$> strOption
|
|
|
|
( long "semantic-ast"
|
|
|
|
<> metavar "FILEPATH"
|
|
|
|
<> help "Specify filepath containing source code to parse" )
|
|
|
|
<*> strOption
|
|
|
|
( long "format"
|
|
|
|
<> help "Specify format --json --sexpression --show" )
|
|
|
|
|
2019-10-02 22:25:03 +03:00
|
|
|
generateAST :: SemanticAST -> IO ()
|
|
|
|
generateAST (SemanticAST file _) = do
|
|
|
|
bytestring <- Data.ByteString.readFile file
|
2019-10-02 01:38:36 +03:00
|
|
|
print =<< parseByteString @TreeSitter.Python.AST.Module @(Range, Span) tree_sitter_python bytestring
|
2019-10-04 00:57:21 +03:00
|
|
|
|
|
|
|
input :: Parser Input
|
|
|
|
input = fileInput <|> stdInput
|
|
|
|
|
2019-10-04 00:56:54 +03:00
|
|
|
-- pass in a file as an argument and parse its contents
|
|
|
|
fileInput :: Parser Input
|
|
|
|
fileInput = FileInput <$> strOption
|
|
|
|
( long "file"
|
|
|
|
<> short 'f'
|
|
|
|
<> metavar "FILENAME"
|
|
|
|
<> help "Input file" )
|
|
|
|
|
2019-10-04 00:56:38 +03:00
|
|
|
-- cat something in
|
|
|
|
stdInput :: Parser Input
|
|
|
|
stdInput = flag' StdInput
|
|
|
|
( long "stdin"
|
|
|
|
<> help "Read from stdin" )
|