Files
clang-p2996/clang/lib/SymbolGraph/API.cpp
Zixu Wang 5aab45f430 [clang][extract-api] Add global record support
Add facilities for extract-api:
- Structs/classes to hold collected API information: `APIRecord`, `API`
- Structs/classes for API information:
  - `AvailabilityInfo`: aggregated availbility information
  - `DeclarationFragments`: declaration fragments
    - `DeclarationFragmentsBuilder`: helper class to build declaration
      fragments for various types/declarations
  - `FunctionSignature`: function signature
- Serialization: `Serializer`
- Add output file for `ExtractAPIAction`
- Refactor `clang::RawComment::getFormattedText` to provide an
  additional `getFormattedLines` for a more detailed view of comment lines
  used for the SymbolGraph format

Add support for global records (global variables and functions)
- Add `GlobalRecord` based on `APIRecord` to store global records'
  information
- Implement `VisitVarDecl` and `VisitFunctionDecl` in `ExtractAPIVisitor` to
  collect information
- Implement serialization for global records
- Add test case for global records

Differential Revision: https://reviews.llvm.org/D119479
2022-03-16 15:13:55 -07:00

84 lines
3.1 KiB
C++

//===- SymbolGraph/API.cpp --------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief Defines SymbolGraph API records.
///
//===----------------------------------------------------------------------===//
#include "clang/SymbolGraph/API.h"
#include "clang/AST/CommentCommandTraits.h"
#include "clang/AST/CommentLexer.h"
#include "clang/AST/RawCommentList.h"
#include "clang/Index/USRGeneration.h"
#include "llvm/Support/Allocator.h"
namespace clang {
namespace symbolgraph {
APIRecord::~APIRecord() {}
GlobalRecord *
API::addGlobal(GVKind Kind, StringRef Name, StringRef USR, PresumedLoc Loc,
const AvailabilityInfo &Availability, LinkageInfo Linkage,
const DocComment &Comment, DeclarationFragments Fragments,
DeclarationFragments SubHeading, FunctionSignature Signature) {
auto Result = Globals.insert({Name, nullptr});
if (Result.second) {
GlobalRecord *Record = new (Allocator)
GlobalRecord{Kind, Name, USR, Loc, Availability,
Linkage, Comment, Fragments, SubHeading, Signature};
Result.first->second = Record;
}
return Result.first->second;
}
GlobalRecord *API::addGlobalVar(StringRef Name, StringRef USR, PresumedLoc Loc,
const AvailabilityInfo &Availability,
LinkageInfo Linkage, const DocComment &Comment,
DeclarationFragments Fragments,
DeclarationFragments SubHeading) {
return addGlobal(GVKind::Variable, Name, USR, Loc, Availability, Linkage,
Comment, Fragments, SubHeading, {});
}
GlobalRecord *API::addFunction(StringRef Name, StringRef USR, PresumedLoc Loc,
const AvailabilityInfo &Availability,
LinkageInfo Linkage, const DocComment &Comment,
DeclarationFragments Fragments,
DeclarationFragments SubHeading,
FunctionSignature Signature) {
return addGlobal(GVKind::Function, Name, USR, Loc, Availability, Linkage,
Comment, Fragments, SubHeading, Signature);
}
StringRef API::recordUSR(const Decl *D) {
SmallString<128> USR;
index::generateUSRForDecl(D, USR);
return copyString(USR);
}
StringRef API::copyString(StringRef String, llvm::BumpPtrAllocator &Allocator) {
if (String.empty())
return {};
if (Allocator.identifyObject(String.data()))
return String;
void *Ptr = Allocator.Allocate(String.size(), 1);
memcpy(Ptr, String.data(), String.size());
return StringRef(reinterpret_cast<const char *>(Ptr), String.size());
}
StringRef API::copyString(StringRef String) {
return copyString(String, Allocator);
}
} // namespace symbolgraph
} // namespace clang