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