sammccall updated this revision to Diff 365499. sammccall added a comment. add unit test for getDocumentation
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D107703/new/ https://reviews.llvm.org/D107703 Files: clang-tools-extra/clangd/Hover.cpp clang-tools-extra/clangd/unittests/HoverTests.cpp clang/include/clang/AST/Attr.h clang/lib/AST/CMakeLists.txt clang/unittests/AST/CMakeLists.txt clang/utils/TableGen/ClangAttrEmitter.cpp clang/utils/TableGen/TableGen.cpp clang/utils/TableGen/TableGenBackends.h
Index: clang/utils/TableGen/TableGenBackends.h =================================================================== --- clang/utils/TableGen/TableGenBackends.h +++ clang/utils/TableGen/TableGenBackends.h @@ -61,6 +61,7 @@ llvm::raw_ostream &OS); void EmitClangAttrNodeTraverse(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); +void EmitClangAttrDocTable(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); void EmitClangDiagsDefs(llvm::RecordKeeper &Records, llvm::raw_ostream &OS, const std::string &Component); Index: clang/utils/TableGen/TableGen.cpp =================================================================== --- clang/utils/TableGen/TableGen.cpp +++ clang/utils/TableGen/TableGen.cpp @@ -30,6 +30,7 @@ GenClangAttrSubjectMatchRulesParserStringSwitches, GenClangAttrImpl, GenClangAttrList, + GenClangAttrDocTable, GenClangAttrSubjectMatchRuleList, GenClangAttrPCHRead, GenClangAttrPCHWrite, @@ -115,6 +116,8 @@ "Generate clang attribute implementations"), clEnumValN(GenClangAttrList, "gen-clang-attr-list", "Generate a clang attribute list"), + clEnumValN(GenClangAttrDocTable, "gen-clang-attr-doc-table", + "Generate a table of attribute documentation"), clEnumValN(GenClangAttrSubjectMatchRuleList, "gen-clang-attr-subject-match-rule-list", "Generate a clang attribute subject match rule list"), @@ -280,6 +283,9 @@ case GenClangAttrList: EmitClangAttrList(Records, OS); break; + case GenClangAttrDocTable: + EmitClangAttrDocTable(Records, OS); + break; case GenClangAttrSubjectMatchRuleList: EmitClangAttrSubjectMatchRuleList(Records, OS); break; Index: clang/utils/TableGen/ClangAttrEmitter.cpp =================================================================== --- clang/utils/TableGen/ClangAttrEmitter.cpp +++ clang/utils/TableGen/ClangAttrEmitter.cpp @@ -4210,6 +4210,42 @@ getPragmaAttributeSupport(Records).generateParsingHelpers(OS); } +void EmitClangAttrDocTable(RecordKeeper &Records, raw_ostream &OS) { + emitSourceFileHeader("Clang attribute documentation", OS); + + OS << R"cpp( + #include "clang/AST/Attr.h" + #include "llvm/ADT/StringRef.h" + )cpp"; + std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr"); + for (const auto *A : Attrs) { + if (!A->getValueAsBit("ASTNode")) + continue; + std::vector<Record *> Docs = A->getValueAsListOfDefs("Documentation"); + for (const auto *D : Docs) { + OS << "\nstatic const char AttrDoc_" << A->getName() << "[] = " + << "R\"reST(" + << D->getValueAsOptionalString("Content").getValueOr("").trim() + << ")reST\";\n"; + // Only look at the first documentation if there are several. + // (As of now, only one attribute has multiple documentation entries). + break; + } + } + OS << R"cpp( + static const llvm::StringRef AttrDoc[] = { + #define ATTR(NAME) AttrDoc_##NAME, + #include "clang/Basic/AttrList.inc" + }; + + llvm::StringRef clang::Attr::getDocumentation(clang::attr::Kind K) { + if(K < llvm::array_lengthof(AttrDoc)) + return AttrDoc[K]; + return ""; + } + )cpp"; +} + enum class SpellingKind { GNU, CXX11, Index: clang/unittests/AST/CMakeLists.txt =================================================================== --- clang/unittests/AST/CMakeLists.txt +++ clang/unittests/AST/CMakeLists.txt @@ -15,6 +15,7 @@ ASTTraverserTest.cpp ASTTypeTraitsTest.cpp ASTVectorTest.cpp + AttrTest.cpp CommentLexer.cpp CommentParser.cpp CommentTextTest.cpp Index: clang/lib/AST/CMakeLists.txt =================================================================== --- clang/lib/AST/CMakeLists.txt +++ clang/lib/AST/CMakeLists.txt @@ -13,6 +13,11 @@ SOURCE Interp/Opcodes.td TARGET Opcodes) +clang_tablegen(AttrDocTable.cpp -gen-clang-attr-doc-table + -I ${CMAKE_CURRENT_SOURCE_DIR}/../../include/ + SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/../../include/clang/Basic/Attr.td + TARGET ClangAttrDocTable) + add_clang_library(clangAST APValue.cpp ASTConcept.cpp @@ -24,6 +29,7 @@ ASTImporterLookupTable.cpp ASTStructuralEquivalence.cpp ASTTypeTraits.cpp + AttrDocTable.cpp AttrImpl.cpp Comment.cpp CommentBriefParser.cpp Index: clang/include/clang/AST/Attr.h =================================================================== --- clang/include/clang/AST/Attr.h +++ clang/include/clang/AST/Attr.h @@ -109,6 +109,8 @@ // Pretty print this attribute. void printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const; + + static StringRef getDocumentation(attr::Kind); }; class TypeAttr : public Attr { Index: clang-tools-extra/clangd/unittests/HoverTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/HoverTests.cpp +++ clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -12,6 +12,7 @@ #include "TestIndex.h" #include "TestTU.h" #include "index/MemIndex.h" +#include "clang/AST/Attr.h" #include "clang/Basic/Specifiers.h" #include "clang/Index/IndexSymbol.h" #include "llvm/ADT/None.h" @@ -2384,7 +2385,8 @@ HI.Name = "nonnull"; HI.Kind = index::SymbolKind::Unknown; // FIXME: no suitable value HI.Definition = "__attribute__((nonnull))"; - HI.Documentation = ""; // FIXME + HI.Documentation = Attr::getDocumentation(attr::NonNull).str(); + ASSERT_THAT(HI.Documentation, testing::HasSubstr("parameters")); }}, }; Index: clang-tools-extra/clangd/Hover.cpp =================================================================== --- clang-tools-extra/clangd/Hover.cpp +++ clang-tools-extra/clangd/Hover.cpp @@ -731,7 +731,7 @@ llvm::raw_string_ostream OS(HI.Definition); A->printPretty(OS, AST.getASTContext().getPrintingPolicy()); } - // FIXME: attributes have documentation, can we get at that? + HI.Documentation = Attr::getDocumentation(A->getKind()).str(); return HI; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits