|
1 | 1 | {-# LANGUAGE DuplicateRecordFields #-} |
| 2 | +{-# OPTIONS_GHC -Wno-orphans #-} |
2 | 3 |
|
3 | 4 | module LambdaBuffers.Compiler.ProtoCompat.Types ( |
4 | 5 | ClassDef (..), |
@@ -44,11 +45,12 @@ module LambdaBuffers.Compiler.ProtoCompat.Types ( |
44 | 45 | ) where |
45 | 46 |
|
46 | 47 | import Control.Exception (Exception) |
47 | | -import Data.List.NonEmpty (NonEmpty) |
| 48 | +import Data.List.NonEmpty (NonEmpty ((:|)), (<|)) |
48 | 49 | import Data.Map qualified as M |
49 | | -import Data.Text (Text) |
| 50 | +import Data.Text (Text, pack) |
50 | 51 | import GHC.Generics (Generic) |
51 | 52 | import LambdaBuffers.Compiler.KindCheck.Variable as VARS (Atom, Var) |
| 53 | +import Test.QuickCheck (Arbitrary (arbitrary), Gen, oneof, sized) |
52 | 54 |
|
53 | 55 | data SourceInfo = SourceInfo {file :: Text, posFrom :: SourcePosition, posTo :: SourcePosition} |
54 | 56 | deriving stock (Show, Eq, Ord, Generic) |
@@ -84,106 +86,58 @@ data ClassName = ClassName {name :: Text, sourceInfo :: SourceInfo} |
84 | 86 | newtype Kind = Kind {kind :: KindType} |
85 | 87 | deriving stock (Show, Eq, Ord, Generic) |
86 | 88 |
|
87 | | -data KindType |
88 | | - = KindRef KindRefType |
89 | | - | KindArrow Kind Kind |
| 89 | +data KindType = KindRef KindRefType | KindArrow Kind Kind |
90 | 90 | deriving stock (Show, Eq, Ord, Generic) |
91 | 91 |
|
92 | | -data KindRefType |
93 | | - = KUnspecified |
94 | | - | KType |
| 92 | +data KindRefType = KUnspecified | KType |
95 | 93 | deriving stock (Show, Eq, Ord, Generic) |
96 | 94 |
|
97 | 95 | data TyVar = TyVar {varName :: VarName, sourceInfo :: SourceInfo} |
98 | 96 | deriving stock (Show, Eq, Ord, Generic) |
99 | 97 |
|
100 | | -data Ty |
101 | | - = TyVarI TyVar |
102 | | - | TyAppI TyApp |
103 | | - | TyRefI TyRef |
| 98 | +data Ty = TyVarI TyVar | TyAppI TyApp | TyRefI TyRef |
104 | 99 | deriving stock (Show, Eq, Ord, Generic) |
105 | 100 |
|
106 | | -data TyApp = TyApp |
107 | | - { tyFunc :: Ty |
108 | | - , tyArgs :: NonEmpty Ty |
109 | | - , sourceInfo :: SourceInfo |
110 | | - } |
| 101 | +data TyApp = TyApp {tyFunc :: Ty, tyArgs :: NonEmpty Ty, sourceInfo :: SourceInfo} |
111 | 102 | deriving stock (Show, Eq, Ord, Generic) |
112 | 103 |
|
113 | | -data ForeignRef = ForeignRef |
114 | | - { tyName :: TyName |
115 | | - , moduleName :: ModuleName |
116 | | - , sourceInfo :: SourceInfo |
117 | | - } |
| 104 | +data ForeignRef = ForeignRef {tyName :: TyName, moduleName :: ModuleName, sourceInfo :: SourceInfo} |
118 | 105 | deriving stock (Show, Eq, Ord, Generic) |
119 | 106 |
|
120 | 107 | data LocalRef = LocalRef {tyName :: TyName, sourceInfo :: SourceInfo} |
121 | 108 | deriving stock (Show, Eq, Ord, Generic) |
122 | 109 |
|
123 | | -data TyRef |
124 | | - = LocalI LocalRef |
125 | | - | ForeignI ForeignRef |
| 110 | +data TyRef = LocalI LocalRef | ForeignI ForeignRef |
126 | 111 | deriving stock (Show, Eq, Ord, Generic) |
127 | 112 |
|
128 | | -data TyDef = TyDef |
129 | | - { tyName :: TyName |
130 | | - , tyAbs :: TyAbs |
131 | | - , sourceInfo :: SourceInfo |
132 | | - } |
| 113 | +data TyDef = TyDef {tyName :: TyName, tyAbs :: TyAbs, sourceInfo :: SourceInfo} |
133 | 114 | deriving stock (Show, Eq, Ord, Generic) |
134 | 115 |
|
135 | | -data TyAbs = TyAbs |
136 | | - { tyArgs :: [TyArg] |
137 | | - , tyBody :: TyBody |
138 | | - , sourceInfo :: SourceInfo |
139 | | - } |
| 116 | +data TyAbs = TyAbs {tyArgs :: [TyArg], tyBody :: TyBody, sourceInfo :: SourceInfo} |
140 | 117 | deriving stock (Show, Eq, Ord, Generic) |
141 | 118 |
|
142 | | -data TyArg = TyArg |
143 | | - { argName :: VarName |
144 | | - , argKind :: Kind |
145 | | - , sourceInfo :: SourceInfo |
146 | | - } |
| 119 | +data TyArg = TyArg {argName :: VarName, argKind :: Kind, sourceInfo :: SourceInfo} |
147 | 120 | deriving stock (Show, Eq, Ord, Generic) |
148 | 121 |
|
149 | | -data TyBody |
150 | | - = OpaqueI SourceInfo |
151 | | - | SumI Sum |
| 122 | +data TyBody = OpaqueI SourceInfo | SumI Sum |
152 | 123 | deriving stock (Show, Eq, Ord, Generic) |
153 | 124 |
|
154 | | -data Constructor = Constructor |
155 | | - { constrName :: ConstrName |
156 | | - , product :: Product |
157 | | - } |
| 125 | +data Constructor = Constructor {constrName :: ConstrName, product :: Product} |
158 | 126 | deriving stock (Show, Eq, Ord, Generic) |
159 | 127 |
|
160 | | -data Sum = Sum |
161 | | - { constructors :: NonEmpty Constructor |
162 | | - , sourceInfo :: SourceInfo |
163 | | - } |
| 128 | +data Sum = Sum {constructors :: NonEmpty Constructor, sourceInfo :: SourceInfo} |
164 | 129 | deriving stock (Show, Eq, Ord, Generic) |
165 | 130 |
|
166 | | -data Field = Field |
167 | | - { fieldName :: FieldName |
168 | | - , fieldTy :: Ty |
169 | | - } |
| 131 | +data Field = Field {fieldName :: FieldName, fieldTy :: Ty} |
170 | 132 | deriving stock (Show, Eq, Ord, Generic) |
171 | 133 |
|
172 | | -data Record = Record |
173 | | - { fields :: NonEmpty Field |
174 | | - , sourceInfo :: SourceInfo |
175 | | - } |
| 134 | +data Record = Record {fields :: NonEmpty Field, sourceInfo :: SourceInfo} |
176 | 135 | deriving stock (Show, Eq, Ord, Generic) |
177 | 136 |
|
178 | | -data Tuple = Tuple |
179 | | - { fields :: [Ty] |
180 | | - , sourceInfo :: SourceInfo |
181 | | - } |
| 137 | +data Tuple = Tuple {fields :: [Ty], sourceInfo :: SourceInfo} |
182 | 138 | deriving stock (Show, Eq, Ord, Generic) |
183 | 139 |
|
184 | | -data Product |
185 | | - = RecordI Record |
186 | | - | TupleI Tuple |
| 140 | +data Product = RecordI Record | TupleI Tuple |
187 | 141 | deriving stock (Show, Eq, Ord, Generic) |
188 | 142 |
|
189 | 143 | data ClassDef = ClassDef |
@@ -237,17 +191,157 @@ instance Exception KindCheckErr |
237 | 191 |
|
238 | 192 | newtype CompilerInput = CompilerInput {modules :: [Module]} |
239 | 193 | deriving stock (Show, Eq, Ord, Generic) |
240 | | - deriving newtype (Monoid, Semigroup) |
| 194 | + deriving newtype (Monoid, Semigroup, Arbitrary) |
241 | 195 |
|
242 | | -newtype CompilerOutput = CompilerOutput |
243 | | - { typeDefs :: M.Map Var Kind |
244 | | - } |
| 196 | +newtype CompilerOutput = CompilerOutput {typeDefs :: M.Map Var Kind} |
245 | 197 | deriving stock (Show, Eq, Ord, Generic) |
| 198 | + deriving newtype (Arbitrary) |
246 | 199 |
|
247 | 200 | newtype CompilerFailure = KCErr KindCheckErr |
248 | 201 | deriving stock (Show, Eq, Ord, Generic) |
| 202 | + deriving newtype (Arbitrary) |
249 | 203 |
|
250 | 204 | data CompilerResult |
251 | 205 | = RCompilerFailure CompilerFailure |
252 | 206 | | RCompilerOutput CompilerOutput |
253 | 207 | deriving stock (Show, Eq, Ord, Generic) |
| 208 | + |
| 209 | +instance Arbitrary SourceInfo where |
| 210 | + arbitrary = SourceInfo <$> arbitrary <*> arbitrary <*> arbitrary |
| 211 | + |
| 212 | +instance Arbitrary SourcePosition where |
| 213 | + arbitrary = SourcePosition <$> arbitrary <*> arbitrary |
| 214 | + |
| 215 | +instance Arbitrary LBName where |
| 216 | + arbitrary = LBName <$> arbitrary <*> arbitrary |
| 217 | + |
| 218 | +instance Arbitrary TyName where |
| 219 | + arbitrary = TyName <$> arbitrary <*> arbitrary |
| 220 | + |
| 221 | +instance Arbitrary ConstrName where |
| 222 | + arbitrary = ConstrName <$> arbitrary <*> arbitrary |
| 223 | + |
| 224 | +instance Arbitrary ModuleName where |
| 225 | + arbitrary = ModuleName <$> arbitrary <*> arbitrary |
| 226 | + |
| 227 | +instance Arbitrary ModuleNamePart where |
| 228 | + arbitrary = ModuleNamePart <$> arbitrary <*> arbitrary |
| 229 | + |
| 230 | +instance Arbitrary VarName where |
| 231 | + arbitrary = VarName <$> arbitrary <*> arbitrary |
| 232 | + |
| 233 | +instance Arbitrary FieldName where |
| 234 | + arbitrary = FieldName <$> arbitrary <*> arbitrary |
| 235 | + |
| 236 | +instance Arbitrary ClassName where |
| 237 | + arbitrary = ClassName <$> arbitrary <*> arbitrary |
| 238 | + |
| 239 | +instance Arbitrary Kind where |
| 240 | + arbitrary = Kind <$> arbitrary |
| 241 | + |
| 242 | +instance Arbitrary KindType where |
| 243 | + arbitrary = oneof [KindRef <$> arbitrary, KindArrow <$> arbitrary <*> arbitrary] |
| 244 | + |
| 245 | +instance Arbitrary KindRefType where |
| 246 | + arbitrary = oneof [pure KUnspecified, pure KType] |
| 247 | + |
| 248 | +instance Arbitrary TyVar where |
| 249 | + arbitrary = TyVar <$> arbitrary <*> arbitrary |
| 250 | + |
| 251 | +instance Arbitrary Ty where |
| 252 | + arbitrary = oneof [TyVarI <$> arbitrary, TyAppI <$> arbitrary, TyRefI <$> arbitrary] |
| 253 | + |
| 254 | +instance Arbitrary TyApp where |
| 255 | + arbitrary = TyApp <$> arbitrary <*> arbitrary <*> arbitrary |
| 256 | + |
| 257 | +instance Arbitrary ForeignRef where |
| 258 | + arbitrary = ForeignRef <$> arbitrary <*> arbitrary <*> arbitrary |
| 259 | + |
| 260 | +instance Arbitrary LocalRef where |
| 261 | + arbitrary = LocalRef <$> arbitrary <*> arbitrary |
| 262 | + |
| 263 | +instance Arbitrary TyRef where |
| 264 | + arbitrary = oneof [LocalI <$> arbitrary, ForeignI <$> arbitrary] |
| 265 | + |
| 266 | +instance Arbitrary TyDef where |
| 267 | + arbitrary = TyDef <$> arbitrary <*> arbitrary <*> arbitrary |
| 268 | + |
| 269 | +instance Arbitrary TyAbs where |
| 270 | + arbitrary = TyAbs <$> arbitrary <*> arbitrary <*> arbitrary |
| 271 | + |
| 272 | +instance Arbitrary TyArg where |
| 273 | + arbitrary = TyArg <$> arbitrary <*> arbitrary <*> arbitrary |
| 274 | + |
| 275 | +instance Arbitrary TyBody where |
| 276 | + arbitrary = oneof [OpaqueI <$> arbitrary, SumI <$> arbitrary] |
| 277 | + |
| 278 | +instance Arbitrary Constructor where |
| 279 | + arbitrary = Constructor <$> arbitrary <*> arbitrary |
| 280 | + |
| 281 | +instance Arbitrary Sum where |
| 282 | + arbitrary = Sum <$> arbitrary <*> arbitrary |
| 283 | + |
| 284 | +instance Arbitrary Field where |
| 285 | + arbitrary = Field <$> arbitrary <*> arbitrary |
| 286 | + |
| 287 | +instance Arbitrary Record where |
| 288 | + arbitrary = Record <$> arbitrary <*> arbitrary |
| 289 | + |
| 290 | +instance Arbitrary Tuple where |
| 291 | + arbitrary = Tuple <$> arbitrary <*> arbitrary |
| 292 | + |
| 293 | +instance Arbitrary Product where |
| 294 | + arbitrary = oneof [RecordI <$> arbitrary, TupleI <$> arbitrary] |
| 295 | + |
| 296 | +instance Arbitrary ClassDef where |
| 297 | + arbitrary = ClassDef <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary |
| 298 | + |
| 299 | +instance Arbitrary InstanceClause where |
| 300 | + arbitrary = InstanceClause <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary |
| 301 | + |
| 302 | +instance Arbitrary Constraint where |
| 303 | + arbitrary = Constraint <$> arbitrary <*> arbitrary <*> arbitrary |
| 304 | + |
| 305 | +instance Arbitrary Module where |
| 306 | + arbitrary = Module <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary |
| 307 | + |
| 308 | +instance Arbitrary InferenceErr where |
| 309 | + arbitrary = |
| 310 | + oneof |
| 311 | + [ UnboundTermErr <$> arbitrary |
| 312 | + , ImpossibleErr <$> arbitrary |
| 313 | + , UnificationErr <$> arbitrary |
| 314 | + , RecursiveSubstitutionErr <$> arbitrary |
| 315 | + ] |
| 316 | + |
| 317 | +instance Arbitrary KindCheckErr where |
| 318 | + arbitrary = |
| 319 | + oneof |
| 320 | + [ InconsistentTypeErr <$> arbitrary |
| 321 | + , InferenceFailure <$> arbitrary <*> arbitrary |
| 322 | + ] |
| 323 | + |
| 324 | +instance Arbitrary CompilerResult where |
| 325 | + arbitrary = |
| 326 | + oneof |
| 327 | + [ RCompilerFailure <$> arbitrary |
| 328 | + , RCompilerOutput <$> arbitrary |
| 329 | + ] |
| 330 | + |
| 331 | +-- Orphan Instances |
| 332 | + |
| 333 | +instance Arbitrary a => Arbitrary (NonEmpty a) where |
| 334 | + arbitrary = sized f |
| 335 | + where |
| 336 | + f :: (Num t, Ord t) => t -> Gen (NonEmpty a) |
| 337 | + f n |
| 338 | + | n <= 0 = do |
| 339 | + x <- arbitrary @a |
| 340 | + pure $ x :| [] |
| 341 | + | otherwise = do |
| 342 | + x <- arbitrary |
| 343 | + xs <- f (n - 1) |
| 344 | + pure $ x <| xs |
| 345 | + |
| 346 | +instance Arbitrary Text where |
| 347 | + arbitrary = pack <$> arbitrary |
0 commit comments