]> git.wincent.com - docvim.git/blob - lib/Docvim/Visitor/Plugin.hs
Initial cut at @mapping, @command, @option, @function
[docvim.git] / lib / Docvim / Visitor / Plugin.hs
1 {-# LANGUAGE LambdaCase #-}
2
3 module Docvim.Visitor.Plugin ( getPluginName
4                              , extractPlugin
5                              ) where
6
7 import Control.Applicative (Alternative)
8 import Docvim.AST (Node(PluginAnnotation), walk)
9 import Docvim.Visitor (endSection, extractBlocks)
10
11 -- | Returns the name of the plug-in or Nothing if none is found.
12 --
13 -- In the event that there are multiple `@plugin` annotations competing to
14 -- define the name of plugin, the first encountered one wins.
15 getPluginName :: Node -> Maybe String
16 getPluginName node = name
17   where
18     name = if null names
19            then Nothing
20            else Just $ head names
21     names = walk getName [] node
22     getName (PluginAnnotation name _) = [name]
23     getName _                         = []
24
25 -- | Extracts a list of nodes (if any exist) from the `@plugin` section(s) of
26 -- the source code.
27 --
28 -- It is not recommended to have multiple `@plugin` sections in a project. If
29 -- multiple such sections (potentially across multiple translation units) exist,
30 -- there are no guarantees about order; they just get concatenated in the order
31 -- we see them.
32 extractPlugin :: Alternative f => [Node] -> (f [Node], [Node])
33 extractPlugin = extractBlocks f
34   where
35     f = \case
36       PluginAnnotation {} -> Just endSection
37       _                   -> Nothing