@@ -34,7 +34,7 @@ import Control.Monad ( when, forM, forM_ )
34
34
import Data.Typeable ( Typeable )
35
35
import Data.Monoid ( Endo (.. ) )
36
36
import Data.Maybe ( fromMaybe )
37
- import Data.List ( unfoldr , intercalate )
37
+ import Data.List ( nub , unfoldr )
38
38
import Data.Char ( isAlpha , isAlphaNum , isUpperCase )
39
39
40
40
import System.FilePath ( (</>) , (<.>) , takeBaseName , takeDirectory , takeExtension )
@@ -72,8 +72,8 @@ initCodeBlocks dependenciesOpt = do
72
72
73
73
-- add hooks for writing out files (and possibly compiling the project)
74
74
let finalizer = case dependenciesOpt of
75
- Nothing -> fileFinalizer True
76
- Just deps -> fileFinalizer False *> cargoFinalizer [] deps
75
+ Nothing -> fileFinalizer
76
+ Just deps -> fileFinalizer *> cargoFinalizer [] deps
77
77
addModFinalizer finalizer
78
78
79
79
-- add a module state
@@ -159,23 +159,19 @@ cargoFinalizer extraArgs dependencies = do
159
159
nameFiles <- filter ((" .ffinames" == ) . takeExtension) <$> runIO (listFilesRecursive srcDir)
160
160
161
161
let modDir dir = do
162
- let parentMod =
163
- case takeBaseName dir of
164
- " src" -> " "
165
- foo -> foo
166
162
subdirs <- listDirectories dir
167
163
mapM_ modDir subdirs
168
164
srcs <- filter (\ file -> takeExtension file == " .rs" && isUpperCase (head $ takeBaseName file)) <$> listFiles dir
169
- let modules = takeBaseName <$> (subdirs <> srcs)
170
- writeFile (dir </> " mod.rs" ) . unlines . concat $ [ [" " , " pub mod " <> name <> " ;" , " pub use " <> fullName <> " ::*;" ]
165
+ let modules = nub $ takeBaseName <$> (subdirs <> srcs)
166
+ writeFile (dir </> " mod.rs" ) . unlines . concat $ [ [" " , " pub mod " <> name <> " ;" , " pub use self:: " <> name <> " ::*;" ]
171
167
| name <- modules
172
- , let fullName = intercalate " ::" [parentMod, name]
173
168
]
174
169
175
170
runIO $ do
176
171
modDir srcDir
177
- readFile (srcDir </> " mod.rs " ) >>= appendFile (srcDir </> " lib .rs" )
172
+ modules <- readFile (srcDir </> " mod .rs" )
178
173
removeFile $ srcDir </> " mod.rs"
174
+ writeFile (srcDir </> " lib.rs" ) $ " #![allow(warnings)]\n\n " <> modules
179
175
180
176
names <- runIO $ concat <$> forM nameFiles (fmap lines . readFile )
181
177
ffiFakeSig <- [t | IO () |]
@@ -189,6 +185,7 @@ cargoFinalizer extraArgs dependencies = do
189
185
cargoSrc = unlines [ " [package]"
190
186
, " name = \" " ++ crate ++ " \" "
191
187
, " version = \" 0.0.0\" "
188
+ , " edition = \" 2021\" "
192
189
193
190
, " [dependencies]"
194
191
, unlines [ name ++ " = \" " ++ version ++ " \" "
@@ -260,13 +257,13 @@ rustcErrMsg = "Rust source file associated with this module failed to compile"
260
257
-- a module. This emits into a file in the @.inline-rust@ directory all of the
261
258
-- Rust code we have produced while processing the current files contexts and
262
259
-- quasiquotes.
263
- fileFinalizer :: Bool -> Q ()
264
- fileFinalizer submodule = do
260
+ fileFinalizer :: Q ()
261
+ fileFinalizer = do
265
262
(pkg, mods) <- currentFile
266
263
267
264
let pkgDir = " .inline-rust" </> pkg
268
265
srcDir = pkgDir </> " src"
269
- thisFile = if submodule then foldr1 (</>) mods else " lib "
266
+ thisFile = foldr1 (</>) mods
270
267
271
268
-- Figure out what we are putting into this file
272
269
Just cb <- getQ
0 commit comments