Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.

Commit 5e88d14

Browse files
committed
Parse imports.
1 parent 90ce217 commit 5e88d14

File tree

1 file changed

+23
-8
lines changed
  • semantic-analysis/src/Analysis/Syntax

1 file changed

+23
-8
lines changed

semantic-analysis/src/Analysis/Syntax/Python.hs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
1718
import qualified Analysis.Effect.Statement as S
1819
import Analysis.Name
1920
import Analysis.Reference
@@ -22,10 +23,9 @@ import Analysis.VM
2223
import Control.Effect.Labelled
2324
import Control.Effect.Reader
2425
import 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)
2728
import qualified Language.Python.Common.AST as Py
28-
import qualified Language.Python.Common.SrcLocation as Py
2929
import Language.Python.Version3.Parser
3030
import Source.Span (Span)
3131
import 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)
94100
parse 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

Comments
 (0)