ghc-tags-plugin: A compiler plugin which generates tags file from GHC syntax tree.

[ development, library, mpl ] [ Propose Tags ]

A compiler source plugin which takes parsed Haskell syntax tree and saves tags file to disk, leaving the parsed tree untouched.


[Skip to Readme]
Versions [faq] 0.1.0.0, 0.1.0.1, 0.1.0.2, 0.1.1.0, 0.1.2.0, 0.1.2.1, 0.1.3.0, 0.1.4.0, 0.1.5.0, 0.1.6.0, 0.2.0.0
Change log CHANGELOG.md
Dependencies attoparsec (>=0.13.0.0 && <0.14), base (>=4.12.0.0 && <4.14), bytestring (==0.10.*), containers (==0.6.*), directory (==1.3.*), ghc (>=8.4 && <8.9), gitrev (==1.3.*), text (==1.2.*) [details]
License MPL-2.0
Copyright (c) 2020, Marcin Szamotulski
Author Marcin Szamotulski
Maintainer profunctor@pm.me
Category Development
Home page https://github.com/coot/ghc-tags-plugin#readme
Bug tracker https://github.com/coot/ghc-tags-plugin/issues
Source repo head: git clone https://github.com/coot/ghc-tags-plugin
Uploaded by coot at 2020-03-07T12:43:22Z
Distributions NixOS:0.2.0.0
Downloads 1437 total (51 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2020-03-07 [all 1 reports]

Modules

[Index] [Quick Jump]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for ghc-tags-plugin-0.1.2.0

[back to package description]

Ghc Tags Compiler Plugin

A Ghc Compiler Plugin which generates tags for each compiled module or component.

Requirements

ghc >= 8.6

vim configuration

Each generated tags file is put next to the corresponding *.cabal file. If you just have a repo with a cabal file in the main directory vim default tags setting will work, if you have some modules in subdirectories you will need to set:

:set tags+=*/tags

Plugin usage

Configuration of this plugin requires some familiarity with ghc packages. Check out documentation how to use -plugin-package or -plugin-package-id. In the examples below we us -plugin-package=ghc-tags-plugin but specifying version -package=ghc-tags-plugin-0.0.0.0 (where 0.0.0.0 is the version you installed), might work better. You can use ghc-pkg latest (likely with appropriate --package-db flag) to check which version is available.

ghc

ghc -plugin-package=ghc-tags-plugin -fplugin=Plugin.GhcTags

cabal

Install the ghc-tags-plugin to cabal store with:

cabal install --lib ghc-tags-plugin

In cabal.project.local file add package stanza for every local package :

project some-project
    ghc-options: -package-db=PACKAGE_DB
                 -plugin-package=ghc-tags-plugin
                 -fplugin=Plugin.GhcTags

PACKAGE_DB is likely to be something like (for ghc-8.6.5) '${HOME}/.cabal/store/ghc-8.6.5/package.db' (all environment variables must be expanded).

stack

Install ghc-tags-plugin

stack install ghc-tags-plugin

In stack.yaml file add:

ghc-options:
    some-project: -package-db=PACKAGE_DB
                  -plugin-package=ghc-tags-plugin
                  -fplugin=Plugin.GhcTags

where PACKAGE_DB is the package db where ghc-tags-plugin was installed by stack.

modifying cabal files

You can always add ghc-tags-plugin as a build dependency in a cabal file (for each component). You should hide it behind a flag and then use cabal or stack to enable it (or cabal.project.local or stack.yaml files for that purpose).

Security implications of compiler plugins

Such plugins can:

  • run arbitrary IO;
  • modify abstract syntax tree in some way; a malicious plugin could change some security parameter in your code exposing a security hole.

This plugin only reads & writes to tags file (and updates a shared mutable state) as of IO, and does not modify/ the syntax tree.