123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- //===- CIndexUSRs.cpp - Clang-C Source Indexing Library -------------------===//
- //
- // 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
- //
- //===----------------------------------------------------------------------===//
- //
- // This file implements the generation and use of USRs from CXEntities.
- //
- //===----------------------------------------------------------------------===//
- #include "CIndexer.h"
- #include "CXCursor.h"
- #include "CXString.h"
- #include "CXTranslationUnit.h"
- #include "clang/Frontend/ASTUnit.h"
- #include "clang/Index/USRGeneration.h"
- #include "clang/Lex/PreprocessingRecord.h"
- #include "llvm/ADT/SmallString.h"
- #include "llvm/Support/raw_ostream.h"
- using namespace clang;
- using namespace clang::index;
- //===----------------------------------------------------------------------===//
- // API hooks.
- //===----------------------------------------------------------------------===//
- static inline StringRef extractUSRSuffix(StringRef s) {
- return s.startswith("c:") ? s.substr(2) : "";
- }
- bool cxcursor::getDeclCursorUSR(const Decl *D, SmallVectorImpl<char> &Buf) {
- return generateUSRForDecl(D, Buf);
- }
- CXString clang_getCursorUSR(CXCursor C) {
- const CXCursorKind &K = clang_getCursorKind(C);
- if (clang_isDeclaration(K)) {
- const Decl *D = cxcursor::getCursorDecl(C);
- if (!D)
- return cxstring::createEmpty();
- CXTranslationUnit TU = cxcursor::getCursorTU(C);
- if (!TU)
- return cxstring::createEmpty();
- cxstring::CXStringBuf *buf = cxstring::getCXStringBuf(TU);
- if (!buf)
- return cxstring::createEmpty();
- bool Ignore = cxcursor::getDeclCursorUSR(D, buf->Data);
- if (Ignore) {
- buf->dispose();
- return cxstring::createEmpty();
- }
- // Return the C-string, but don't make a copy since it is already in
- // the string buffer.
- buf->Data.push_back('\0');
- return createCXString(buf);
- }
- if (K == CXCursor_MacroDefinition) {
- CXTranslationUnit TU = cxcursor::getCursorTU(C);
- if (!TU)
- return cxstring::createEmpty();
- cxstring::CXStringBuf *buf = cxstring::getCXStringBuf(TU);
- if (!buf)
- return cxstring::createEmpty();
- bool Ignore = generateUSRForMacro(cxcursor::getCursorMacroDefinition(C),
- cxtu::getASTUnit(TU)->getSourceManager(),
- buf->Data);
- if (Ignore) {
- buf->dispose();
- return cxstring::createEmpty();
- }
- // Return the C-string, but don't make a copy since it is already in
- // the string buffer.
- buf->Data.push_back('\0');
- return createCXString(buf);
- }
- return cxstring::createEmpty();
- }
- CXString clang_constructUSR_ObjCIvar(const char *name, CXString classUSR) {
- SmallString<128> Buf(getUSRSpacePrefix());
- llvm::raw_svector_ostream OS(Buf);
- OS << extractUSRSuffix(clang_getCString(classUSR));
- generateUSRForObjCIvar(name, OS);
- return cxstring::createDup(OS.str());
- }
- CXString clang_constructUSR_ObjCMethod(const char *name,
- unsigned isInstanceMethod,
- CXString classUSR) {
- SmallString<128> Buf(getUSRSpacePrefix());
- llvm::raw_svector_ostream OS(Buf);
- OS << extractUSRSuffix(clang_getCString(classUSR));
- generateUSRForObjCMethod(name, isInstanceMethod, OS);
- return cxstring::createDup(OS.str());
- }
- CXString clang_constructUSR_ObjCClass(const char *name) {
- SmallString<128> Buf(getUSRSpacePrefix());
- llvm::raw_svector_ostream OS(Buf);
- generateUSRForObjCClass(name, OS);
- return cxstring::createDup(OS.str());
- }
- CXString clang_constructUSR_ObjCProtocol(const char *name) {
- SmallString<128> Buf(getUSRSpacePrefix());
- llvm::raw_svector_ostream OS(Buf);
- generateUSRForObjCProtocol(name, OS);
- return cxstring::createDup(OS.str());
- }
- CXString clang_constructUSR_ObjCCategory(const char *class_name,
- const char *category_name) {
- SmallString<128> Buf(getUSRSpacePrefix());
- llvm::raw_svector_ostream OS(Buf);
- generateUSRForObjCCategory(class_name, category_name, OS);
- return cxstring::createDup(OS.str());
- }
- CXString clang_constructUSR_ObjCProperty(const char *property,
- CXString classUSR) {
- SmallString<128> Buf(getUSRSpacePrefix());
- llvm::raw_svector_ostream OS(Buf);
- OS << extractUSRSuffix(clang_getCString(classUSR));
- generateUSRForObjCProperty(property, /*isClassProp=*/false, OS);
- return cxstring::createDup(OS.str());
- }
|