1
1
mirror of https://github.com/nmattia/snack.git synced 2024-09-21 08:37:09 +03:00

Merge pull request #6 from nmattia/nm-suppor-th-ghci

Add TH support in GHCi
This commit is contained in:
Nicolas Mattia 2018-06-02 00:35:24 +02:00 committed by GitHub
commit 3004800598
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 84 additions and 66 deletions

View File

@ -68,7 +68,7 @@ case $COMMAND in
;; ;;
ghci) ghci)
res=$("$NIX_BUILD" --no-out-link -A ghci "$SNACK_NIX") res=$("$NIX_BUILD" --no-out-link -A ghci "$SNACK_NIX")
"$res/bin/ghci" "$res"
;; ;;
run) run)
res=$("$NIX_BUILD" --no-out-link -A build "$SNACK_NIX") res=$("$NIX_BUILD" --no-out-link -A build "$SNACK_NIX")

View File

@ -62,6 +62,11 @@ pushd tests/template-haskell-3
./test ./test
popd popd
banner "Test Template Haskell 4"
pushd tests/template-haskell-4
./test
popd
banner "Test stack-exe formatting" banner "Test stack-exe formatting"
list=$(shfmt -i 2 -l bin/snack) list=$(shfmt -i 2 -l bin/snack)
if [[ -n "$list" ]]; then if [[ -n "$list" ]]; then

View File

@ -93,10 +93,6 @@ let
makeSymModule = makeSymModule =
# TODO: symlink instead of copy # TODO: symlink instead of copy
"rsync -r ${singleOutModule base mod.moduleName}/ ."; "rsync -r ${singleOutModule base mod.moduleName}/ .";
pred = file: path: type: pred = file: path: type:
let let
topLevel = (builtins.toString base) + "/"; topLevel = (builtins.toString base) + "/";
@ -259,6 +255,13 @@ let
allModuleNames = modSpec: allModuleNames = modSpec:
[ modSpec.moduleName ] ++ (pkgs.lib.lists.concatMap allModuleNames modSpec.moduleDependencies); [ modSpec.moduleName ] ++ (pkgs.lib.lists.concatMap allModuleNames modSpec.moduleDependencies);
allModuleDirectories = modSpec:
pkgs.lib.lists.concatLists
(
[ modSpec.moduleDirectories ]
++ (pkgs.lib.lists.concatMap allModuleDirectories modSpec.moduleDependencies)
);
# Write a new ghci executable that loads all the modules defined in the # Write a new ghci executable that loads all the modules defined in the
# module spec # module spec
ghciExecutable = ghc: ghcOpts: base: modSpec: ghciExecutable = ghc: ghcOpts: base: modSpec:
@ -268,19 +271,40 @@ let
absoluteModuleFiles = map prependBase moduleFiles; absoluteModuleFiles = map prependBase moduleFiles;
moduleFiles = map moduleToFile modules; moduleFiles = map moduleToFile modules;
modules = allModuleNames modSpec; modules = allModuleNames modSpec;
dirs = allModuleDirectories modSpec;
prependBase = f: builtins.toString base + "/${f}"; prependBase = f: builtins.toString base + "/${f}";
newGhc =
pkgs.symlinkJoin
{ name = "ghci";
paths = [ ghc ];
postBuild =
''
wrapProgram "$out/bin/ghci" \
--add-flags "${ghciArgs}"
'';
buildInputs = [pkgs.makeWrapper];
};
in in
pkgs.symlinkJoin # This symlinks the extra dirs to $PWD for GHCi to work
{ name = "ghci"; pkgs.writeScript "ghci-with-files"
paths = [ ghc ]; ''
postBuild = set -euo pipefail
''
source $stdenv/setup TRAPS=""
wrapProgram "$out/bin/ghci" \ for i in ${pkgs.lib.strings.escapeShellArgs dirs}; do
--add-flags "${ghciArgs}" if [ "$i" != "$PWD" ]; then
''; for j in $(find "$i" ! -path "$i"); do
buildInputs = [pkgs.makeWrapper]; file=$(basename $j)
}; echo "Temporarily symlinking $j to $file..."
ln -s $j $file
TRAPS="rm $file ; $TRAPS"
trap "$TRAPS" EXIT
echo "done."
done
fi
done
${newGhc}/bin/ghci
'';
executable = descr: executable = descr:
let let
@ -298,20 +322,14 @@ let
if builtins.isList descr.extra-files if builtins.isList descr.extra-files
then (_x: descr.extra-files) then (_x: descr.extra-files)
else descr.extra-files else descr.extra-files
else (x: []); else (_x: []);
#if (builtins.hasAttr "extra-files" descr)
#then
#if builtins.isList descr.extra-files
#then (_x: descr.extra-files)
#else descr.extra-files
#else (x: []);
extraDirs = extraDirs =
if (builtins.hasAttr "extra-directories" descr) if (builtins.hasAttr "extra-directories" descr)
then then
if builtins.isList descr.extra-directories if builtins.isList descr.extra-directories
then (_x: descr.extra-directories) then (_x: descr.extra-directories)
else descr.extra-directories else descr.extra-directories
else (x: []); else (_x: []);
mainModName = descr.main; mainModName = descr.main;
in in
{ {

View File

@ -1,5 +0,0 @@
import Conduit
import FooBar
main :: IO ()
main = runConduit $ spitOut .| takeC 5 .| digest

View File

@ -1,9 +0,0 @@
module FooBar where
import Conduit
spitOut :: ConduitT () Int IO ()
spitOut = yieldMany [ 1 ..]
digest :: ConduitT Int Void IO ()
digest = mapM_C print

View File

@ -1,5 +0,0 @@
import Conduit
import FooBar
main :: IO ()
main = runConduit $ spitOut .| takeC 5 .| digest

View File

@ -1,9 +0,0 @@
module FooBar where
import Conduit
spitOut :: ConduitT () Int IO ()
spitOut = yieldMany [ 1 ..]
digest :: ConduitT Int Void IO ()
digest = mapM_C print

View File

@ -0,0 +1 @@
Hello, World!

View File

@ -0,0 +1,2 @@
Hello, World!

View File

@ -0,0 +1,11 @@
let
pkgs = import ../../nix {};
snack = pkgs.snack.snack-lib;
in
snack.executable
{ main = "Main";
src = ./src;
dependencies = ["file-embed"];
extra-directories =
(modName: if modName == "Main" then [ ./assets ] else []);
}

View File

@ -0,0 +1,9 @@
{-# LANGUAGE TemplateHaskell #-}
module Main where
import Data.FileEmbed
import qualified Data.ByteString.Char8 as BS8
main :: IO ()
main = BS8.putStrLn $(embedFile "foo.txt")

14
tests/template-haskell-4/test Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env bash
# vim: ft=sh sw=2 et
set -euo pipefail
snack build
snack run | diff golden -
TMP_FILE=$(mktemp)
capture_io "$TMP_FILE" main | snack ghci
diff golden $TMP_FILE
rm $TMP_FILE

View File

@ -1,5 +0,0 @@
import Conduit
import FooBar
main :: IO ()
main = runConduit $ spitOut .| takeC 5 .| digest

View File

@ -1,9 +0,0 @@
module FooBar where
import Conduit
spitOut :: ConduitT () Int IO ()
spitOut = yieldMany [ 1 ..]
digest :: ConduitT Int Void IO ()
digest = mapM_C print