Sockeye: Fix import system
authorDaniel Schwyn <schwyda@student.ethz.ch>
Thu, 20 Jul 2017 13:55:12 +0000 (15:55 +0200)
committerDaniel Schwyn <schwyda@student.ethz.ch>
Thu, 20 Jul 2017 13:55:12 +0000 (15:55 +0200)
Signed-off-by: Daniel Schwyn <schwyda@student.ethz.ch>

tools/sockeye/Main.hs
tools/sockeye/SockeyeParser.hs

index 2ffa201..f269aaf 100644 (file)
@@ -20,6 +20,7 @@ import qualified Data.Map as Map
 import System.Console.GetOpt
 import System.Exit
 import System.Environment
+import System.FilePath
 import System.IO
 
 import qualified SockeyeASTParser as ParseAST
@@ -125,7 +126,7 @@ parseSpec :: FilePath -> IO (ParseAST.SockeyeSpec)
 parseSpec file = do
     let
         rootImport = ParseAST.Import file
-    specMap <- parseWithImports Map.empty rootImport
+    specMap <- parseWithImports "" Map.empty rootImport
     let
         specs = Map.elems specMap
         topLevelSpec = specMap Map.! file
@@ -135,11 +136,15 @@ parseSpec file = do
         , ParseAST.modules = modules
         }
     where
-        parseWithImports importMap (ParseAST.Import fileName) = do
+        parseWithImports pwd importMap (ParseAST.Import filePath) = do
             let
+                dir = case pwd of
+                    "" -> takeDirectory filePath
+                    _  -> pwd </> takeDirectory filePath
+                fileName = takeFileName filePath
                 file = if '.' `elem` fileName
-                    then fileName
-                    else fileName ++ ".soc"
+                    then dir </> fileName
+                    else dir </> fileName <.> "soc"
             if file `Map.member` importMap
                 then return importMap
                 else do
@@ -147,7 +152,7 @@ parseSpec file = do
                     let
                         specMap = Map.insert file ast importMap
                         imports = ParseAST.imports ast
-                    foldM parseWithImports specMap imports
+                    foldM (parseWithImports dir) specMap imports
 
 {- Runs the parser on a single file -}
 parseFile :: FilePath -> IO (ParseAST.SockeyeSpec)
index 3751382..c3f50ca 100644 (file)
@@ -356,7 +356,7 @@ keywords = ["import", "module",
 identStart     = letter
 identLetter    = alphaNum <|> char '_' <|> char '-'
 
-importPath     = many (identLetter <|> char '/') <* whiteSpace
+importPath     = many (identLetter <|> char '/' <|> char '.') <* whiteSpace
 moduleName     = identString <?> "module name"
 parameterName  = identString <?> "parameter name"
 variableName   = identString <?> "variable name"