-----------------------------------------------------------------------------
--- $Id: GetImports.hs,v 1.1 2000/11/16 15:57:05 simonmar Exp $
+-- $Id: GetImports.hs,v 1.2 2000/11/17 13:33:17 sewardj Exp $
--
-- GHC Driver program
--
import List
import Char
-getImports :: String -> ([ModuleName], [ModuleName])
-getImports str
- = let all_imps = (nub . gmiBase . clean) str
- srcs = concatMap (either unit nil) all_imps
- normals = concatMap (either nil unit) all_imps
- unit x = [x]
- nil x = []
- in (srcs, normals)
-
--- really get the imports from a de-litted, cpp'd, de-literal'd string
--- Lefts are source imports. Rights are normal ones.
-gmiBase :: String -> [Either ModuleName ModuleName]
-gmiBase s
- = f (words s)
+getImports :: String -> ([ModuleName], [ModuleName], ModuleName)
+getImports s
+ = f [{-accum source imports-}] [{-accum normal imports-}]
+ (mkModuleName "Main") (words (clean s))
where
- f ("foreign" : "import" : ws) = f ws
- f ("import" : "{-#" : "SOURCE" : "#-}" : "qualified" : m : ws)
- = Left (mkMN m) : f ws
- f ("import" : "{-#" : "SOURCE" : "#-}" : m : ws)
- = Left (mkMN m) : f ws
- f ("import" : "qualified" : m : ws)
- = Right (mkMN m) : f ws
- f ("import" : m : ws)
- = Right (mkMN m) : f ws
- f (w:ws) = f ws
- f [] = []
+ f si ni _ ("module" : me : ws) = f si ni (mkModuleName me) ws
+
+ f si ni me ("foreign" : "import" : ws) = f si ni me ws
+ f si ni me ("import" : "{-#" : "SOURCE" : "#-}" : "qualified" : m : ws)
+ = f ((mkMN m):si) ni me ws
+ f si ni me ("import" : "{-#" : "SOURCE" : "#-}" : m : ws)
+ = f ((mkMN m):si) ni me ws
+ f si ni me ("import" : "qualified" : m : ws)
+ = f si ((mkMN m):ni) me ws
+ f si ni me ("import" : m : ws)
+ = f si ((mkMN m):ni) me ws
+ f si ni me (w:ws) = f si ni me ws
+ f si ni me [] = (nub si, nub ni, me)
mkMN str = mkModuleName (takeWhile isModId str)
isModId c = isAlphaNum c || c `elem` "'_"