]> git.wincent.com - docvim.git/commitdiff
Add basic symbol "table" implementation
authorGreg Hurrell <greg@hurrell.net>
Thu, 31 Mar 2016 05:54:38 +0000 (22:54 -0700)
committerGreg Hurrell <greg@hurrell.net>
Thu, 31 Mar 2016 05:54:38 +0000 (22:54 -0700)
docvim.cabal
lib/Docvim/Visitor/Symbol.hs [new file with mode: 0644]
tests/tasty.hs

index c1a7dd9825ed04658f7d597cadd517e3cb170063..27d90435799ef44e944ebb459ce87b7e30e56097 100644 (file)
@@ -86,6 +86,7 @@ library
                  ,  Docvim.Printer.Markdown
                  ,  Docvim.Printer.Vim
                  ,  Docvim.ReadDir
+                 ,  Docvim.Visitor.Symbol
                  ,  Paths_docvim
   hs-source-dirs:   lib
 
diff --git a/lib/Docvim/Visitor/Symbol.hs b/lib/Docvim/Visitor/Symbol.hs
new file mode 100644 (file)
index 0000000..811d974
--- /dev/null
@@ -0,0 +1,11 @@
+module Docvim.Visitor.Symbol (getSymbols) where
+
+import Docvim.AST
+
+getSymbols :: Node -> [String]
+getSymbols node = symbols
+  where
+    -- TODO: error on duplicates; use a real set
+    symbols = concat $ walk gatherSymbol [] node
+    gatherSymbol nodes (LinkTargets ts) = mappend nodes [ts]
+    gatherSymbol nodes _ = nodes
index daa2fbe361a7ccf107a9f3823183f174773dd401..6293890e14fd2b22b2f4ada0b503d6183b6df2eb 100644 (file)
@@ -12,6 +12,7 @@ import Docvim.AST
 import Docvim.Parse (p, parseUnit)
 import Docvim.Printer.Markdown (pm)
 import Docvim.Printer.Vim (pv)
+import Docvim.Visitor.Symbol (getSymbols)
 import System.Exit (ExitCode(ExitSuccess))
 import System.FilePath ((<.>), replaceExtension, takeBaseName, takeFileName)
 import System.IO (hFlush, readFile)
@@ -35,18 +36,6 @@ parseSuccess _        = True
 parseFailure :: Either a b -> Bool
 parseFailure = not . parseSuccess
 
-tree = Unit
-  [ FunctionDeclaration True
-                      "name"
-                      (ArgumentList [])
-                      []
-                      [UnletStatement True "foo"]
-  , DocBlock [ HeadingAnnotation "foo"
-            , SubheadingAnnotation "bar"
-            , SubheadingAnnotation "baz"
-            ]
-  ]
-
 unitTests :: TestTree
 unitTests = testGroup "Unit tests"
   [ testCase "Parse empty unit" $ assert $ parseSuccess (parseUnit "")
@@ -55,17 +44,41 @@ unitTests = testGroup "Unit tests"
 
   , testCase "Counting all nodes" $
     7 @=? let
+        tree = Unit
+          [ FunctionDeclaration True
+                              "name"
+                              (ArgumentList [])
+                              []
+                              [UnletStatement True "foo"]
+          , DocBlock [ HeadingAnnotation "foo"
+                    , SubheadingAnnotation "bar"
+                    , SubheadingAnnotation "baz"
+                    ]
+          ]
         counter i _ = mappend i 1
         nodeCount = getSum $ walk counter (Sum 0) tree
       in nodeCount
 
   , testCase "Gathering specific nodes" $
     [SubheadingAnnotation "bar", SubheadingAnnotation "baz"] @=? let
+        tree = DocBlock [ HeadingAnnotation "foo"
+                        , SubheadingAnnotation "bar"
+                        , SubheadingAnnotation "baz"
+                        ]
         accumulateSubheadings nodes node@(SubheadingAnnotation _) = mappend nodes [node]
         accumulateSubheadings nodes _ = nodes -- skip everything else
         selection = walk accumulateSubheadings [] tree
       in selection
 
+  , testCase "Extracting symbols" $
+    ["foo", "bar", "baz"] @=? let
+        tree = DocBlock [ HeadingAnnotation "section"
+                        , LinkTargets ["foo"]
+                        , LinkTargets ["bar", "baz"]
+                        ]
+        symbols = getSymbols tree
+      in symbols
+
 
   -- Some example syntax:
   -- , testCase "Equality" $ True @=? True