68 lines
1.9 KiB
Markdown
68 lines
1.9 KiB
Markdown
# hsie - Swiss army knife for HaSkell Imports and Exports
|
|
|
|
This tool parses Haskell source code to analyse the imports and exports in a
|
|
project. It's available in PostgREST's `nix-shell` by default.
|
|
|
|
## Dumping imports
|
|
|
|
Given source code in the directories `src` and `main`, for example, you can run:
|
|
|
|
```
|
|
hsie dump-imports src main
|
|
```
|
|
|
|
This dumps all imports of the modules in the given directory to a CSV file,
|
|
printed on `stdout`.
|
|
|
|
To dump to a JSON file (e.g., to further process with `jq`), add the `--json`
|
|
flag:
|
|
|
|
```
|
|
hsie dump-imports --json src main
|
|
```
|
|
|
|
## Graphing imports
|
|
|
|
The tool can generate `graphviz` graphs of module and symbol imports by printing
|
|
a file to `stdout` that can directly be rendered with `dot`:
|
|
|
|
```
|
|
hsie graph-modules src main | dot -Tpng -o modules.png
|
|
```
|
|
|
|
The command `graph-modules` prints a graph of which modules insert which other
|
|
modules. `graph-symbols` shows which symbols are imported from which modules.
|
|
|
|
## Checking imports
|
|
|
|
To check whether modules are imported under consistent aliases in your project,
|
|
run:
|
|
|
|
```
|
|
hsie check-aliases main src
|
|
```
|
|
|
|
This will exit with a non-zero exit code if any inconsistent aliases are found.
|
|
|
|
The following command checks whether any modules are imported as wildcards, i.e.
|
|
not qualified and without specifying symbols.
|
|
|
|
```
|
|
hsie check-wildcards main src
|
|
```
|
|
|
|
To whitelist certain modules to be imported as wildcards, use `--ok`:
|
|
|
|
```
|
|
hsie check-wildcards main src --ok Protolude --ok Test.Module
|
|
```
|
|
|
|
## Current limitations
|
|
|
|
This tool uses the GHC parser to parse Haskell source code. Language extensions
|
|
required to parse each file are detected based on the `{-# LANGUAGE ... #-}`
|
|
pragmas. If they are not available (e.g., as they are listed as default
|
|
extensions in the `.cabal` file), parses may fail. We can fix this by using
|
|
an extended set of non-conflicting extensions by default, as `hlint` does for
|
|
example.
|