@hackage ghc-tags-plugin0.1.0.2

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

Ghc Tags Compiler Plugin

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

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 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 something 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 can 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.