@@ -1274,10 +1274,10 @@ std::optional<HoverInfo> getHover(ParsedAST &AST, Position Pos,
12741274 HoverCountMetric.record (1 , " include" );
12751275 HoverInfo HI;
12761276 HI.Name = std::string (llvm::sys::path::filename (Inc.Resolved ));
1277- // FIXME: We don't have a fitting value for Kind.
12781277 HI.Definition =
12791278 URIForFile::canonicalize (Inc.Resolved , AST.tuPath ()).file ().str ();
12801279 HI.DefinitionLanguage = " " ;
1280+ HI.Kind = index::SymbolKind::IncludeDirective;
12811281 maybeAddUsedSymbols (AST, HI, Inc);
12821282 return HI;
12831283 }
@@ -1483,10 +1483,6 @@ void HoverInfo::sizeToMarkupParagraph(markup::Paragraph &P) const {
14831483}
14841484
14851485markup::Document HoverInfo::presentDoxygen () const {
1486- // NOTE: this function is currently almost identical to presentDefault().
1487- // This is to have a minimal change when introducing the doxygen parser.
1488- // This function will be changed when rearranging the output for doxygen
1489- // parsed documentation.
14901486
14911487 markup::Document Output;
14921488 // Header contains a text of the form:
@@ -1502,45 +1498,108 @@ markup::Document HoverInfo::presentDoxygen() const {
15021498 // level 1 and 2 headers in a huge font, see
15031499 // https://github.com/microsoft/vscode/issues/88417 for details.
15041500 markup::Paragraph &Header = Output.addHeading (3 );
1505- if (Kind != index::SymbolKind::Unknown)
1501+ if (Kind != index::SymbolKind::Unknown &&
1502+ Kind != index::SymbolKind::IncludeDirective)
15061503 Header.appendText (index::getSymbolKindString (Kind)).appendSpace ();
15071504 assert (!Name.empty () && " hover triggered on a nameless symbol" );
15081505
1509- Header.appendCode (Name);
1506+ if (Kind == index::SymbolKind::IncludeDirective) {
1507+ Header.appendCode (Name);
1508+
1509+ if (!Definition.empty ())
1510+ Output.addParagraph ().appendCode (Definition);
1511+
1512+ if (!UsedSymbolNames.empty ()) {
1513+ Output.addRuler ();
1514+ usedSymbolNamesToMarkup (Output);
1515+ }
1516+
1517+ return Output;
1518+ }
1519+
1520+ if (!Definition.empty ()) {
1521+ Output.addRuler ();
1522+ definitionScopeToMarkup (Output);
1523+ } else {
1524+ Header.appendCode (Name);
1525+ }
15101526
15111527 if (!Provider.empty ()) {
15121528 providerToMarkupParagraph (Output);
15131529 }
15141530
15151531 // Put a linebreak after header to increase readability.
15161532 Output.addRuler ();
1517- // Print Types on their own lines to reduce chances of getting line-wrapped by
1518- // editor, as they might be long.
1519- if (ReturnType) {
1520- // For functions we display signature in a list form, e.g.:
1521- // → `x`
1522- // Parameters:
1523- // - `bool param1`
1524- // - `int param2 = 5`
1525- Output.addParagraph ().appendText (" → " ).appendCode (
1526- llvm::to_string (*ReturnType));
1527- }
15281533
15291534 SymbolDocCommentVisitor SymbolDoc (Documentation, CommentOpts);
15301535
1536+ if (SymbolDoc.hasBriefCommand ()) {
1537+ SymbolDoc.briefToMarkup (Output.addParagraph ());
1538+ Output.addRuler ();
1539+ }
1540+
1541+ // For functions we display signature in a list form, e.g.:
1542+ // Template Parameters:
1543+ // - `typename T` - description
1544+ // Parameters:
1545+ // - `bool param1` - description
1546+ // - `int param2 = 5` - description
1547+ // Returns
1548+ // `type` - description
1549+ if (TemplateParameters && !TemplateParameters->empty ()) {
1550+ Output.addParagraph ().appendBoldText (" Template Parameters:" );
1551+ markup::BulletList &L = Output.addBulletList ();
1552+ for (const auto &Param : *TemplateParameters) {
1553+ markup::Paragraph &P = L.addItem ().addParagraph ();
1554+ P.appendCode (llvm::to_string (Param));
1555+ if (SymbolDoc.isTemplateTypeParmDocumented (llvm::to_string (Param.Name ))) {
1556+ P.appendText (" - " );
1557+ SymbolDoc.templateTypeParmDocToMarkup (llvm::to_string (Param.Name ), P);
1558+ }
1559+ }
1560+ Output.addRuler ();
1561+ }
1562+
15311563 if (Parameters && !Parameters->empty ()) {
1532- Output.addParagraph ().appendText (" Parameters:" );
1564+ Output.addParagraph ().appendBoldText (" Parameters:" );
15331565 markup::BulletList &L = Output.addBulletList ();
15341566 for (const auto &Param : *Parameters) {
15351567 markup::Paragraph &P = L.addItem ().addParagraph ();
15361568 P.appendCode (llvm::to_string (Param));
15371569
15381570 if (SymbolDoc.isParameterDocumented (llvm::to_string (Param.Name ))) {
1539- P.appendText (" -" );
1571+ P.appendText (" - " );
15401572 SymbolDoc.parameterDocToMarkup (llvm::to_string (Param.Name ), P);
15411573 }
15421574 }
1575+ Output.addRuler ();
1576+ }
1577+
1578+ // Print Types on their own lines to reduce chances of getting line-wrapped by
1579+ // editor, as they might be long.
1580+ if (ReturnType &&
1581+ ((ReturnType->Type != " void" && !ReturnType->AKA .has_value ()) ||
1582+ (ReturnType->AKA .has_value () && ReturnType->AKA != " void" ))) {
1583+ Output.addParagraph ().appendBoldText (" Returns:" );
1584+ markup::Paragraph &P = Output.addParagraph ();
1585+ P.appendCode (llvm::to_string (*ReturnType));
1586+
1587+ if (SymbolDoc.hasReturnCommand ()) {
1588+ P.appendText (" - " );
1589+ SymbolDoc.returnToMarkup (P);
1590+ }
1591+ Output.addRuler ();
15431592 }
1593+
1594+ // add specially handled doxygen commands.
1595+ SymbolDoc.warningsToMarkup (Output);
1596+ SymbolDoc.notesToMarkup (Output);
1597+
1598+ // add any other documentation.
1599+ SymbolDoc.docToMarkup (Output);
1600+
1601+ Output.addRuler ();
1602+
15441603 // Don't print Type after Parameters or ReturnType as this will just duplicate
15451604 // the information
15461605 if (Type && !ReturnType && !Parameters)
@@ -1561,13 +1620,6 @@ markup::Document HoverInfo::presentDoxygen() const {
15611620 calleeArgInfoToMarkupParagraph (Output.addParagraph ());
15621621 }
15631622
1564- SymbolDoc.docToMarkup (Output);
1565-
1566- if (!Definition.empty ()) {
1567- Output.addRuler ();
1568- definitionScopeToMarkup (Output);
1569- }
1570-
15711623 if (!UsedSymbolNames.empty ()) {
15721624 Output.addRuler ();
15731625 usedSymbolNamesToMarkup (Output);
@@ -1591,7 +1643,8 @@ markup::Document HoverInfo::presentDefault() const {
15911643 // level 1 and 2 headers in a huge font, see
15921644 // https://github.com/microsoft/vscode/issues/88417 for details.
15931645 markup::Paragraph &Header = Output.addHeading (3 );
1594- if (Kind != index::SymbolKind::Unknown)
1646+ if (Kind != index::SymbolKind::Unknown &&
1647+ Kind != index::SymbolKind::IncludeDirective)
15951648 Header.appendText (index::getSymbolKindString (Kind)).appendSpace ();
15961649 assert (!Name.empty () && " hover triggered on a nameless symbol" );
15971650 Header.appendCode (Name);
@@ -1615,7 +1668,7 @@ markup::Document HoverInfo::presentDefault() const {
16151668 }
16161669
16171670 if (Parameters && !Parameters->empty ()) {
1618- Output.addParagraph ().appendText (" Parameters: " );
1671+ Output.addParagraph ().appendText (" Parameters:" );
16191672 markup::BulletList &L = Output.addBulletList ();
16201673 for (const auto &Param : *Parameters)
16211674 L.addItem ().addParagraph ().appendCode (llvm::to_string (Param));
0 commit comments