Skip to content

Commit a6b410b

Browse files
committed
Add rudimentary nested closure param/return/throws support for Doxygen
There isn't a great nested argument feature that we can use in our Doxygen emitter but we can approximate it by nesting unordered lists with labels. rdar://problem/24794725
1 parent c20f3db commit a6b410b

File tree

1 file changed

+68
-3
lines changed

1 file changed

+68
-3
lines changed

lib/IDE/CommentConversion.cpp

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -632,13 +632,78 @@ break;
632632
llvm_unreachable("Can't directly print Doxygen for a Swift Markup PrivateExtension");
633633
}
634634

635+
void printNestedParamField(const ParamField *PF) {
636+
auto Parts = PF->getParts().getValue();
637+
if (Parts.Brief.hasValue()) {
638+
printASTNode(Parts.Brief.getValue());
639+
printNewline();
640+
}
641+
642+
if (!Parts.ParamFields.empty()) {
643+
printNewline();
644+
print("\\a ");
645+
print(PF->getName());
646+
print(" parameters:");
647+
printNewline();
648+
649+
print("<ul>");
650+
printNewline();
651+
for (auto Param : Parts.ParamFields) {
652+
print("<li>");
653+
printNewline();
654+
print(Param->getName());
655+
print(": ");
656+
printNestedParamField(Param);
657+
print("</li>");
658+
printNewline();
659+
}
660+
print("</ul>");
661+
printNewline();
662+
printNewline();
663+
}
664+
665+
if (Parts.ReturnsField.hasValue()) {
666+
printNewline();
667+
print("\\a ");
668+
print(PF->getName());
669+
print(" returns: ");
670+
671+
for (auto Child : Parts.ReturnsField.getValue()->getChildren()) {
672+
printASTNode(Child);
673+
printNewline();
674+
}
675+
}
676+
677+
if (Parts.ThrowsField.hasValue()) {
678+
printNewline();
679+
print("\\a ");
680+
print(PF->getName());
681+
print(" error: ");
682+
683+
for (auto Child : Parts.ThrowsField.getValue()->getChildren()) {
684+
printASTNode(Child);
685+
printNewline();
686+
}
687+
}
688+
689+
for (auto BodyNode : Parts.BodyNodes) {
690+
printASTNode(BodyNode);
691+
printNewline();
692+
}
693+
printNewline();
694+
}
695+
635696
void printParamField(const ParamField *PF) {
636697
print("\\param ");
637698
print(PF->getName());
638699
print(" ");
639-
for (auto Child : PF->getChildren())
640-
printASTNode(Child);
641-
700+
if (PF->isClosureParameter()) {
701+
printNestedParamField(PF);
702+
} else {
703+
for (auto Child : PF->getChildren()) {
704+
printASTNode(Child);
705+
}
706+
}
642707
printNewline();
643708
}
644709

0 commit comments

Comments
 (0)