Skip to content

Commit 05e9473

Browse files
authored
Add signatures object to jsondoc for routine types (#13530)
jsondoc is meant to be read by computers, but yet the signatures of procedures where simply a string of the whole thing. This adds a signature object that unpacks this information into an object so it's easier to analyse the documented signatures.
1 parent 653de5f commit 05e9473

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

compiler/docgen.nim

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,35 @@ proc genJsonItem(d: PDoc, n, nameNode: PNode, k: TSymKind): JsonNode =
794794
result["description"] = %comm
795795
if r.buf.len > 0:
796796
result["code"] = %r.buf
797+
if k in routineKinds:
798+
result["signature"] = newJObject()
799+
if n[paramsPos][0].kind != nkEmpty:
800+
result["signature"]["return"] = %($n[paramsPos][0])
801+
if n[paramsPos].len > 1:
802+
result["signature"]["arguments"] = newJArray()
803+
for paramIdx in 1 ..< n[paramsPos].len:
804+
for identIdx in 0 ..< n[paramsPos][paramIdx].len - 2:
805+
let
806+
paramName = $n[paramsPos][paramIdx][identIdx]
807+
paramType = $n[paramsPos][paramIdx][^2]
808+
if n[paramsPos][paramIdx][^1].kind != nkEmpty:
809+
let paramDefault = $n[paramsPos][paramIdx][^1]
810+
result["signature"]["arguments"].add %{"name": %paramName, "type": %paramType, "default": %paramDefault}
811+
else:
812+
result["signature"]["arguments"].add %{"name": %paramName, "type": %paramType}
813+
if n[pragmasPos].kind != nkEmpty:
814+
result["signature"]["pragmas"] = newJArray()
815+
for pragma in n[pragmasPos]:
816+
result["signature"]["pragmas"].add %($pragma)
817+
if n[genericParamsPos].kind != nkEmpty:
818+
result["signature"]["genericParams"] = newJArray()
819+
for genericParam in n[genericParamsPos]:
820+
var param = %{"name": %($genericParam)}
821+
if genericParam.sym.typ.sons.len > 0:
822+
param["types"] = newJArray()
823+
for kind in genericParam.sym.typ.sons:
824+
param["types"].add %($kind)
825+
result["signature"]["genericParams"].add param
797826

798827
proc checkForFalse(n: PNode): bool =
799828
result = n.kind == nkIdent and cmpIgnoreStyle(n.ident.s, "false") == 0

0 commit comments

Comments
 (0)