]> git.wincent.com - docvim.git/commitdiff
Auto-inject @commands annotation when necessary
authorGreg Hurrell <greg@hurrell.net>
Wed, 8 Jun 2016 06:11:33 +0000 (23:11 -0700)
committerGreg Hurrell <greg@hurrell.net>
Wed, 8 Jun 2016 06:11:33 +0000 (23:11 -0700)
lib/Docvim/Compile.hs
lib/Docvim/Visitor/Section.hs
tests/fixtures/markdown/integration-ferret-plugin.golden
tests/fixtures/parser/command.golden
tests/fixtures/parser/integration-ferret-plugin.golden
tests/fixtures/vim/integration-ferret-plugin.golden

index a4ebd2fce3862b78c288f42a32a6d5330bba36c0..c9e6b6d54296743a59aa11509962bd8dc1bbef7a 100644 (file)
@@ -11,23 +11,25 @@ import Docvim.Visitor.Mappings (extractMappings)
 import Docvim.Visitor.Option (extractOption)
 import Docvim.Visitor.Options (extractOptions)
 import Docvim.Visitor.Plugin (extractPlugin)
+import Docvim.Visitor.Section
 import Docvim.Visitor (extract)
 
 -- | "Compile" a set of translation units into a project.
 compile :: [Node] -> Node
 compile ns = do
   let (ast, footer) = extract extractFooter $ Project ns
-  let (ast2, plugin) = extract extractPlugin ast
-  let (ast3, commands) = extract extractCommands ast2
-  let (ast4, command) = extract extractCommand ast3
-  let (ast5, functions) = extract extractFunctions ast4
-  let (ast6, function) = extract extractFunction ast5
-  let (ast7, mappings) = extract extractMappings ast6
-  let (ast8, mapping) = extract extractMapping ast7
-  let (ast9, options) = extract extractOptions ast8
-  let (ast10, option) = extract extractOption ast9
+  let ast2 = injectCommands ast
+  let (ast3, plugin) = extract extractPlugin ast2
+  let (ast4, commands) = extract extractCommands ast3
+  let (ast5, command) = extract extractCommand ast4
+  let (ast6, functions) = extract extractFunctions ast5
+  let (ast7, function) = extract extractFunction ast6
+  let (ast8, mappings) = extract extractMappings ast7
+  let (ast9, mapping) = extract extractMapping ast8
+  let (ast10, options) = extract extractOptions ast9
+  let (ast11, option) = extract extractOption ast10
   let project = Project $ concat [ plugin
-                                 , [ast10]
+                                 , [ast11]
                                  , commands
                                  , command
                                  , mappings
index d06e4d35af45ffd5388b1d628c3d357416f1a4e2..7133647efdb8d665029f2056f2c1cb05ffc6ae61 100644 (file)
@@ -1,7 +1,12 @@
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE MultiWayIf #-}
 {-# LANGUAGE TemplateHaskell #-}
 
-module Docvim.Visitor.Section (getSectionInfo) where
+module Docvim.Visitor.Section ( injectCommands
+                              , injectFunctions
+                              , injectMappings
+                              , injectOptions
+                              ) where
 
 import Control.Lens
 import Control.Monad.State
@@ -69,3 +74,43 @@ getSectionInfo n = execState (mapMOf_ (cosmosOf uniplate) check n) defaultSectio
     check OptionAnnotation {}    = hasOption .= True
     check OptionsAnnotation      = hasOptions .= True
     check _                      = modify id
+
+injectCommands :: Node -> Node
+injectCommands n =
+  if | info ^. hasCommands -> n
+     | info ^. hasCommand -> inject n
+     | otherwise -> n
+  where
+    info = getSectionInfo n
+    inject (Project ns) = Project $ ns ++ [CommandsAnnotation]
+    inject _ = n
+
+injectFunctions :: Node -> Node
+injectFunctions n =
+  if | info ^. hasFunctions -> n
+     | info ^. hasFunction -> inject n
+     | otherwise -> n
+  where
+    info = getSectionInfo n
+    inject (Project ns) = Project $ ns ++ [FunctionsAnnotation]
+    inject _ = n
+
+injectMappings :: Node -> Node
+injectMappings n =
+  if | info ^. hasMappings -> n
+     | info ^. hasMapping -> inject n
+     | otherwise -> n
+  where
+    info = getSectionInfo n
+    inject (Project ns) = Project $ ns ++ [MappingsAnnotation]
+    inject _ = n
+
+injectOptions :: Node -> Node
+injectOptions n =
+  if | info ^. hasOptions -> n
+     | info ^. hasOption -> inject n
+     | otherwise -> n
+  where
+    info = getSectionInfo n
+    inject (Project ns) = Project $ ns ++ [OptionsAnnotation]
+    inject _ = n
index 29162ce3e4fa1ae4b93c63eefbe2e30d10e595cf..29c5485f10067d07075b8468b16e1e4995e3c79f 100644 (file)
@@ -54,6 +54,8 @@ To generate help tags under Pathogen, you can do so from inside Vim with:
 :call pathogen#helptags()
 ```
 
+## Commands
+
 <p align="right"><a name="ack" href="#user-content-ack"><code>:Ack</code></a></p>
 ### `:Ack {pattern} {options}`
 
index df078920a12247525349331250fb11ae2fcca043..823bacd9581d86e037ba6a58d8341d7aca8fd88d 100644 (file)
@@ -1,5 +1,5 @@
 Project
-  [ Project [ Unit [ DocBlock [] ] ]
+  [ Project [ Unit [ DocBlock [] ] , CommandsAnnotation ]
   , CommandAnnotation "Ack" (Just "{pattern} {options}")
   , Paragraph [ Plaintext "Info." ]
   , CommandAnnotation "Qargs" Nothing
index 14743836e9c01061985a91bf58f6b67d85dfd4b1..b947b04d02be715cda2f234de18e06587a636370 100644 (file)
@@ -910,6 +910,7 @@ Project
               { letLexpr = "&cpoptions " , letValue = "s:cpoptions" }
           , UnletStatement { unletBang = False , unletBody = "s:cpoptions" }
           ]
+      , CommandsAnnotation
       ]
   , CommandAnnotation "Ack" (Just "{pattern} {options}")
   , Paragraph
index 1f22717a3d97afda64f907b912dc2cc5b799dd71..5eda345c51367389395cbdf79ba0780533e2e46c 100644 (file)
@@ -75,6 +75,8 @@ To generate help tags under Pathogen, you can do so from inside Vim with:
 >
     :call pathogen#helptags()
 <
+COMMANDS                                                       *ferret-commands*
+
 :Ack {pattern} {options}                                                  *:Ack*
 
 Searches for {pattern} in all the files under the current directory (see