Skip to content

Commit 659089d

Browse files
committed
Apply InfoLess in the Compiler
1 parent de1cc99 commit 659089d

File tree

12 files changed

+150
-205
lines changed

12 files changed

+150
-205
lines changed

lambda-buffers-compiler/lambda-buffers-compiler.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ library
101101
, generics-sop >=0.5
102102
, lambda-buffers-compiler-pb >=0.1.0.0
103103
, mtl >=2.2
104+
, ordered-containers
104105
, parsec >=3.1
105106
, prettyprinter >=1.7
106107
, proto-lens >=0.7

lambda-buffers-compiler/src/LambdaBuffers/Compiler/KindCheck/Inference.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,12 @@ derive x = deriveTyAbs x
141141
deriveTyAbs tyabs = do
142142
case M.toList (tyabs ^. #tyArgs) of
143143
[] -> deriveTyBody (x ^. #tyBody)
144-
a@(n, ar) : as -> do
144+
a@(_, ar) : as -> do
145145
let argK = protoKind2Kind (ar ^. #argKind)
146146
bodyK <- KVar <$> fresh
147147
ctx <- ask
148148

149-
let newContext = ctx & addContext %~ (<> M.singleton (mkInfoLess (TyVar n)) argK)
149+
let newContext = ctx & addContext %~ (<> M.singleton (mkInfoLess (TyVar (ar ^. #argName))) argK)
150150
let newAbs = tyabs & #tyArgs .~ uncurry M.singleton a
151151
let restAbs = tyabs & #tyArgs .~ M.fromList as
152152

lambda-buffers-compiler/src/LambdaBuffers/Compiler/ProtoCompat/FromProto.hs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,16 @@ import Control.Lens ((&), (.~), (^.))
77
import Control.Monad.Except (Except, MonadError (throwError), runExcept)
88
import Control.Monad.Reader (MonadReader (ask, local), ReaderT (runReaderT))
99
import Data.Foldable (foldlM, toList)
10-
import Data.Generics.Product (HasField)
1110
import Data.Kind (Type)
1211
import Data.Map (Map)
1312
import Data.Map qualified as Map
1413
import Data.ProtoLens (Message (messageName), MessageEnum (showEnum), defMessage)
1514
import Data.Proxy (Proxy (Proxy))
16-
import Data.Set qualified as Set
1715
import Data.Text (Text)
1816
import Data.Text qualified as Text
1917
import GHC.Generics (Generic)
2018
import LambdaBuffers.Compiler.NamingCheck (checkClassName, checkConstrName, checkFieldName, checkModuleNamePart, checkTyName, checkVarName)
19+
import LambdaBuffers.Compiler.ProtoCompat.InfoLess (mkInfoLess)
2120
import LambdaBuffers.Compiler.ProtoCompat.Types qualified as PC
2221
import Proto.Compiler (NamingError)
2322
import Proto.Compiler qualified as P
@@ -87,12 +86,6 @@ parseAndIndex key =
8786
)
8887
(mempty, mempty)
8988

90-
-- WARN(bladyjoker): This function is used to 'strip' the SourceInfo from types that end up as Map keys.
91-
-- This can cause confusion and errors and we should rather parametrize types with `info` and
92-
-- maintain `Map (TyName ()) (TyDef SourceInfo)`
93-
stripSourceInfo :: HasField "sourceInfo" s t a PC.SourceInfo => s -> t
94-
stripSourceInfo x = x & #sourceInfo .~ PC.defSourceInfo
95-
9689
{-
9790
SourceInfo
9891
-}
@@ -299,7 +292,7 @@ instance IsMessage P.TyDef PC.TyDef where
299292

300293
instance IsMessage P.TyAbs PC.TyAbs where
301294
fromProto ta = do
302-
(tyargs, mulTyArgs) <- parseAndIndex (\a -> stripSourceInfo $ a ^. #argName) (ta ^. P.tyArgs)
295+
(tyargs, mulTyArgs) <- parseAndIndex (\a -> mkInfoLess $ a ^. #argName) (ta ^. P.tyArgs)
303296
tybody <- fromProto $ ta ^. P.tyBody
304297
si <- fromProto $ ta ^. P.sourceInfo
305298
ctx <- ask
@@ -388,7 +381,7 @@ instance IsMessage P.TyBody PC.TyBody where
388381

389382
instance IsMessage P.Sum PC.Sum where
390383
fromProto s = do
391-
(ctors, mulCtors) <- parseAndIndex (\c -> stripSourceInfo $ c ^. #constrName) (s ^. P.constructors)
384+
(ctors, mulCtors) <- parseAndIndex (\c -> mkInfoLess $ c ^. #constrName) (s ^. P.constructors)
392385
si <- fromProto $ s ^. P.sourceInfo
393386
ctx <- ask
394387
(ctxMn, ctxTyd) <- case ctx of
@@ -424,7 +417,7 @@ instance IsMessage P.Sum'Constructor PC.Constructor where
424417

425418
instance IsMessage P.Product'Record PC.Record where
426419
fromProto r = do
427-
(fields, mulFields) <- parseAndIndex (\f -> stripSourceInfo $ f ^. #fieldName) (r ^. P.fields)
420+
(fields, mulFields) <- parseAndIndex (\f -> mkInfoLess $ f ^. #fieldName) (r ^. P.fields)
428421
si <- fromProto $ r ^. P.sourceInfo
429422
ctx <- ask
430423
(ctxMn, ctxTyd) <- case ctx of
@@ -598,9 +591,9 @@ instance IsMessage P.Module PC.Module where
598591
_ -> throwInternalError "Expected to be in CompilerInput Context"
599592
local (const $ CtxModule (m ^. P.moduleName)) $ do
600593
mnm <- fromProto $ m ^. P.moduleName
601-
(tydefs, mulTyDefs) <- parseAndIndex (\tyDef -> stripSourceInfo $ tyDef ^. #tyName) (m ^. P.typeDefs)
602-
(cldefs, mulClDefs) <- parseAndIndex (\cldef -> stripSourceInfo $ cldef ^. #className) (m ^. P.classDefs)
603-
(impts, mulImpts) <- parseAndIndex stripSourceInfo (m ^. P.imports)
594+
(tydefs, mulTyDefs) <- parseAndIndex (\tyDef -> mkInfoLess $ tyDef ^. #tyName) (m ^. P.typeDefs)
595+
(cldefs, mulClDefs) <- parseAndIndex (\cldef -> mkInfoLess $ cldef ^. #className) (m ^. P.classDefs)
596+
(impts, mulImpts) <- parseAndIndex mkInfoLess (m ^. P.imports)
604597
insts <- traverse fromProto $ m ^. P.instances
605598
si <- fromProto $ m ^. P.sourceInfo
606599
let mulTyDefsErrs =
@@ -626,7 +619,7 @@ instance IsMessage P.Module PC.Module where
626619
]
627620
protoParseErrs = mulTyDefsErrs ++ mulClassDefsErrs ++ mulImptsErrs
628621
if null protoParseErrs
629-
then pure $ PC.Module mnm tydefs cldefs insts (Map.keysSet impts) si
622+
then pure $ PC.Module mnm tydefs cldefs insts impts si
630623
else throwError protoParseErrs
631624

632625
toProto (PC.Module mnm tdefs cdefs insts impts si) =
@@ -635,13 +628,13 @@ instance IsMessage P.Module PC.Module where
635628
& P.typeDefs .~ (toProto <$> toList tdefs)
636629
& P.classDefs .~ (toProto <$> toList cdefs)
637630
& P.instances .~ (toProto <$> insts)
638-
& P.imports .~ (toProto <$> Set.toList impts)
631+
& P.imports .~ (toProto <$> toList impts)
639632
& P.sourceInfo .~ toProto si
640633

641634
instance IsMessage P.CompilerInput PC.CompilerInput where
642635
fromProto ci = do
643636
local (const CtxCompilerInput) $ do
644-
(mods, mulModules) <- parseAndIndex (\m -> stripSourceInfo $ m ^. #moduleName) (ci ^. P.modules)
637+
(mods, mulModules) <- parseAndIndex (\m -> mkInfoLess $ m ^. #moduleName) (ci ^. P.modules)
645638
let mulModulesErrs =
646639
[ FPProtoParseError $
647640
defMessage & P.multipleModuleError . P.modules .~ ms

lambda-buffers-compiler/src/LambdaBuffers/Compiler/ProtoCompat/InfoLess.hs

Lines changed: 3 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -7,65 +7,21 @@ module LambdaBuffers.Compiler.ProtoCompat.InfoLess (
77
withInfoLess,
88
withInfoLessF,
99
mkInfoLess,
10-
InfoLessC,
10+
InfoLessC (infoLessId),
1111
) where
1212

1313
import Data.Bifunctor (Bifunctor (bimap))
14-
import Data.Default (Default (def))
1514
import Data.Map qualified as M
1615
import Data.Set qualified as S
1716
import Data.Text (Text)
1817
import Generics.SOP (All2, Generic (Code, from, to), Proxy (Proxy), hcmap, mapII)
19-
import LambdaBuffers.Compiler.ProtoCompat.Types (
20-
ClassDef,
21-
ClassName,
22-
CompilerError,
23-
CompilerInput,
24-
CompilerResult,
25-
ConstrName,
26-
Constraint,
27-
Constructor,
28-
Field,
29-
FieldName,
30-
ForeignClassRef,
31-
ForeignRef,
32-
InferenceErr,
33-
InstanceClause,
34-
Kind,
35-
KindCheckErr,
36-
KindCheckError,
37-
KindRefType,
38-
KindType,
39-
LBName,
40-
LocalClassRef,
41-
LocalRef,
42-
Module,
43-
ModuleName,
44-
ModuleNamePart,
45-
Product,
46-
Record,
47-
SourceInfo,
48-
SourcePosition,
49-
Sum,
50-
Tuple,
51-
Ty,
52-
TyAbs,
53-
TyApp,
54-
TyArg,
55-
TyBody,
56-
TyClassRef,
57-
TyDef,
58-
TyName,
59-
TyRef,
60-
TyVar,
61-
VarName,
62-
defSourceInfo,
63-
)
18+
import Test.QuickCheck (Arbitrary)
6419

6520
-- | InfoLess newtype. Constructor is not exported to not allow the construction of types with the Info. InfoLess a can only be constructed via its class instance and deconstructed using the exported function.
6621
newtype InfoLess a = InfoLess {unsafeInfoLess :: a}
6722
deriving stock (Show, Eq, Ord)
6823
deriving stock (Functor, Traversable, Foldable)
24+
deriving newtype (Arbitrary, InfoLessC)
6925

7026
{- | SourceInfo Less ID.
7127
A TypeClass that provides id for types with SourceInfo - where SI is defaulted - therefore ignored. Can only be derived.
@@ -104,51 +60,3 @@ instance (Ord k, InfoLessC k, InfoLessC v) => InfoLessC (M.Map k v) where
10460

10561
instance (Ord a, InfoLessC a) => InfoLessC (S.Set a) where
10662
infoLessId = S.fromList . fmap infoLessId . S.toList
107-
108-
instance InfoLessC SourceInfo where
109-
infoLessId = const def
110-
111-
instance Default SourceInfo where
112-
def = defSourceInfo
113-
114-
instance InfoLessC SourcePosition
115-
instance InfoLessC LBName
116-
instance InfoLessC TyName
117-
instance InfoLessC ConstrName
118-
instance InfoLessC ModuleName
119-
instance InfoLessC ModuleNamePart
120-
instance InfoLessC VarName
121-
instance InfoLessC FieldName
122-
instance InfoLessC ClassName
123-
instance InfoLessC Kind
124-
instance InfoLessC KindType
125-
instance InfoLessC KindRefType
126-
instance InfoLessC TyVar
127-
instance InfoLessC Ty
128-
instance InfoLessC TyApp
129-
instance InfoLessC ForeignRef
130-
instance InfoLessC LocalRef
131-
instance InfoLessC TyRef
132-
instance InfoLessC TyDef
133-
instance InfoLessC TyAbs
134-
instance InfoLessC TyArg
135-
instance InfoLessC TyBody
136-
instance InfoLessC Constructor
137-
instance InfoLessC Sum
138-
instance InfoLessC Field
139-
instance InfoLessC Record
140-
instance InfoLessC Tuple
141-
instance InfoLessC Product
142-
instance InfoLessC ForeignClassRef
143-
instance InfoLessC LocalClassRef
144-
instance InfoLessC TyClassRef
145-
instance InfoLessC ClassDef
146-
instance InfoLessC InstanceClause
147-
instance InfoLessC Constraint
148-
instance InfoLessC Module
149-
instance InfoLessC InferenceErr
150-
instance InfoLessC KindCheckErr
151-
instance InfoLessC CompilerInput
152-
instance InfoLessC KindCheckError
153-
instance InfoLessC CompilerError
154-
instance InfoLessC CompilerResult

lambda-buffers-compiler/src/LambdaBuffers/Compiler/ProtoCompat/Types.hs

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,19 @@ module LambdaBuffers.Compiler.ProtoCompat.Types (
4848
TyRef (..),
4949
TyVar (..),
5050
VarName (..),
51-
defSourceInfo,
5251
InferenceErr,
5352
KindCheckErr,
5453
) where
5554

5655
import Control.Exception (Exception)
5756
import Control.Lens (Getter, to, (^.))
57+
import Data.Default (Default (def))
5858
import Data.Generics.Labels ()
5959
import Data.Map (Map)
60-
import Data.Set (Set)
6160
import Data.Text (Text)
6261
import GHC.Generics (Generic)
6362
import Generics.SOP qualified as SOP
63+
import LambdaBuffers.Compiler.ProtoCompat.InfoLess (InfoLess, InfoLessC (infoLessId))
6464
import Test.QuickCheck (Gen, oneof, resize, sized)
6565
import Test.QuickCheck.Arbitrary.Generic (Arbitrary (arbitrary), GenericArbitrary (GenericArbitrary))
6666
import Test.QuickCheck.Instances.Semigroup ()
@@ -76,8 +76,8 @@ data SourcePosition = SourcePosition {column :: Int, row :: Int}
7676
deriving (Arbitrary) via GenericArbitrary SourcePosition
7777
deriving anyclass (SOP.Generic)
7878

79-
defSourceInfo :: SourceInfo
80-
defSourceInfo = SourceInfo "" (SourcePosition 0 0) (SourcePosition 0 0)
79+
instance Default SourceInfo where
80+
def = SourceInfo "" (SourcePosition 0 0) (SourcePosition 0 0)
8181

8282
{- | NOTE(gnumonik): I need a "generic name" type for my template haskell, this
8383
shouldn't be used anywhere outside of that
@@ -202,7 +202,7 @@ data TyDef = TyDef {tyName :: TyName, tyAbs :: TyAbs, sourceInfo :: SourceInfo}
202202
deriving (Arbitrary) via GenericArbitrary TyDef
203203
deriving anyclass (SOP.Generic)
204204

205-
data TyAbs = TyAbs {tyArgs :: Map VarName TyArg, tyBody :: TyBody, sourceInfo :: SourceInfo}
205+
data TyAbs = TyAbs {tyArgs :: Map (InfoLess VarName) TyArg, tyBody :: TyBody, sourceInfo :: SourceInfo}
206206
deriving stock (Show, Eq, Ord, Generic)
207207
deriving (Arbitrary) via GenericArbitrary TyAbs
208208
deriving anyclass (SOP.Generic)
@@ -222,7 +222,7 @@ data Constructor = Constructor {constrName :: ConstrName, product :: Product}
222222
deriving (Arbitrary) via GenericArbitrary Constructor
223223
deriving anyclass (SOP.Generic)
224224

225-
data Sum = Sum {constructors :: Map ConstrName Constructor, sourceInfo :: SourceInfo}
225+
data Sum = Sum {constructors :: Map (InfoLess ConstrName) Constructor, sourceInfo :: SourceInfo}
226226
deriving stock (Show, Eq, Ord, Generic)
227227
deriving (Arbitrary) via GenericArbitrary Sum
228228
deriving anyclass (SOP.Generic)
@@ -232,7 +232,7 @@ data Field = Field {fieldName :: FieldName, fieldTy :: Ty}
232232
deriving (Arbitrary) via GenericArbitrary Field
233233
deriving anyclass (SOP.Generic)
234234

235-
data Record = Record {fields :: Map FieldName Field, sourceInfo :: SourceInfo}
235+
data Record = Record {fields :: Map (InfoLess FieldName) Field, sourceInfo :: SourceInfo}
236236
deriving stock (Show, Eq, Ord, Generic)
237237
deriving (Arbitrary) via GenericArbitrary Record
238238
deriving anyclass (SOP.Generic)
@@ -309,10 +309,10 @@ data Constraint = Constraint
309309

310310
data Module = Module
311311
{ moduleName :: ModuleName
312-
, typeDefs :: Map TyName TyDef
313-
, classDefs :: Map ClassName ClassDef
312+
, typeDefs :: Map (InfoLess TyName) TyDef
313+
, classDefs :: Map (InfoLess ClassName) ClassDef
314314
, instances :: [InstanceClause]
315-
, imports :: Set ModuleName
315+
, imports :: Map (InfoLess ModuleName) ModuleName
316316
, sourceInfo :: SourceInfo
317317
}
318318
deriving stock (Show, Eq, Ord, Generic)
@@ -350,7 +350,7 @@ data KindCheckErr
350350

351351
instance Exception KindCheckErr
352352

353-
newtype CompilerInput = CompilerInput {modules :: Map ModuleName Module}
353+
newtype CompilerInput = CompilerInput {modules :: Map (InfoLess ModuleName) Module}
354354
deriving stock (Show, Eq, Ord, Generic)
355355
deriving newtype (Monoid, Semigroup)
356356
deriving anyclass (SOP.Generic)
@@ -385,3 +385,49 @@ data CompilerResult = CompilerResult
385385
deriving anyclass (SOP.Generic)
386386

387387
type CompilerOutput = Either CompilerError CompilerResult
388+
389+
-- | InfoLess instances
390+
instance InfoLessC SourceInfo where
391+
infoLessId = const def
392+
393+
instance InfoLessC SourcePosition
394+
instance InfoLessC LBName
395+
instance InfoLessC TyName
396+
instance InfoLessC ConstrName
397+
instance InfoLessC ModuleName
398+
instance InfoLessC ModuleNamePart
399+
instance InfoLessC VarName
400+
instance InfoLessC FieldName
401+
instance InfoLessC ClassName
402+
instance InfoLessC Kind
403+
instance InfoLessC KindType
404+
instance InfoLessC KindRefType
405+
instance InfoLessC TyVar
406+
instance InfoLessC Ty
407+
instance InfoLessC TyApp
408+
instance InfoLessC ForeignRef
409+
instance InfoLessC LocalRef
410+
instance InfoLessC TyRef
411+
instance InfoLessC TyDef
412+
instance InfoLessC TyAbs
413+
instance InfoLessC TyArg
414+
instance InfoLessC TyBody
415+
instance InfoLessC Constructor
416+
instance InfoLessC Sum
417+
instance InfoLessC Field
418+
instance InfoLessC Record
419+
instance InfoLessC Tuple
420+
instance InfoLessC Product
421+
instance InfoLessC ForeignClassRef
422+
instance InfoLessC LocalClassRef
423+
instance InfoLessC TyClassRef
424+
instance InfoLessC ClassDef
425+
instance InfoLessC InstanceClause
426+
instance InfoLessC Constraint
427+
instance InfoLessC Module
428+
instance InfoLessC InferenceErr
429+
instance InfoLessC KindCheckErr
430+
instance InfoLessC CompilerInput
431+
instance InfoLessC KindCheckError
432+
instance InfoLessC CompilerError
433+
instance InfoLessC CompilerResult

0 commit comments

Comments
 (0)