[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/haskell-tng-mode cce466c 271/385: hsinspect now has a comp
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/haskell-tng-mode cce466c 271/385: hsinspect now has a compiler plugin |
Date: |
Tue, 5 Oct 2021 23:59:45 -0400 (EDT) |
branch: elpa/haskell-tng-mode
commit cce466c4ec314ba4f18cd9256ed68f22cc49fa3a
Author: Tseen She <ts33n.sh3@gmail.com>
Commit: Tseen She <ts33n.sh3@gmail.com>
hsinspect now has a compiler plugin
---
README.md | 14 ++----
cabal-ghcflags.sh | 113 -----------------------------------------------
haskell-tng-hsinspect.el | 27 +----------
3 files changed, 6 insertions(+), 148 deletions(-)
diff --git a/README.md b/README.md
index 77ba24f..d532977 100644
--- a/README.md
+++ b/README.md
@@ -68,19 +68,15 @@ You must install `hsinspect` for every version of `ghc`
that you plan to use, e.
```
rm -f ~/.cabal/bin/hsinspect
for V in 8.4.4 8.6.5 ; do
- cabal v2-install hsinspect -w ghc-$V -O2 &&
+ cabal v2-install hsinspect-0.0.4 -w ghc-$V -O2 &&
mv -f ~/.cabal/bin/hsinspect ~/.cabal/bin/hsinspect-ghc-$V
done
```
-<!--
-for V in 8.4.4 8.6.5 ; do
- cabal v2-install exe:hsinspect -w ghc-$V -O2 &&
- mv -f ~/.cabal/bin/hsinspect ~/.cabal/bin/hsinspect-ghc-$V
-done
--->
+And add the compiler plugin to every project you plan to inspect:
-To use `hsinspect` commands, generate `.ghc.flags` / `.ghc.version` files by
running `M-x haskell-tng-hsinspect` for a project. This is only needed when the
dependencies change.
+1. add a dependency on `hsinspect`
+2. add `-fplugin HsInspect.Plugin` to `ghc-options`
`hsinspect` only works when the dependencies of the current file have been
compiled (the current file doesn't need to be compilable).
@@ -88,8 +84,6 @@ The `haskell-tng-extra-company` package will automatically
complete symbols that
To find out which module a symbol belongs to, use `M-x
haskell-tng-fqn-at-point`.
-The are some limitations to this tool in addition to known bugs. See [the gory
details](https://gitlab.com/tseenshe/hsinspect) for more information. Hopefully
there will be no need for `M-x haskell-tng-hsinspect` and the `.ghc.*` files in
a future release.
-
## Contrib
Integrations are provided for common libraries and external applications.
diff --git a/cabal-ghcflags.sh b/cabal-ghcflags.sh
deleted file mode 100755
index 2a9c5f9..0000000
--- a/cabal-ghcflags.sh
+++ /dev/null
@@ -1,113 +0,0 @@
-#!/usr/bin/env bash
-
-# Dump the ghc flags that cabal-install uses to launch a repl session for
-# all components into files named `.ghc.flags.component'.
-#
-# This is a partial workaround to https://github.com/haskell/cabal/issues/6203
-#
-# Note that this flushes the build plan cache and only supports the default
-# build flags. If users wish to include test phases they must add tests: True
-# to their cabal.project.local
-
-set -e
-
-TMP="/tmp/cabal-ghcflags-$USER/$PWD"
-mkdir -p "$TMP" 2> /dev/null || true
-
-# to ensure the json plan is in place
-echo "Resolving dependencies"
-# cabal v2-build -v0 :all --dry
-# best just ensure deps are compiled otherwise the repl compiles them
-cabal v2-build :all --only-dependencies
-
-if [ ! -f dist-newstyle/cache/plan.json ] ; then
- echo "dist-newstyle/cache/plan.json not found"
- exit 1
-fi
-
-# seems to be a bug in cabal...
-mkdir dist-newstyle/tmp 2> /dev/null || true
-
-cabal v2-exec -v0 ghc -- --numeric-version > .ghc.version
-GHC=$(cabal v2-exec -v2 ghc -- --numeric-version | tail -2 | head -1 | sed 's/
.*//')
-
-# ghc is called multiple times during the v2-repl startup.
-# The only call that we're interested in is this one.
-cat <<EOF > "$TMP/ghc"
-#!/usr/bin/env bash
-if [ "\$1" == "--interactive" ]; then
- echo -n "\${@:2}" >> "\$OUTPUT"
-else
- exec "$GHC" "\$@"
-fi
-EOF
-chmod 755 "$TMP/ghc"
-
-GHC_PKG=$(echo "$GHC" | rev | sed 's/chg/gkp-chg/' | rev)
-cat <<EOF > "$TMP/ghc-pkg"
-#!/usr/bin/env bash
-exec "$GHC_PKG" "\$@"
-EOF
-chmod 755 "$TMP/ghc-pkg"
-
-HSC2HS=$(echo "$GHC" | rev | sed 's/chg/sh2csh/' | rev)
-cat <<EOF > "$TMP/hsc2hs"
-#!/usr/bin/env bash
-exec "$HSC2HS" "\$@"
-EOF
-chmod 755 "$TMP/hsc2hs"
-
-create_ghcflags() {
- LINE="$1"
-
- NAME=$(echo "$LINE" | jq -r '.[0]')
- PART=$(echo "$LINE" | jq -r '.[1]')
- ROOT=$(echo "$LINE" | jq -r '.[2]')
- ID=$(echo "$LINE" | jq -r '.[3]')
-
- if [ "$PART" == "lib" ] ; then
- COMPONENT="lib:$NAME"
- elif [ "$PART" == "setup" ] || [ "$PART" == "test:doctests" ] ; then
- echo " $NAME:$PART SKIPPED"
- return 0;
- else
- COMPONENT="$PART"
- fi
-
- echo " $NAME:$COMPONENT $ID"
-
- export OUTPUT="$TMP/out.$NAME:$COMPONENT"
-
- rm "$OUTPUT" 2> /dev/null || true
- cabal v2-repl -v0 -w "$TMP/ghc" "$NAME:$COMPONENT"
-
- # TODO also need to provide the PATH, since it might include commands that
- # are referred to from compiler plugins (e.g. tasty-discover).
-
- # extract all the source directories that use these flags
- for D in $(cat "$OUTPUT" | tr ' ' '\n' | grep '^-i' | sed 's/^-i//' | sed
'/^$/d') ; do
- if [[ "$D" != /* ]] ; then
- D="$ROOT/$D"
- if [ -d "$D" ] ; then
- # echo " $D/.ghc.flags"
- cat "$OUTPUT" > "$D/.ghc.flags"
- fi
- fi
- done
-}
-
-echo "Inspecting build plan"
-for LINE in $(jq -c '(."install-plan"[] | select(."pkg-src".type == "local") |
select(."component-name" != null) | [ ."pkg-name", ."component-name",
."pkg-src".path, .id ] )' dist-newstyle/cache/plan.json) ; do
- # NOTE: could be done in parallel, but I haven't measured it being faster
- create_ghcflags "$LINE"
-done
-# and again for custom Setup.hs builds...
-for LINE in $(jq -c '(."install-plan"[] | select(."pkg-src".type == "local") |
select(."components" != null) | . as $p | .["components"] | keys[] | [
$p."pkg-name" , . , $p."pkg-src".path , $p.id] )'
dist-newstyle/cache/plan.json) ; do
- create_ghcflags "$LINE"
-done
-
-wait
-
-if [ -d "$TMP" ] ; then
- rm -rf "$TMP"
-fi
diff --git a/haskell-tng-hsinspect.el b/haskell-tng-hsinspect.el
index 5e12793..b2602e2 100644
--- a/haskell-tng-hsinspect.el
+++ b/haskell-tng-hsinspect.el
@@ -31,29 +31,6 @@ name of the symbol at point in the minibuffer."
(error "hsinspect is not available")
(message "<not imported>"))))
-(defvar haskell-tng-hsinspect
- ;; NOTE in order for this hack to work, the user needs to have setup a
- ;; cabal.project.local that contains their default options (optimisations,
- ;; enabling tests, etc) otherwise it will (at best) invalidate the cache and
- ;; (at worst) not find local projects.
- (expand-file-name
- "cabal-ghcflags.sh"
- (when load-file-name
- (file-name-directory load-file-name))))
-;;;###autoload
-(defun haskell-tng-hsinspect ()
- "Required (for now) to initialise a project for use with `hsinspect'.
-Only needs to be performed once every time the dependencies
-change."
- (interactive)
- (when-let ((default-directory
- (or
- (haskell-tng--util-locate-dominating-file
- haskell-tng--compile-dominating-project)
- (haskell-tng--util-locate-dominating-file
- haskell-tng--compile-dominating-package))))
- (async-shell-command haskell-tng-hsinspect)))
-
(defun haskell-tng--hsinspect-ghcflags ()
;; https://github.com/haskell/cabal/issues/6203
"Obtain the ghc flags for the current buffer"
@@ -62,7 +39,7 @@ change."
(insert-file-contents (expand-file-name ".ghc.flags"))
(split-string
(buffer-substring-no-properties (point-min) (point-max))))
- (user-error "could not find `.ghc.flags'. Run `M-x
haskell-tng-hsinspect'")))
+ (user-error "could not find `.ghc.flags'.")))
(defun haskell-tng--hsinspect-ghc ()
"Obtain the version of hsinspect that matches the project's compiler."
@@ -72,7 +49,7 @@ change."
(concat
"hsinspect-ghc-"
(string-trim (buffer-substring-no-properties (point-min)
(point-max)))))
- (user-error "could not find `.ghc.version'. Run `M-x
haskell-tng-hsinspect'")))
+ (user-error "could not find `.ghc.version'.")))
;; TODO invalidate cache when imports section has changed
;; TODO is there a way to tell Emacs not to render this in `C-h v'?
- [nongnu] elpa/haskell-tng-mode 6a31b59 101/385: document the plan for indentation, (continued)
- [nongnu] elpa/haskell-tng-mode 6a31b59 101/385: document the plan for indentation, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 9ec4841 104/385: meh indentation, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode ea46850 207/385: bugfix for compile vs runtime loading, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 63b1c8d 250/385: flip the default newline / comment behaviour, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 83458d6 253/385: reverting newline comment behaviour, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode f59c9ee 259/385: fix indentation of short type signatures, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode dbbe488 265/385: abbrevs don't fire in comments / strings, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode f56bd2a 256/385: prefer optimised hsinspect builds, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode e84970b 263/385: rename -contrib to -extra, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode af443a1 269/385: fix a name clash in the tests, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode cce466c 271/385: hsinspect now has a compiler plugin,
ELPA Syncer <=
- [nongnu] elpa/haskell-tng-mode d0cd9b9 252/385: documenting an annoying indentation bug, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode afbac7c 300/385: missing import, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 7060573 286/385: moar work to do here, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 89db192 289/385: more thots, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode b46dbd1 305/385: refactoring of the cache for more reuse later, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode ff76e07 304/385: cache the index command, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 2653ce7 312/385: checks on the hsinspect binary, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode da20f0d 314/385: note about limitations on nixos, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 52d984a 324/385: fix cache typo, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode ae8ebbc 320/385: thots, ELPA Syncer, 2021/10/06