----------------------------------------------------------------------------- -- -- Module : Language.PureScript.Declarations -- Copyright : (c) Phil Freeman 2013 -- License : MIT -- -- Maintainer : Phil Freeman -- Stability : experimental -- Portability : -- -- | Data types for modules and declarations -- ----------------------------------------------------------------------------- {-# LANGUAGE DeriveDataTypeable #-} module Language.PureScript.Declarations where import Language.PureScript.Values import Language.PureScript.Types import Language.PureScript.Names import Language.PureScript.Kinds import Language.PureScript.CodeGen.JS.AST import qualified Data.Data as D -- | -- A precedence level for an infix operator -- type Precedence = Integer -- | -- Associativity for infix operators -- data Associativity = Infixl | Infixr deriving (Show, D.Data, D.Typeable) -- | -- Fixity data for infix operators -- data Fixity = Fixity Associativity Precedence deriving (Show, D.Data, D.Typeable) -- | -- A module declaration, consisting of a module name and a list of declarations -- data Module = Module ProperName [Declaration] deriving (Show, D.Data, D.Typeable) -- | -- The type of a foreign import -- data ForeignImportType -- | -- A regular foreign import -- = ForeignImport -- | -- A foreign import which contains inline Javascript as a string literal -- | InlineJavascript -- | -- A type class dictionary import, generated during desugaring of type class declarations -- | TypeClassDictionaryImport -- | -- A type class dictionary member accessor import, generated during desugaring of type class declarations -- | TypeClassAccessorImport deriving (Show, Eq, D.Data, D.Typeable) -- | -- The data type of declarations -- data Declaration -- | -- A data type declaration (name, arguments, data constructors) -- = DataDeclaration ProperName [String] [(ProperName, Maybe Type)] -- | -- A minimal mutually recursive set of data type declarations -- | DataBindingGroupDeclaration [Declaration] -- | -- A type synonym declaration (name, arguments, type) -- | TypeSynonymDeclaration ProperName [String] Type -- | -- A type declaration for a value (name, ty) -- | TypeDeclaration Ident Type -- | -- A value declaration (name, top-level binders, optional guard, value) -- | ValueDeclaration Ident [Binder] (Maybe Guard) Value -- | -- A minimal mutually recursive set of value declarations -- | BindingGroupDeclaration [(Ident, Value)] -- | -- A foreign import declaration (type, name, optional inline Javascript, type) -- | ExternDeclaration ForeignImportType Ident (Maybe JS) Type -- | -- A data type foreign import (name, kind) -- | ExternDataDeclaration ProperName Kind -- | -- A fixity declaration (fixity data, operator name) -- | FixityDeclaration Fixity String -- | -- A module import (module name, optional set of identifiers to import) -- | ImportDeclaration ModuleName (Maybe [Either Ident ProperName]) -- | -- A type class declaration (name, argument, member declarations) -- | TypeClassDeclaration ProperName String [Declaration] -- | -- A type instance declaration (dependencies, class name, instance type, member declarations) -- | TypeInstanceDeclaration [(Qualified ProperName, Type)] (Qualified ProperName) Type [Declaration] deriving (Show, D.Data, D.Typeable) -- | -- Test if a declaration is a value declaration -- isValueDecl :: Declaration -> Bool isValueDecl (ValueDeclaration _ _ _ _) = True isValueDecl _ = False -- | -- Test if a declaration is a data type or type synonym declaration -- isDataDecl :: Declaration -> Bool isDataDecl (DataDeclaration _ _ _) = True isDataDecl (TypeSynonymDeclaration _ _ _) = True isDataDecl _ = False -- | -- Test if a declaration is a module import -- isImportDecl :: Declaration -> Bool isImportDecl (ImportDeclaration _ _) = True isImportDecl _ = False -- | -- Test if a declaration is a data type foreign import -- isExternDataDecl :: Declaration -> Bool isExternDataDecl (ExternDataDeclaration _ _) = True isExternDataDecl _ = False -- | -- Test if a declaration is a fixity declaration -- isFixityDecl :: Declaration -> Bool isFixityDecl (FixityDeclaration _ _) = True isFixityDecl _ = False -- | -- Test if a declaration is a foreign import -- isExternDecl :: Declaration -> Bool isExternDecl (ExternDeclaration _ _ _ _) = True isExternDecl _ = False -- | -- Test if a declaration is a type class or instance declaration -- isTypeClassDeclaration :: Declaration -> Bool isTypeClassDeclaration (TypeClassDeclaration _ _ _) = True isTypeClassDeclaration (TypeInstanceDeclaration _ _ _ _) = True isTypeClassDeclaration _ = False