Add check for duplicate identifiers
[barrelfish] / tools / sockeye2 / SockeyeChecker.hs
1 {-
2   SockeyeChecker.hs: AST checker for Sockeye
3
4   Part of Sockeye
5
6   Copyright (c) 2017, ETH Zurich.
7
8   All rights reserved.
9
10   This file is distributed under the terms in the attached LICENSE file.
11   If you do not find this file, copies can be found by writing to:
12   ETH Zurich D-INFK, CAB F.78, Universitaetstr. 6, CH-8092 Zurich,
13   Attn: Systems Group.
14 -}
15
16 module SockeyeChecker
17 ( checkSockeye ) where
18
19 import Control.Monad.Trans.Writer
20
21 import Data.Set (Set)
22 import qualified Data.Set as Set
23
24 import qualified SockeyeAST as AST
25
26 findUniqueIdentifiers :: AST.NetSpec -> Writer [String] (Set String)
27 findUniqueIdentifiers ast = let allIds = map fst $ AST.getNodes ast
28                             in foldl checkAndAdd (return Set.empty) allIds
29                             where checkAndAdd w id = do
30                                     uids <- w
31                                     tell $ if id `Set.member` uids then ["Duplicate identifier " ++ show id] else []
32                                     return $ id `Set.insert` uids
33
34 checkSockeye :: AST.NetSpec -> [String]
35 checkSockeye ast = reverse $ snd $ runWriter $ do
36     ids <- findUniqueIdentifiers ast
37     return ids