git.iko.soy/rowtype-yoga/purescript-native
on d3f368b help sign in
171 lines 4.8 kB history raw
1-----------------------------------------------------------------------------
2--
3-- Module : Language.PureScript.Declarations
4-- Copyright : (c) Phil Freeman 2013
5-- License : MIT
6--
7-- Maintainer : Phil Freeman <paf31@cantab.net>
8-- Stability : experimental
9-- Portability :
10--
11-- | Data types for modules and declarations
12--
13-----------------------------------------------------------------------------
15{-# LANGUAGE DeriveDataTypeable #-}
17module Language.PureScript.Declarations where
19import Language.PureScript.Values
20import Language.PureScript.Types
21import Language.PureScript.Names
22import Language.PureScript.Kinds
23import Language.PureScript.CodeGen.JS.AST
25import qualified Data.Data as D
27-- |
28-- A precedence level for an infix operator
29--
30type Precedence = Integer
32-- |
33-- Associativity for infix operators
34--
35data Associativity = Infixl | Infixr deriving (Show, D.Data, D.Typeable)
37-- |
38-- Fixity data for infix operators
39--
40data Fixity = Fixity Associativity Precedence deriving (Show, D.Data, D.Typeable)
42-- |
43-- A module declaration, consisting of a module name and a list of declarations
44--
45data Module = Module ModuleName [Declaration] deriving (Show, D.Data, D.Typeable)
47-- |
48-- The type of a foreign import
49--
50data ForeignImportType
51 -- |
52 -- A regular foreign import
53 --
54 = ForeignImport
55 -- |
56 -- A foreign import which contains inline Javascript as a string literal
57 --
58 | InlineJavascript
59 -- |
60 -- A type class dictionary import, generated during desugaring of type class declarations
61 --
62 | TypeClassDictionaryImport
63 -- |
64 -- A type class dictionary member accessor import, generated during desugaring of type class declarations
65 --
66 | TypeClassAccessorImport deriving (Show, Eq, D.Data, D.Typeable)
68-- |
69-- The data type of declarations
70--
71data Declaration
72 -- |
73 -- A data type declaration (name, arguments, data constructors)
74 --
75 = DataDeclaration ProperName [String] [(ProperName, [Type])]
76 -- |
77 -- A minimal mutually recursive set of data type declarations
78 --
79 | DataBindingGroupDeclaration [Declaration]
80 -- |
81 -- A type synonym declaration (name, arguments, type)
82 --
83 | TypeSynonymDeclaration ProperName [String] Type
84 -- |
85 -- A type declaration for a value (name, ty)
86 --
87 | TypeDeclaration Ident Type
88 -- |
89 -- A value declaration (name, top-level binders, optional guard, value)
90 --
91 | ValueDeclaration Ident [Binder] (Maybe Guard) Value
92 -- |
93 -- A minimal mutually recursive set of value declarations
94 --
95 | BindingGroupDeclaration [(Ident, Value)]
96 -- |
97 -- A foreign import declaration (type, name, optional inline Javascript, type)
98 --
99 | ExternDeclaration ForeignImportType Ident (Maybe JS) Type
100 -- |
101 -- A data type foreign import (name, kind)
102 --
103 | ExternDataDeclaration ProperName Kind
104 -- |
105 -- A fixity declaration (fixity data, operator name)
106 --
107 | FixityDeclaration Fixity String
108 -- |
109 -- A module import (module name, optional set of identifiers to import)
110 --
111 | ImportDeclaration ModuleName (Maybe [Either Ident ProperName])
112 -- |
113 -- A type class declaration (name, argument, member declarations)
114 --
115 | TypeClassDeclaration ProperName String [Declaration]
116 -- |
117 -- A type instance declaration (dependencies, class name, instance type, member declarations)
118 --
119 | TypeInstanceDeclaration [(Qualified ProperName, Type)] (Qualified ProperName) Type [Declaration]
120 deriving (Show, D.Data, D.Typeable)
122-- |
123-- Test if a declaration is a value declaration
124--
125isValueDecl :: Declaration -> Bool
126isValueDecl (ValueDeclaration _ _ _ _) = True
127isValueDecl _ = False
129-- |
130-- Test if a declaration is a data type or type synonym declaration
131--
132isDataDecl :: Declaration -> Bool
133isDataDecl (DataDeclaration _ _ _) = True
134isDataDecl (TypeSynonymDeclaration _ _ _) = True
135isDataDecl _ = False
137-- |
138-- Test if a declaration is a module import
139--
140isImportDecl :: Declaration -> Bool
141isImportDecl (ImportDeclaration _ _) = True
142isImportDecl _ = False
144-- |
145-- Test if a declaration is a data type foreign import
146--
147isExternDataDecl :: Declaration -> Bool
148isExternDataDecl (ExternDataDeclaration _ _) = True
149isExternDataDecl _ = False
151-- |
152-- Test if a declaration is a fixity declaration
153--
154isFixityDecl :: Declaration -> Bool
155isFixityDecl (FixityDeclaration _ _) = True
156isFixityDecl _ = False
158-- |
159-- Test if a declaration is a foreign import
160--
161isExternDecl :: Declaration -> Bool
162isExternDecl (ExternDeclaration _ _ _ _) = True
163isExternDecl _ = False
165-- |
166-- Test if a declaration is a type class or instance declaration
167--
168isTypeClassDeclaration :: Declaration -> Bool
169isTypeClassDeclaration (TypeClassDeclaration _ _ _) = True
170isTypeClassDeclaration (TypeInstanceDeclaration _ _ _ _) = True
171isTypeClassDeclaration _ = False