diff --git a/src/Data/Language/Ruby/AST.hs b/src/Data/Language/Ruby/AST.hs index 7bda1f1..64d1ed0 100644 --- a/src/Data/Language/Ruby/AST.hs +++ b/src/Data/Language/Ruby/AST.hs @@ -9,6 +9,10 @@ module Data.Language.Ruby.AST , Name(..) , Send(..) , Namespace(..) + , RBlock(..) + , Casgn(..) + , RArray(..) + , Anything(..) ) where import Data.Aeson (parseJSON, Value(..), withArray) @@ -49,9 +53,10 @@ data Statement | StmtFunction Function | StmtSend Send | StmtRBlock RBlock - -- TODO: We should also handle modules here. Otherwise we cannot - -- cover the case where a function references a module. | StmtConst Namespace + | StmtCasgn Casgn + | StmtArray RArray + -- TODO Get rid of this | StmtAnything Anything deriving stock instance Show Statement @@ -77,8 +82,45 @@ instance FromJSON Statement where <|> (StmtSend <$> parseJSON v) <|> (StmtRBlock <$> parseJSON v) <|> (StmtConst <$> parseJSON v) + <|> (StmtCasgn <$> parseJSON v) + <|> (StmtArray <$> 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 deriving stock instance Show Anything diff --git a/src/Rubyhs/References.hs b/src/Rubyhs/References.hs index 2fa11fd..1376ec9 100644 --- a/src/Rubyhs/References.hs +++ b/src/Rubyhs/References.hs @@ -186,9 +186,20 @@ instance References Statement where StmtFunction f -> entries f StmtSend s -> entries s StmtConst c -> entries c - -- TODO: - StmtRBlock{} -> pure () - StmtAnything{} -> pure () + StmtRBlock b -> entries b + StmtCasgn c -> entries c + 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 entries = \case