@@ -52,6 +52,7 @@ import qualified Data.List.Split as Spl
5252import Data.List
5353import Data.Monoid
5454import Data.Char
55+import qualified Data.Map as M
5556import qualified Data.HashSet as HS
5657import qualified Data.Text as T
5758import qualified Data.ByteString.UTF8 as UTF8
@@ -91,13 +92,14 @@ moduleHeader = try (do reserved "module"
9192{- | Parses an import statement
9293 Import ::= 'import' Identifier_t ';'?;
9394 -}
94−import_ :: IdrisParser String
95+import_ :: IdrisParser (String, Maybe String)
9596import_ = do reserved "import"
9697 id <- identifier
98+ newName <- optional (reserved "as" *> identifier)
9799 option ';' (lchar ';')
98− return (toPath id)
100+ return (toPath id, toPath <$> newName)
99101 <?> "import statement"
100− where toPath f = foldl1' (</>) (Spl.splitOn "." f)
102+ where toPath = foldl1' (</>) . Spl.splitOn "."
101103
102104{- | Parses program source
103105 Prog ::= Decl* EOF;
@@ -934,7 +936,7 @@ parseTactic :: IState -> String -> Result PTactic
934936parseTactic st = runparser (fullTactic defaultSyntax) st "(input)"
935937
936938-- | Parse module header and imports
937−parseImports :: FilePath -> String -> Idris ([String], [String], Maybe Delta)
939+parseImports :: FilePath -> String -> Idris ([String], [(String, Maybe String)], Maybe Delta)
938940parseImports fname input
939941 = do i <- getIState
940942 case parseString (runInnerParser (evalStateT imports i)) (Directed (UTF8.fromString fname) 0 0 0 0) input of
@@ -942,7 +944,7 @@ parseImports fname input
942944 Success (x, i) -> do -- Discard state updates (there should be
943945 -- none anyway)
944946 return x
945− where imports :: IdrisParser (([String], [String], Maybe Delta), IState)
947+ where imports :: IdrisParser (([String], [(String, Maybe String)], Maybe Delta), IState)
946948 imports = do whiteSpace
947949 mname <- moduleHeader
948950 ps <- many import_
@@ -1053,13 +1055,17 @@ loadSource h lidr f
10531055 let def_total = default_total i
10541056 file_in <- runIO $ readFile f
10551057 file <- if lidr then tclift $ unlit f file_in else return file_in
1056− (mname, modules, pos) <- parseImports f file
1058+ (mname, imports, pos) <- parseImports f file
1059+ let modules = map fst imports
1060+ modAliases = M.fromList
1061+ [(prep alias, prep realName)| (realName, Just alias) <- imports]
1062+ prep = map T.pack . Spl.splitOn "/"
10571063 i <- getIState
10581064 putIState (i { default_access = Hidden })
10591065 clearIBC -- start a new .ibc file
10601066 mapM_ (addIBC . IBCImport) modules
1061− ds' <- parseProg (defaultSyntax {syn_namespace = reverse mname })
1062− f file pos
1067+ let syntax = defaultSyntax{ syn_namespace = reverse mname }
1068+ ds' <- parseProg syntax f file pos
10631069 unless (null ds') $ do
10641070 let ds = namespaces mname ds'
10651071 logLvl 3 (showDecls True ds)