diff --git a/Main.hs b/Main.hs
index 5acc5e5..51d7632 100644
--- a/Main.hs
+++ b/Main.hs
@@ -19,7 +19,6 @@ with this program. If not, see .
-- | Driver for the compiler.
module Main (main) where
-import Control.Monad
import Control.Monad.Error
import Control.Monad.State
import List
@@ -33,10 +32,9 @@ import Errors
import GenerateC
import GenerateCPPCSP
import ParseOccam
+import ParseRain
import Pass
import PreprocessOccam
-import PrettyShow
-import ParseRain
import RainPasses
import SimplifyExprs
import SimplifyProcs
diff --git a/Makefile b/Makefile
index 350ca78..b2553e6 100644
--- a/Makefile
+++ b/Makefile
@@ -14,6 +14,7 @@ ghc_opts = \
-fglasgow-exts \
-fallow-undecidable-instances \
-fwarn-unused-binds \
+ -fwarn-unused-imports \
-icommon -itransformations -ifrontends -ibackends \
$(profile_opts)
diff --git a/TestMain.hs b/TestMain.hs
index 6d6fdac..903e7c0 100644
--- a/TestMain.hs
+++ b/TestMain.hs
@@ -31,24 +31,25 @@ with this program. If not, see .
-- * "UsageCheckTest"
module TestMain () where
+import Test.HUnit
+
+import qualified BackendPassesTest (tests)
+import qualified CommonTest (tests)
import qualified ParseRainTest (tests)
+import qualified PassTest (tests)
import qualified RainPassesTest (tests)
import qualified RainTypesTest (tests)
import qualified UsageCheckTest (tests)
-import qualified PassTest (tests)
-import qualified CommonTest (tests)
-import qualified BackendPassesTest (tests)
-import Test.HUnit
main :: IO ()
main = do runTestTT $ TestList
[
- PassTest.tests
+ BackendPassesTest.tests
,CommonTest.tests
,ParseRainTest.tests
+ ,PassTest.tests
,RainPassesTest.tests
,RainTypesTest.tests
,UsageCheckTest.tests
- ,BackendPassesTest.tests
]
return ()
diff --git a/backends/AnalyseAsm.hs b/backends/AnalyseAsm.hs
index e01c32c..0c0205c 100644
--- a/backends/AnalyseAsm.hs
+++ b/backends/AnalyseAsm.hs
@@ -31,12 +31,10 @@ import qualified Data.Map as Map
import Data.Maybe
import qualified Data.Set as Set
import Numeric (readDec)
-import System
import Text.Printf
import Text.Regex
import CompState
-import Errors
import Pass
import PrettyShow
diff --git a/backends/GenerateC.hs b/backends/GenerateC.hs
index 638c43b..9f66721 100644
--- a/backends/GenerateC.hs
+++ b/backends/GenerateC.hs
@@ -24,20 +24,19 @@ import Data.Generics
import Data.List
import Data.Maybe
import qualified Data.Set as Set
-import Control.Monad.Writer
import Control.Monad.Error
import Control.Monad.State
-import Numeric
+import Control.Monad.Writer
import Text.Printf
import qualified AST as A
import BackendPasses
import CompState
+import Errors
import EvalConstants
import EvalLiterals
import Metadata
import Pass
-import Errors
import ShowCode
import TLP
import Types
diff --git a/backends/GenerateCPPCSP.hs b/backends/GenerateCPPCSP.hs
index f4546e8..0ff9482 100644
--- a/backends/GenerateCPPCSP.hs
+++ b/backends/GenerateCPPCSP.hs
@@ -70,29 +70,23 @@ For channels of direction 'A.DirInput' or 'A.DirOutput' I actually pass the Chan
-}
module GenerateCPPCSP (generateCPPCSP) where
+import Control.Monad.Writer
import Data.Char
+import Data.Generics
import Data.List
import Data.Maybe
-import Data.Generics
-import Control.Monad.Writer
-import Control.Monad.Error
-import Control.Monad.State
-import Numeric
-import Text.Printf
import qualified AST as A
import CompState
-import EvalConstants
-import EvalLiterals
+import Errors
+import GenerateC
import Metadata
import Pass
-import Errors
import ShowCode
import TLP
import Types
import Utils
-import GenerateC
--{{{ generator ops
-- | Operations for the C++CSP backend.
diff --git a/backends/TLP.hs b/backends/TLP.hs
index 3552752..e6122d9 100644
--- a/backends/TLP.hs
+++ b/backends/TLP.hs
@@ -19,7 +19,6 @@ with this program. If not, see .
-- | Top-level process support.
module TLP where
-import Control.Monad.Error
import Control.Monad.State
import Data.Generics
import Data.List
@@ -28,7 +27,6 @@ import Data.Maybe
import qualified AST as A
import CompState
import Errors
-import Metadata
import Types
data TLPChannel = TLPIn | TLPOut | TLPError
diff --git a/common/CommonTest.hs b/common/CommonTest.hs
index da67c33..4b3b3ac 100644
--- a/common/CommonTest.hs
+++ b/common/CommonTest.hs
@@ -18,12 +18,13 @@ with this program. If not, see .
module CommonTest (tests) where
-import Test.HUnit hiding (State)
-import qualified AST as A
-import Types
-import TreeUtil
-import Metadata
import Data.Generics
+import Test.HUnit hiding (State)
+
+import qualified AST as A
+import Metadata
+import TreeUtil
+import Types
-- | Tests the isSafeConversion function:
testIsSafeConversion :: Test
diff --git a/common/CompState.hs b/common/CompState.hs
index b744e25..b8052e4 100644
--- a/common/CompState.hs
+++ b/common/CompState.hs
@@ -19,13 +19,13 @@ with this program. If not, see .
-- | Compiler state.
module CompState where
+import Control.Monad.Error
+import Control.Monad.State
import Data.Generics
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Set (Set)
import qualified Data.Set as Set
-import Control.Monad.Error
-import Control.Monad.State
import qualified AST as A
import Errors
diff --git a/common/Errors.hs b/common/Errors.hs
index 3526e49..4804110 100644
--- a/common/Errors.hs
+++ b/common/Errors.hs
@@ -24,7 +24,6 @@ import Control.Monad.Trans
import Data.List
import System.IO.Error
-import qualified AST as A
import Metadata
type ErrorReport = (Maybe Meta, String)
diff --git a/common/EvalConstants.hs b/common/EvalConstants.hs
index 3c51cc6..3dbe55c 100644
--- a/common/EvalConstants.hs
+++ b/common/EvalConstants.hs
@@ -20,15 +20,11 @@ with this program. If not, see .
module EvalConstants (constantFold, isConstantName) where
import Control.Monad.Error
-import Control.Monad.Identity
import Control.Monad.State
import Data.Bits
import Data.Char
-import Data.Generics
import Data.Int
import Data.Maybe
-import Data.Word
-import Numeric
import Text.Printf
import qualified AST as A
@@ -36,7 +32,6 @@ import CompState
import Errors
import EvalLiterals
import Metadata
-import Pass
import ShowCode
import Types
diff --git a/common/EvalLiterals.hs b/common/EvalLiterals.hs
index a69af0e..0708454 100644
--- a/common/EvalLiterals.hs
+++ b/common/EvalLiterals.hs
@@ -22,7 +22,6 @@ module EvalLiterals where
import Control.Monad.Error
import Control.Monad.Identity
import Control.Monad.State
-import Data.Bits
import Data.Char
import Data.Generics
import Data.Int
diff --git a/common/Metadata.hs b/common/Metadata.hs
index 44823e5..e239a50 100644
--- a/common/Metadata.hs
+++ b/common/Metadata.hs
@@ -25,8 +25,6 @@ import Data.Generics
import Text.Printf
import Text.Read
-import Utils
-
data Meta = Meta {
metaFile :: Maybe String,
metaLine :: Int,
diff --git a/common/ShowCode.hs b/common/ShowCode.hs
index 94463bd..0d00b4a 100644
--- a/common/ShowCode.hs
+++ b/common/ShowCode.hs
@@ -26,6 +26,7 @@ import Data.Generics
import Data.List
import Text.PrettyPrint.HughesPJ
import Text.Regex
+
import qualified AST as A
import CompState
diff --git a/common/TestUtil.hs b/common/TestUtil.hs
index 84e47f9..8348a27 100644
--- a/common/TestUtil.hs
+++ b/common/TestUtil.hs
@@ -38,21 +38,21 @@ If they are not equal, it shows them (using 'show') with the given message prefi
module TestUtil where
-import qualified AST as A
-import Metadata (Meta,emptyMeta)
-import Monad
-import Test.HUnit hiding (State)
-import Data.Generics
-import Pattern
-import TreeUtil
-import Control.Monad.State
import Control.Monad.Error
-import Pass
-import CompState
-import PrettyShow
-import Utils
+import Control.Monad.State
+import Data.Generics
import qualified Data.Map as Map
+import Test.HUnit hiding (State)
+
+import qualified AST as A
+import CompState
import Errors
+import Metadata (Meta,emptyMeta)
+import Pass
+import Pattern
+import PrettyShow
+import TreeUtil
+import Utils
-- | An abbreviation for using 'emptyMeta'. TODO: This should really be removed (and all uses of it replaced with 'emptyMeta') for clarity.
m :: Meta
diff --git a/common/TreeUtil.hs b/common/TreeUtil.hs
index 0b7bb1b..354f304 100644
--- a/common/TreeUtil.hs
+++ b/common/TreeUtil.hs
@@ -26,14 +26,15 @@ module TreeUtil (
con0, con1, con2, con3, con4, con5, con6, con7
) where
-import Test.HUnit hiding (State)
-import qualified Data.Map as Map
import Control.Monad.State
import Data.Generics
-import qualified PrettyShow as PS
-import Data.Maybe
import Data.List
+import qualified Data.Map as Map
+import Data.Maybe
+import Test.HUnit hiding (State)
+
import Pattern
+import qualified PrettyShow as PS
type MatchErrors = [String]
diff --git a/common/Types.hs b/common/Types.hs
index 88cf19f..38e01e3 100644
--- a/common/Types.hs
+++ b/common/Types.hs
@@ -32,7 +32,6 @@ module Types
) where
-import Control.Monad
import Control.Monad.State
import Data.Generics
import qualified Data.Map as Map
diff --git a/frontends/LexOccam.x b/frontends/LexOccam.x
index 8e621a5..8e67e5f 100644
--- a/frontends/LexOccam.x
+++ b/frontends/LexOccam.x
@@ -1,4 +1,5 @@
-{ {-
+{ {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-
Tock: a compiler for parallel languages
Copyright (C) 2007 University of Kent
diff --git a/frontends/LexRain.x b/frontends/LexRain.x
index 5ad5850..9d3b652 100644
--- a/frontends/LexRain.x
+++ b/frontends/LexRain.x
@@ -1,4 +1,5 @@
-{ {-
+{ {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-
Tock: a compiler for parallel languages
Copyright (C) 2007 University of Kent
@@ -21,9 +22,7 @@ module LexRain where
import Data.Generics
-import Errors
import Metadata
-import Pass
}
%wrapper "posn"
diff --git a/frontends/ParseOccam.hs b/frontends/ParseOccam.hs
index 20a4ecc..a300ee3 100644
--- a/frontends/ParseOccam.hs
+++ b/frontends/ParseOccam.hs
@@ -20,12 +20,10 @@ with this program. If not, see .
module ParseOccam (parseOccamProgram) where
import Control.Monad (liftM, when)
-import Control.Monad.Error (runErrorT)
-import Control.Monad.State (MonadState, StateT, execStateT, liftIO, modify, get, put)
+import Control.Monad.State (MonadState, modify, get, put)
import Data.List
import qualified Data.Map as Map
import Data.Maybe
-import Debug.Trace
import Text.ParserCombinators.Parsec
import qualified AST as A
diff --git a/frontends/ParseRain.hs b/frontends/ParseRain.hs
index 2d26908..f35eeb7 100644
--- a/frontends/ParseRain.hs
+++ b/frontends/ParseRain.hs
@@ -18,36 +18,21 @@ with this program. If not, see .
module ParseRain where
-import qualified Text.ParserCombinators.Parsec.Token as P
-import qualified LexRain as L
-
-
-
---Chuck a whole load from Parse:
-import Control.Monad (liftM, when)
-import Control.Monad.Error (runErrorT)
-import Control.Monad.State (MonadState, StateT, execStateT, liftIO, modify, get, put)
+import Control.Monad (liftM)
+import Control.Monad.State (MonadState, liftIO, get, put)
import Data.List
-import qualified Data.Map as Map
import Data.Maybe
-import Debug.Trace
import qualified IO
-import Numeric (readHex)
import Text.ParserCombinators.Parsec
-import Text.Regex
import qualified AST as A
import CompState
import Errors
-import EvalConstants
-import EvalLiterals
-import Intrinsics
+import qualified LexRain as L
import Metadata
import ParseUtils
import Pass
-import Types
-import Utils
diff --git a/frontends/ParseRainTest.hs b/frontends/ParseRainTest.hs
index e219690..8a01fe9 100644
--- a/frontends/ParseRainTest.hs
+++ b/frontends/ParseRainTest.hs
@@ -18,17 +18,18 @@ with this program. If not, see .
module ParseRainTest (tests) where
-import qualified ParseRain as RP
-import qualified AST as A
-import qualified LexRain as L
-import Text.ParserCombinators.Parsec (runParser,eof)
-import Test.HUnit
-import Metadata (Meta,emptyMeta)
import Prelude hiding (fail)
-import TestUtil
-import Pattern
-import TreeUtil
+import Test.HUnit
+import Text.ParserCombinators.Parsec (runParser,eof)
+
+import qualified AST as A
import CompState
+import qualified LexRain as L
+import Metadata (Meta,emptyMeta)
+import qualified ParseRain as RP
+import Pattern
+import TestUtil
+import TreeUtil
data ParseTest a = Show a => ExpPass (String, RP.RainParser a , (a -> Assertion)) | ExpFail (String, RP.RainParser a)
diff --git a/frontends/ParseUtils.hs b/frontends/ParseUtils.hs
index 21d905c..3574cac 100644
--- a/frontends/ParseUtils.hs
+++ b/frontends/ParseUtils.hs
@@ -20,6 +20,7 @@ module ParseUtils where
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Pos (newPos)
+
import Metadata
--{{{ Meta to/from SourcePos
diff --git a/frontends/RainPasses.hs b/frontends/RainPasses.hs
index 0b9b430..ae1b66a 100644
--- a/frontends/RainPasses.hs
+++ b/frontends/RainPasses.hs
@@ -19,19 +19,20 @@ with this program. If not, see .
-- | A module containing all the misc Rain-specific passes that must be run on the parsed Rain AST before it can be fed into the shared passes.
module RainPasses where
-import qualified AST as A
-import Pass
+import Control.Monad.State
import Data.Generics
import qualified Data.Map as Map
import Data.Maybe
-import Control.Monad.State
-import Types
+
+import qualified AST as A
import CompState
import Errors
import Metadata
+import Pass
import Pattern
-import TreeUtil
import RainTypes
+import TreeUtil
+import Types
-- | An ordered list of the Rain-specific passes to be run.
rainPasses :: [(String,Pass)]
diff --git a/frontends/RainPassesTest.hs b/frontends/RainPassesTest.hs
index 0386d79..d7d0c95 100644
--- a/frontends/RainPassesTest.hs
+++ b/frontends/RainPassesTest.hs
@@ -20,23 +20,20 @@ with this program. If not, see .
module RainPassesTest (tests) where
-import Test.HUnit hiding (State)
-import Control.Monad.State as CSM
+import Control.Monad.State
+import Control.Monad.Identity
+import Data.Generics
import qualified Data.Map as Map
+import Test.HUnit hiding (State)
+
import qualified AST as A
-import TestUtil
+import CompState
+import Errors
import Pattern
-import TreeUtil
import RainPasses
import RainTypes
-import CompState
-import Control.Monad.Error (runErrorT)
-import Control.Monad.Identity
-import Types
-import Pass
-import Data.Generics
-import Utils
-import Errors
+import TestUtil
+import TreeUtil
skipP :: A.Structured
skipP = A.OnlyP m (A.Skip m)
diff --git a/frontends/RainTypes.hs b/frontends/RainTypes.hs
index 1845045..52ddc40 100644
--- a/frontends/RainTypes.hs
+++ b/frontends/RainTypes.hs
@@ -18,16 +18,17 @@ with this program. If not, see .
module RainTypes where
-import qualified AST as A
-import Pass
-import Data.Generics
-import EvalConstants
-import Errors
-import Types
import Control.Monad.State
+import Data.Generics
+
+import qualified AST as A
import CompState
+import Errors
+import EvalConstants
import Metadata
+import Pass
import ShowCode
+import Types
-- | A pass that records inferred types. Currently the only place where types are inferred is in seqeach\/pareach loops.
diff --git a/frontends/RainTypesTest.hs b/frontends/RainTypesTest.hs
index c0cec15..2d447c6 100644
--- a/frontends/RainTypesTest.hs
+++ b/frontends/RainTypesTest.hs
@@ -18,19 +18,20 @@ with this program. If not, see .
module RainTypesTest where
-import Test.HUnit hiding (State)
-import TestUtil
-import RainTypes
-import TreeUtil
-import Pattern
-import qualified AST as A
-import CompState
import Control.Monad.State
import Control.Monad.Error
import Data.Generics
-import Types
-import Pass
+import Test.HUnit hiding (State)
+
+import qualified AST as A
+import CompState
import Errors
+import Pass
+import Pattern
+import RainTypes
+import TestUtil
+import TreeUtil
+import Types
constantFoldTest :: Test
constantFoldTest = TestList
diff --git a/frontends/StructureOccam.hs b/frontends/StructureOccam.hs
index 881ebf4..868713b 100644
--- a/frontends/StructureOccam.hs
+++ b/frontends/StructureOccam.hs
@@ -19,8 +19,6 @@ with this program. If not, see .
-- | Analyse syntactic structure of occam code.
module StructureOccam (structureOccam) where
-import Data.Generics
-
import Errors
import LexOccam
import Metadata
diff --git a/transformations/PassTest.hs b/transformations/PassTest.hs
index 9cee79a..8f5e029 100644
--- a/transformations/PassTest.hs
+++ b/transformations/PassTest.hs
@@ -18,21 +18,17 @@ with this program. If not, see .
module PassTest (tests) where
-import Test.HUnit hiding (State)
-import Control.Monad.State as CSM
-import qualified Data.Map as Map
-import qualified AST as A
-import TestUtil
-import Pattern
-import TreeUtil
-import CompState
-import Control.Monad.Error (runErrorT)
import Control.Monad.Identity
-import Types
-import Pass
import Data.Generics
-import Utils
+import qualified Data.Map as Map
+import Test.HUnit hiding (State)
+
+import qualified AST as A
+import CompState
+import Pattern
import SimplifyExprs
+import TestUtil
+import TreeUtil
valof0 :: A.Structured
valof0 = A.OnlyEL m $ A.ExpressionList m [intLiteral 0]
diff --git a/transformations/SimplifyExprs.hs b/transformations/SimplifyExprs.hs
index 9508afa..922c709 100644
--- a/transformations/SimplifyExprs.hs
+++ b/transformations/SimplifyExprs.hs
@@ -22,14 +22,13 @@ module SimplifyExprs where
import Control.Monad.State
import Data.Generics
import qualified Data.Map as Map
-import Data.Maybe
import qualified AST as A
import CompState
import Errors
import Metadata
-import Types
import Pass
+import Types
simplifyExprs :: A.Process -> PassM A.Process
simplifyExprs = runPasses passes
diff --git a/transformations/SimplifyProcs.hs b/transformations/SimplifyProcs.hs
index 9bc7533..b5d22b5 100644
--- a/transformations/SimplifyProcs.hs
+++ b/transformations/SimplifyProcs.hs
@@ -21,8 +21,6 @@ module SimplifyProcs (simplifyProcs) where
import Control.Monad.State
import Data.Generics
-import qualified Data.Map as Map
-import Data.Maybe
import qualified AST as A
import CompState
diff --git a/transformations/Unnest.hs b/transformations/Unnest.hs
index c493f46..02321fa 100644
--- a/transformations/Unnest.hs
+++ b/transformations/Unnest.hs
@@ -26,10 +26,10 @@ import Data.Maybe
import qualified AST as A
import CompState
+import Errors
import EvalConstants
import Metadata
import Pass
-import Errors
import Types
unnest :: A.Process -> PassM A.Process
diff --git a/transformations/UsageCheck.hs b/transformations/UsageCheck.hs
index 4b0726d..5598cce 100644
--- a/transformations/UsageCheck.hs
+++ b/transformations/UsageCheck.hs
@@ -18,12 +18,12 @@ with this program. If not, see .
module UsageCheck where
-import qualified AST as A
import Data.Generics
-import Metadata
import Data.List
import Data.Maybe
+import qualified AST as A
+
--An obvious thing to do would be to hold these lists (of written/read variables respectively) instead as sets
--However, this would involve defining an ordering over A.Variable. This would be do-able for plain A.Variables,
--but in order to define a proper ordering for subscripted variables, we would end up needing to provide an
diff --git a/transformations/UsageCheckTest.hs b/transformations/UsageCheckTest.hs
index 41ca3e6..727e6e5 100644
--- a/transformations/UsageCheckTest.hs
+++ b/transformations/UsageCheckTest.hs
@@ -18,14 +18,13 @@ with this program. If not, see .
module UsageCheckTest (tests) where
-import qualified UsageCheck as UC
-import qualified AST as A
-import Test.HUnit
-import Metadata (Meta,emptyMeta)
import Prelude hiding (fail)
+import Test.HUnit
+
+
+import qualified AST as A
import TestUtil
-import Data.List
-import Data.Ord
+import qualified UsageCheck as UC
--See note in UsageCheck about WrittenRead not using sets. Therefore our equality function is inefficient