diff options
author | Dmitry Atamanov <data-man@users.noreply.github.com> | 2017-11-16 00:07:22 +0300 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-11-15 22:07:22 +0100 |
commit | 870567d0839f2bc35775fb81a840f4e4ebe97a38 (patch) | |
tree | bc834b15b2a2c6a671075790370ed809a87ae88b | |
parent | e7c09512d23d34f97d3c853d232572b90a45fd7d (diff) | |
download | Nim-870567d0839f2bc35775fb81a840f4e4ebe97a38.tar.gz |
WIP: Add a advanced compiler command 'ctags' (#6654)
-rw-r--r-- | compiler/docgen.nim | 61 | ||||
-rw-r--r-- | compiler/main.nim | 7 | ||||
-rw-r--r-- | compiler/options.nim | 1 | ||||
-rw-r--r-- | doc/advopt.txt | 3 |
4 files changed, 71 insertions, 1 deletions
diff --git a/compiler/docgen.nim b/compiler/docgen.nim index b31e9ce75..8978052e2 100644 --- a/compiler/docgen.nim +++ b/compiler/docgen.nim @@ -608,6 +608,52 @@ proc generateJson*(d: PDoc, n: PNode) = generateJson(d, lastSon(n.sons[0])) else: discard +proc genTagsItem(d: PDoc, n, nameNode: PNode, k: TSymKind): string = + var + name = getName(d, nameNode) + + result = name & "\n" + +proc generateTags*(d: PDoc, n: PNode, r: var Rope) = + case n.kind + of nkCommentStmt: + if n.comment != nil and startsWith(n.comment, "##"): + let stripped = n.comment.substr(2).strip + r.add stripped + of nkProcDef: + when useEffectSystem: documentRaises(n) + r.add genTagsItem(d, n, n.sons[namePos], skProc) + of nkFuncDef: + when useEffectSystem: documentRaises(n) + r.add genTagsItem(d, n, n.sons[namePos], skFunc) + of nkMethodDef: + when useEffectSystem: documentRaises(n) + r.add genTagsItem(d, n, n.sons[namePos], skMethod) + of nkIteratorDef: + when useEffectSystem: documentRaises(n) + r.add genTagsItem(d, n, n.sons[namePos], skIterator) + of nkMacroDef: + r.add genTagsItem(d, n, n.sons[namePos], skMacro) + of nkTemplateDef: + r.add genTagsItem(d, n, n.sons[namePos], skTemplate) + of nkConverterDef: + when useEffectSystem: documentRaises(n) + r.add genTagsItem(d, n, n.sons[namePos], skConverter) + of nkTypeSection, nkVarSection, nkLetSection, nkConstSection: + for i in countup(0, sonsLen(n) - 1): + if n.sons[i].kind != nkCommentStmt: + # order is always 'type var let const': + r.add genTagsItem(d, n.sons[i], n.sons[i].sons[0], + succ(skType, ord(n.kind)-ord(nkTypeSection))) + of nkStmtList: + for i in countup(0, sonsLen(n) - 1): + generateTags(d, n.sons[i], r) + of nkWhenStmt: + # generate documentation for the first branch only: + if not checkForFalse(n.sons[0].sons[0]): + generateTags(d, lastSon(n.sons[0]), r) + else: discard + proc genSection(d: PDoc, kind: TSymKind) = const sectionNames: array[skModule..skTemplate, string] = [ "Imports", "Types", "Vars", "Lets", "Consts", "Vars", "Procs", "Funcs", @@ -745,6 +791,21 @@ proc commandJson*() = #echo getOutFile(gProjectFull, JsonExt) writeRope(content, getOutFile(gProjectFull, JsonExt), useWarning = false) +proc commandTags*() = + var ast = parseFile(gProjectMainIdx, newIdentCache()) + if ast == nil: return + var d = newDocumentor(gProjectFull, options.gConfigVars) + d.hasToc = true + var + content: Rope + generateTags(d, ast, content) + + if optStdout in gGlobalOptions: + writeRope(stdout, content) + else: + #echo getOutFile(gProjectFull, TagsExt) + writeRope(content, getOutFile(gProjectFull, TagsExt), useWarning = false) + proc commandBuildIndex*() = var content = mergeIndexes(gProjectFull).rope diff --git a/compiler/main.nim b/compiler/main.nim index 450542c4c..0edbae16f 100644 --- a/compiler/main.nim +++ b/compiler/main.nim @@ -217,6 +217,13 @@ proc mainCommand*(graph: ModuleGraph; cache: IdentCache) = wantMainModule() defineSymbol("nimdoc") commandDoc2(graph, cache, true) + of "ctags": + wantMainModule() + gCmd = cmdDoc + loadConfigs(DocConfig, cache) + wantMainModule() + defineSymbol("nimdoc") + commandTags() of "buildindex": gCmd = cmdDoc loadConfigs(DocConfig, cache) diff --git a/compiler/options.nim b/compiler/options.nim index 312e4539a..eec9ce448 100644 --- a/compiler/options.nim +++ b/compiler/options.nim @@ -162,6 +162,7 @@ const RodExt* = "rod" HtmlExt* = "html" JsonExt* = "json" + TagsExt* = "tags" TexExt* = "tex" IniExt* = "ini" DefaultConfig* = "nim.cfg" diff --git a/doc/advopt.txt b/doc/advopt.txt index fb6fd719b..60fd081b8 100644 --- a/doc/advopt.txt +++ b/doc/advopt.txt @@ -7,7 +7,8 @@ Advanced commands: //rst2html convert a reStructuredText file to HTML //rst2tex convert a reStructuredText file to TeX //jsondoc extract the documentation to a json file - //jsondoc2 extract documentation to a json file (uses doc2) + //jsondoc2 extract the documentation to a json file (uses doc2) + //ctags create a tags file //buildIndex build an index for the whole documentation //run run the project (with Tiny C backend; buggy!) //genDepend generate a DOT file containing the |