blob: 2b43c5b375f5e5a0fd631e0f753ef0b72f6d1be1 [file] [log] [blame]
Guy Benyei11169dd2012-12-18 14:30:41 +00001//===- CIndexUSR.cpp - Clang-C Source Indexing Library --------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the generation and use of USRs from CXEntities.
11//
12//===----------------------------------------------------------------------===//
13
14#include "CIndexer.h"
15#include "CXCursor.h"
16#include "CXString.h"
Argyrios Kyrtzidis15a2fcc2013-08-17 00:40:41 +000017#include "clang/Index/USRGeneration.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000018#include "clang/Lex/PreprocessingRecord.h"
19#include "llvm/ADT/SmallString.h"
20#include "llvm/Support/raw_ostream.h"
21
22using namespace clang;
Argyrios Kyrtzidis5234b492013-08-21 00:49:25 +000023using namespace clang::index;
Guy Benyei11169dd2012-12-18 14:30:41 +000024
25//===----------------------------------------------------------------------===//
Guy Benyei11169dd2012-12-18 14:30:41 +000026// API hooks.
27//===----------------------------------------------------------------------===//
28
29static inline StringRef extractUSRSuffix(StringRef s) {
30 return s.startswith("c:") ? s.substr(2) : "";
31}
32
33bool cxcursor::getDeclCursorUSR(const Decl *D, SmallVectorImpl<char> &Buf) {
Argyrios Kyrtzidis5234b492013-08-21 00:49:25 +000034 return generateUSRForDecl(D, Buf);
Guy Benyei11169dd2012-12-18 14:30:41 +000035}
36
37extern "C" {
38
39CXString clang_getCursorUSR(CXCursor C) {
40 const CXCursorKind &K = clang_getCursorKind(C);
41
42 if (clang_isDeclaration(K)) {
Dmitri Gribenkod15bb302013-01-23 17:25:27 +000043 const Decl *D = cxcursor::getCursorDecl(C);
Guy Benyei11169dd2012-12-18 14:30:41 +000044 if (!D)
Dmitri Gribenko36a6dd02013-02-01 14:21:22 +000045 return cxstring::createEmpty();
Guy Benyei11169dd2012-12-18 14:30:41 +000046
47 CXTranslationUnit TU = cxcursor::getCursorTU(C);
48 if (!TU)
Dmitri Gribenko36a6dd02013-02-01 14:21:22 +000049 return cxstring::createEmpty();
Guy Benyei11169dd2012-12-18 14:30:41 +000050
Dmitri Gribenko74895212013-02-03 13:52:47 +000051 cxstring::CXStringBuf *buf = cxstring::getCXStringBuf(TU);
Guy Benyei11169dd2012-12-18 14:30:41 +000052 if (!buf)
Dmitri Gribenko36a6dd02013-02-01 14:21:22 +000053 return cxstring::createEmpty();
Guy Benyei11169dd2012-12-18 14:30:41 +000054
55 bool Ignore = cxcursor::getDeclCursorUSR(D, buf->Data);
56 if (Ignore) {
Dmitri Gribenkob95b3f12013-01-26 22:44:19 +000057 buf->dispose();
Dmitri Gribenko36a6dd02013-02-01 14:21:22 +000058 return cxstring::createEmpty();
Guy Benyei11169dd2012-12-18 14:30:41 +000059 }
60
61 // Return the C-string, but don't make a copy since it is already in
62 // the string buffer.
63 buf->Data.push_back('\0');
64 return createCXString(buf);
65 }
66
67 if (K == CXCursor_MacroDefinition) {
68 CXTranslationUnit TU = cxcursor::getCursorTU(C);
69 if (!TU)
Dmitri Gribenko36a6dd02013-02-01 14:21:22 +000070 return cxstring::createEmpty();
Guy Benyei11169dd2012-12-18 14:30:41 +000071
Dmitri Gribenko74895212013-02-03 13:52:47 +000072 cxstring::CXStringBuf *buf = cxstring::getCXStringBuf(TU);
Guy Benyei11169dd2012-12-18 14:30:41 +000073 if (!buf)
Dmitri Gribenko36a6dd02013-02-01 14:21:22 +000074 return cxstring::createEmpty();
Guy Benyei11169dd2012-12-18 14:30:41 +000075
Argyrios Kyrtzidis5234b492013-08-21 00:49:25 +000076 buf->Data += getUSRSpacePrefix();
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +000077 buf->Data += "macro@";
78 buf->Data +=
79 cxcursor::getCursorMacroDefinition(C)->getName()->getNameStart();
Guy Benyei11169dd2012-12-18 14:30:41 +000080 buf->Data.push_back('\0');
81 return createCXString(buf);
82 }
83
Dmitri Gribenko36a6dd02013-02-01 14:21:22 +000084 return cxstring::createEmpty();
Guy Benyei11169dd2012-12-18 14:30:41 +000085}
86
87CXString clang_constructUSR_ObjCIvar(const char *name, CXString classUSR) {
Argyrios Kyrtzidis7aa49d82013-08-21 01:51:19 +000088 SmallString<128> Buf(getUSRSpacePrefix());
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +000089 llvm::raw_svector_ostream OS(Buf);
90 OS << extractUSRSuffix(clang_getCString(classUSR));
Argyrios Kyrtzidis5234b492013-08-21 00:49:25 +000091 generateUSRForObjCIvar(name, OS);
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +000092 return cxstring::createDup(OS.str());
Guy Benyei11169dd2012-12-18 14:30:41 +000093}
94
95CXString clang_constructUSR_ObjCMethod(const char *name,
96 unsigned isInstanceMethod,
97 CXString classUSR) {
Argyrios Kyrtzidis7aa49d82013-08-21 01:51:19 +000098 SmallString<128> Buf(getUSRSpacePrefix());
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +000099 llvm::raw_svector_ostream OS(Buf);
100 OS << extractUSRSuffix(clang_getCString(classUSR));
Argyrios Kyrtzidis5234b492013-08-21 00:49:25 +0000101 generateUSRForObjCMethod(name, isInstanceMethod, OS);
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +0000102 return cxstring::createDup(OS.str());
Guy Benyei11169dd2012-12-18 14:30:41 +0000103}
104
105CXString clang_constructUSR_ObjCClass(const char *name) {
Argyrios Kyrtzidis7aa49d82013-08-21 01:51:19 +0000106 SmallString<128> Buf(getUSRSpacePrefix());
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +0000107 llvm::raw_svector_ostream OS(Buf);
Argyrios Kyrtzidis5234b492013-08-21 00:49:25 +0000108 generateUSRForObjCClass(name, OS);
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +0000109 return cxstring::createDup(OS.str());
Guy Benyei11169dd2012-12-18 14:30:41 +0000110}
111
112CXString clang_constructUSR_ObjCProtocol(const char *name) {
Argyrios Kyrtzidis7aa49d82013-08-21 01:51:19 +0000113 SmallString<128> Buf(getUSRSpacePrefix());
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +0000114 llvm::raw_svector_ostream OS(Buf);
Argyrios Kyrtzidis5234b492013-08-21 00:49:25 +0000115 generateUSRForObjCProtocol(name, OS);
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +0000116 return cxstring::createDup(OS.str());
Guy Benyei11169dd2012-12-18 14:30:41 +0000117}
118
119CXString clang_constructUSR_ObjCCategory(const char *class_name,
120 const char *category_name) {
Argyrios Kyrtzidis7aa49d82013-08-21 01:51:19 +0000121 SmallString<128> Buf(getUSRSpacePrefix());
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +0000122 llvm::raw_svector_ostream OS(Buf);
Argyrios Kyrtzidis5234b492013-08-21 00:49:25 +0000123 generateUSRForObjCCategory(class_name, category_name, OS);
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +0000124 return cxstring::createDup(OS.str());
Guy Benyei11169dd2012-12-18 14:30:41 +0000125}
126
127CXString clang_constructUSR_ObjCProperty(const char *property,
128 CXString classUSR) {
Argyrios Kyrtzidis7aa49d82013-08-21 01:51:19 +0000129 SmallString<128> Buf(getUSRSpacePrefix());
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +0000130 llvm::raw_svector_ostream OS(Buf);
131 OS << extractUSRSuffix(clang_getCString(classUSR));
Argyrios Kyrtzidis5234b492013-08-21 00:49:25 +0000132 generateUSRForObjCProperty(property, OS);
Argyrios Kyrtzidis4b2b4602013-08-16 18:17:55 +0000133 return cxstring::createDup(OS.str());
Guy Benyei11169dd2012-12-18 14:30:41 +0000134}
135
136} // end extern "C"