Refactor AST
[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 AST.NodeId)
27 findUniqueIdentifiers (AST.NetSpec nodes) = let allIds = map fst $ nodes
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
32                                                             ["Duplicate identifier " ++ show id]
33                                                            else
34                                                             []
35                                                     return $ id `Set.insert` uids
36
37 checkSockeye :: AST.NetSpec -> [String]
38 checkSockeye ast = snd $ runWriter $ do
39     ids <- findUniqueIdentifiers ast
40     return ids