Parse more stuff
This commit is contained in:
parent
81b058f033
commit
ebf62b8d4f
|
@ -9,6 +9,10 @@ module Data.Language.Ruby.AST
|
||||||
, Name(..)
|
, Name(..)
|
||||||
, Send(..)
|
, Send(..)
|
||||||
, Namespace(..)
|
, Namespace(..)
|
||||||
|
, RBlock(..)
|
||||||
|
, Casgn(..)
|
||||||
|
, RArray(..)
|
||||||
|
, Anything(..)
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Aeson (parseJSON, Value(..), withArray)
|
import Data.Aeson (parseJSON, Value(..), withArray)
|
||||||
|
@ -49,9 +53,10 @@ data Statement
|
||||||
| StmtFunction Function
|
| StmtFunction Function
|
||||||
| StmtSend Send
|
| StmtSend Send
|
||||||
| StmtRBlock RBlock
|
| StmtRBlock RBlock
|
||||||
-- TODO: We should also handle modules here. Otherwise we cannot
|
|
||||||
-- cover the case where a function references a module.
|
|
||||||
| StmtConst Namespace
|
| StmtConst Namespace
|
||||||
|
| StmtCasgn Casgn
|
||||||
|
| StmtArray RArray
|
||||||
|
-- TODO Get rid of this
|
||||||
| StmtAnything Anything
|
| StmtAnything Anything
|
||||||
|
|
||||||
deriving stock instance Show Statement
|
deriving stock instance Show Statement
|
||||||
|
@ -77,8 +82,45 @@ instance FromJSON Statement where
|
||||||
<|> (StmtSend <$> parseJSON v)
|
<|> (StmtSend <$> parseJSON v)
|
||||||
<|> (StmtRBlock <$> parseJSON v)
|
<|> (StmtRBlock <$> parseJSON v)
|
||||||
<|> (StmtConst <$> parseJSON v)
|
<|> (StmtConst <$> parseJSON v)
|
||||||
|
<|> (StmtCasgn <$> parseJSON v)
|
||||||
|
<|> (StmtArray <$> parseJSON v)
|
||||||
<|> (StmtAnything <$> parseJSON v)
|
<|> (StmtAnything <$> parseJSON v)
|
||||||
|
|
||||||
|
data Casgn = Casgn
|
||||||
|
{ name :: Name
|
||||||
|
, statement :: Statement
|
||||||
|
}
|
||||||
|
deriving stock instance Show Casgn
|
||||||
|
deriving stock instance Ord Casgn
|
||||||
|
deriving stock instance Eq Casgn
|
||||||
|
deriving stock instance Generic Casgn
|
||||||
|
instance ToJSON Casgn where
|
||||||
|
toEncoding = Aeson.genericToEncoding aesonOptions
|
||||||
|
instance FromJSON Casgn where
|
||||||
|
parseJSON = withArray "Module" $ \case
|
||||||
|
[String "casgn", _, name, statement]
|
||||||
|
-> Casgn
|
||||||
|
<$> parseJSON name
|
||||||
|
<*> parseJSON statement
|
||||||
|
_ -> empty
|
||||||
|
|
||||||
|
|
||||||
|
data RArray = RArray
|
||||||
|
{ statements :: [Statement]
|
||||||
|
}
|
||||||
|
deriving stock instance Show RArray
|
||||||
|
deriving stock instance Ord RArray
|
||||||
|
deriving stock instance Eq RArray
|
||||||
|
deriving stock instance Generic RArray
|
||||||
|
instance ToJSON RArray where
|
||||||
|
toEncoding = Aeson.genericToEncoding aesonOptions
|
||||||
|
instance FromJSON RArray where
|
||||||
|
parseJSON = withArray "RArray" $ \as -> case Vector.toList as of
|
||||||
|
String "array":xs
|
||||||
|
-> RArray
|
||||||
|
<$> traverse parseJSON xs
|
||||||
|
_ -> empty
|
||||||
|
|
||||||
newtype Anything = Anything Value
|
newtype Anything = Anything Value
|
||||||
|
|
||||||
deriving stock instance Show Anything
|
deriving stock instance Show Anything
|
||||||
|
|
|
@ -186,9 +186,20 @@ instance References Statement where
|
||||||
StmtFunction f -> entries f
|
StmtFunction f -> entries f
|
||||||
StmtSend s -> entries s
|
StmtSend s -> entries s
|
||||||
StmtConst c -> entries c
|
StmtConst c -> entries c
|
||||||
-- TODO:
|
StmtRBlock b -> entries b
|
||||||
StmtRBlock{} -> pure ()
|
StmtCasgn c -> entries c
|
||||||
StmtAnything{} -> pure ()
|
StmtArray a -> entries a
|
||||||
|
StmtAnything a -> entries a
|
||||||
|
|
||||||
|
-- TODO
|
||||||
|
instance References Ruby.RBlock where
|
||||||
|
entries = const $ pure ()
|
||||||
|
instance References Ruby.Casgn where
|
||||||
|
entries = const $ pure ()
|
||||||
|
instance References Ruby.RArray where
|
||||||
|
entries = const $ pure ()
|
||||||
|
instance References Ruby.Anything where
|
||||||
|
entries = const $ pure ()
|
||||||
|
|
||||||
instance References Ruby.Namespace where
|
instance References Ruby.Namespace where
|
||||||
entries = \case
|
entries = \case
|
||||||
|
|
Loading…
Reference in a new issue