@@ -13,7 +13,8 @@ module Analysis.Syntax.Python
1313, parse
1414) where
1515
16- import Analysis.Effect.Domain hiding ((:>>>) )
16+ import Analysis.Effect.Domain hiding ((:>>>) , (>>>) )
17+ import qualified Analysis.Effect.Domain as D
1718import qualified Analysis.Effect.Statement as S
1819import Analysis.Name
1920import Analysis.Reference
@@ -22,10 +23,9 @@ import Analysis.VM
2223import Control.Effect.Labelled
2324import Control.Effect.Reader
2425import Data.Function (fix )
25- import Data.List.NonEmpty (NonEmpty )
26- import Data.Text (Text )
26+ import Data.List.NonEmpty (NonEmpty ( .. ), nonEmpty )
27+ import Data.Text (Text , pack )
2728import qualified Language.Python.Common.AST as Py
28- import qualified Language.Python.Common.SrcLocation as Py
2929import Language.Python.Version3.Parser
3030import Source.Span (Span )
3131import System.FilePath (takeBaseName )
@@ -76,7 +76,7 @@ eval eval = \case
7676 t :>> u -> do
7777 t' <- eval t
7878 u' <- eval u
79- t' >>> u'
79+ t' D. >>> u'
8080 Import ns -> S. simport ns >> dunit
8181 Function n ps b -> letrec n (dabs ps (foldr (\ (p, a) m -> let' p a m) (eval b) . zip ps))
8282 Call f as -> do
@@ -87,12 +87,27 @@ eval eval = \case
8787 where
8888 setSpan s r = r{ refSpan = s }
8989
90+ (>>>) :: T. Term Python v -> T. Term Python v -> T. Term Python v
91+ l >>> r = T. Term (l :>> r)
92+
93+ noop :: T. Term Python v
94+ noop = T. Term Noop
95+
9096
9197-- Parsing
9298
93- parse :: FilePath -> IO (Py. Module Py. SrcSpan )
99+ parse :: FilePath -> IO (T. Term Python Name )
94100parse path = do
95101 src <- readFile path
96102 case parseModule src (takeBaseName path) of
97- Left err -> fail (show err)
98- Right (m, _) -> pure m
103+ Left err -> fail (show err)
104+ Right (Py. Module ss, _) -> foldr (>>>) noop <$> traverse statement ss
105+ where
106+ statement :: Py. Statement annot -> IO (T. Term Python Name )
107+ statement = \ case
108+ Py. Import is _ -> foldr ((>>>) . T. Term . Import ) noop <$> traverse importItem is
109+ _ -> fail " cannot ingest this Python statement"
110+ ident :: Py. Ident annot -> String
111+ ident (Py. Ident s _) = s
112+ importItem :: Py. ImportItem annot -> IO (NonEmpty Text )
113+ importItem Py. ImportItem { Py. import_item_name = ns } = maybe (fail " " ) pure (nonEmpty (map (pack . ident) ns)) -- FIXME: "as" names
0 commit comments