on master help sign in
Detect duplicate fields in type annotations and port declarations
36e7961Evan Czaplicki
src/Validate.hs+25−1
@@ -333,7 +333,8 @@ vrdHelp commentedDecls ports structure =
333 vrdDefHelp rest (A.A (region, snd ann) def) ports structure
333 vrdDefHelp rest (A.A (region, snd ann) def) ports structure
334
334
335 D.Port name tipe ->
335 D.Port name tipe ->
336+ do checkDuplicateFieldsInType tipe
336− vrdHelp rest (A.A ann (Effects.PortRaw name tipe) : ports) structure
337+ vrdHelp rest (A.A ann (Effects.PortRaw name tipe) : ports) structure
337
338
338
339
339vrdDefHelp
340vrdDefHelp
@@ -414,6 +415,7 @@ validateDef
414validateDef region pat expr maybeType =
415validateDef region pat expr maybeType =
415 do validExpr <- expression expr
416 do validExpr <- expression expr
416 validateDefPattern pat validExpr
417 validateDefPattern pat validExpr
418+ F.traverse_ checkDuplicateFieldsInType maybeType
417 return $ Src.Def region pat validExpr maybeType
419 return $ Src.Def region pat validExpr maybeType
418
420
419
421
@@ -685,3 +687,25 @@ freeVars (A.A region tipe) =
685 do checkDuplicateFields region fields
687 do checkDuplicateFields region fields
686 let types = Maybe.maybeToList ext ++ map snd fields
688 let types = Maybe.maybeToList ext ++ map snd fields
687 concat <$> traverse freeVars types
689 concat <$> traverse freeVars types
690+
691+
692+checkDuplicateFieldsInType :: Type.Raw -> Result wrn ()
693+checkDuplicateFieldsInType (A.A region tipe) =
694+ case tipe of
695+ Type.RLambda t1 t2 ->
696+ checkDuplicateFieldsInType t1
697+ <* checkDuplicateFieldsInType t2
698+
699+ Type.RVar _ ->
700+ Result.ok ()
701+
702+ Type.RType _ ->
703+ Result.ok ()
704+
705+ Type.RApp t ts ->
706+ F.traverse_ checkDuplicateFieldsInType (t:ts)
707+
708+ Type.RRecord fields ext ->
709+ do checkDuplicateFields region fields
710+ let types = Maybe.maybeToList ext ++ map snd fields
711+ F.traverse_ checkDuplicateFieldsInType types