IndexingContext.cpp revision dd93c596cd95e1b96031ff47efe0a5095ff3d7f1
14e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//===- CIndexHigh.cpp - Higher level API functions ------------------------===// 24e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 34e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// The LLVM Compiler Infrastructure 44e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 54e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 64e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// License. See LICENSE.TXT for details. 74e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 84e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 94e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "IndexingContext.h" 114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "CXTranslationUnit.h" 124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "CIndexDiagnostic.h" 134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "clang/Frontend/ASTUnit.h" 154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "clang/AST/DeclObjC.h" 164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace clang; 184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace cxindex; 194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace cxcursor; 204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst char *IndexingContext::StrAdapter::toCStr(StringRef Str) { 224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Str.empty()) 234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return ""; 244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Str.data()[Str.size()] == '\0') 254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return Str.data(); 264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Scratch += Str; 274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Scratch.push_back('\0'); 284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return Scratch.data() + (Scratch.size() - Str.size() - 1); 294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::setASTContext(ASTContext &ctx) { 324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Ctx = &ctx; 334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis static_cast<ASTUnit*>(CXTU->TUData)->setASTContext(&ctx); 344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 36dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::enteredMainFile(const FileEntry *File) { 37dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (File && CB.enteredMainFile) { 38dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile idxFile = CB.enteredMainFile(ClientData, (CXFile)File, 0); 39dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis FileMap[File] = idxFile; 40dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 41dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 42dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppIncludedFile(SourceLocation hashLoc, 444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis StringRef filename, 454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const FileEntry *File, 464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool isImport, bool isAngled) { 474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.ppIncludedFile) 484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 50dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxIncludedFileInfo Info = { getIndexLoc(hashLoc), 524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SA.toCStr(filename), 53dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis (CXFile)File, 544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis isImport, isAngled }; 55dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile idxFile = CB.ppIncludedFile(ClientData, &Info); 56dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis FileMap[File] = idxFile; 574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppMacroDefined(SourceLocation Loc, StringRef Name, 604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceLocation DefBegin, unsigned Length, 614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const void *OpaqueMacro) { 624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.ppMacroDefined) 634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 65dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxMacroInfo MacroInfo = { getIndexLoc(Loc), SA.toCStr(Name) }; 674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxMacroDefinedInfo Info = { &MacroInfo, 684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis getIndexLoc(DefBegin), Length }; 69dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientMacro idxMacro = CB.ppMacroDefined(ClientData, &Info); 704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis MacroMap[OpaqueMacro] = idxMacro; 714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppMacroUndefined(SourceLocation Loc, StringRef Name, 744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const void *OpaqueMacro) { 754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.ppMacroUndefined) 764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 78dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxMacroUndefinedInfo Info = { getIndexLoc(Loc), 804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SA.toCStr(Name), 0 }; 814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CB.ppMacroUndefined(ClientData, &Info); 824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppMacroExpanded(SourceLocation Loc, StringRef Name, 854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const void *OpaqueMacro) { 864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.ppMacroExpanded) 874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 89dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxMacroExpandedInfo Info = { getIndexLoc(Loc), 914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SA.toCStr(Name), 0 }; 924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CB.ppMacroExpanded(ClientData, &Info); 934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::invokeStartedTranslationUnit() { 96dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientContainer idxCont = 0; 974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (CB.startedTranslationUnit) 984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxCont = CB.startedTranslationUnit(ClientData, 0); 994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis addContainerInMap(Ctx->getTranslationUnitDecl(), idxCont); 1004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::invokeFinishedTranslationUnit() { 103dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis endContainer(Ctx->getTranslationUnitDecl()); 1044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleDiagnostic(const StoredDiagnostic &StoredDiag) { 1074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.diagnostic) 1084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 1094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXStoredDiagnostic CXDiag(StoredDiag, Ctx->getLangOptions()); 1114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CB.diagnostic(ClientData, &CXDiag, 0); 1124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 114dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleDecl(const NamedDecl *D, 115dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc, CXCursor Cursor, 116dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool isRedeclaration, bool isDefinition, 117dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DeclInfo &DInfo) { 118dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (!CB.indexDeclaration) 119dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis return; 1204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 121dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 122dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(D, DInfo.CXEntInfo, SA); 123dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.entityInfo = &DInfo.CXEntInfo; 124dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.cursor = Cursor; 125dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.loc = getIndexLoc(Loc); 126dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.container = getIndexContainer(D); 127dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.isRedeclaration = isRedeclaration; 128dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.isDefinition = isDefinition; 129dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 130dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientEntity 131dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis clientEnt = CB.indexDeclaration(ClientData, &DInfo); 132dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 133dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (!isRedeclaration) 134dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis addEntityInMap(D, clientEnt); 135dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 136dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 137dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCContainer(const ObjCContainerDecl *D, 138dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc, CXCursor Cursor, 139dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool isForwardRef, 140dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool isRedeclaration, 141dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool isImplementation, 142dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCContainerDeclInfo &ContDInfo) { 143dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ContDInfo.CXObjCContDeclInfo.declInfo = &ContDInfo; 144dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (isForwardRef) 145dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef; 146dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis else if (isImplementation) 147dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation; 148dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis else 149dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Interface; 1504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 151dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleDecl(D, Loc, Cursor, 152dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis isRedeclaration, /*isDefinition=*/!isForwardRef, ContDInfo); 1534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 155dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleFunction(const FunctionDecl *D) { 156dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DeclInfo DInfo; 157dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), 158dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis !D->isFirstDeclaration(), D->isThisDeclarationADefinition(), 159dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo); 160dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 1614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 162dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleVar(const VarDecl *D) { 163dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DeclInfo DInfo; 164dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), 165dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis !D->isFirstDeclaration(), D->isThisDeclarationADefinition(), 166dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo); 1674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleField(const FieldDecl *D) { 170dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DeclInfo DInfo; 171dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), 172dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isRedeclaration=*/false, /*isDefinition=*/false, DInfo); 1734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleEnumerator(const EnumConstantDecl *D) { 176dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DeclInfo DInfo; 177dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), 178dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isRedeclaration=*/false, /*isDefinition=*/true, DInfo); 1794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleTagDecl(const TagDecl *D) { 182dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis TagDeclInfo TagDInfo; 183dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis TagDInfo.CXTagDeclInfo.declInfo = &TagDInfo; 184dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis TagDInfo.CXTagDeclInfo.isAnonymous = D->getIdentifier() == 0; 185dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), 186dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis !D->isFirstDeclaration(), D->isThisDeclarationADefinition(), 187dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis TagDInfo); 1884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleTypedef(const TypedefDecl *D) { 191dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DeclInfo DInfo; 192dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), 193dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis !D->isFirstDeclaration(), /*isDefinition=*/true, DInfo); 194dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 1954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 196dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCClass(const ObjCClassDecl *D) { 197dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCContainerDeclInfo ContDInfo; 198dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const ObjCClassDecl::ObjCClassRef *Ref = D->getForwardDecl(); 199dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCInterfaceDecl *IFaceD = Ref->getInterface(); 200dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc = Ref->getLocation(); 201dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool isRedeclaration = IFaceD->getLocation() != Loc; 202dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleObjCContainer(IFaceD, Loc, MakeCursorObjCClassRef(IFaceD, Loc, CXTU), 203dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isForwardRef=*/true, isRedeclaration, 204dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isImplementation=*/false, ContDInfo); 2054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) { 208dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCContainerDeclInfo ContDInfo; 209dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleObjCContainer(D, D->getLocation(), getCursor(D), 210dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isForwardRef=*/false, 211dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isRedeclaration=*/D->isInitiallyForwardDecl(), 212dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isImplementation=*/false, ContDInfo); 213dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 2144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 215dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCImplementation( 216dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const ObjCImplementationDecl *D) { 217dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCContainerDeclInfo ContDInfo; 218dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const ObjCInterfaceDecl *Class = D->getClassInterface(); 219dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleObjCContainer(Class, D->getLocation(), getCursor(D), 220dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isForwardRef=*/false, 221dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isRedeclaration=*/!Class->isImplicitInterfaceDecl(), 222dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isImplementation=*/true, ContDInfo); 223dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 2244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 225dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCForwardProtocol(const ObjCProtocolDecl *D, 226dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc, 227dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool isRedeclaration) { 228dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCContainerDeclInfo ContDInfo; 229dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleObjCContainer(D, Loc, MakeCursorObjCProtocolRef(D, Loc, CXTU), 230dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isForwardRef=*/true, 231dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis isRedeclaration, 232dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isImplementation=*/false, ContDInfo); 233dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 2344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 235dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) { 236dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCContainerDeclInfo ContDInfo; 237dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleObjCContainer(D, D->getLocation(), getCursor(D), 238dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isForwardRef=*/false, 239dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isRedeclaration=*/D->isInitiallyForwardDecl(), 240dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isImplementation=*/false, ContDInfo); 2414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::defineObjCInterface(const ObjCInterfaceDecl *D) { 2444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.defineObjCClass) 2454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 2464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 247dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 248dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxObjCBaseClassInfo BaseClass; 249dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo BaseEntity; 2504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (D->getSuperClass()) { 251dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(D->getSuperClass(), BaseEntity, SA); 252dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis BaseClass.objcClass = &BaseEntity; 2534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis BaseClass.loc = getIndexLoc(D->getSuperClassLoc()); 2544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 255dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 2564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos; 257dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SmallVector<CXIdxEntityInfo, 4> ProtEntities; 2584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ObjCInterfaceDecl::protocol_loc_iterator LI = D->protocol_loc_begin(); 2594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (ObjCInterfaceDecl::protocol_iterator 2604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I = D->protocol_begin(), E = D->protocol_end(); I != E; ++I, ++LI) { 2614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceLocation Loc = *LI; 2624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ObjCProtocolDecl *PD = *I; 263dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ProtEntities.push_back(CXIdxEntityInfo()); 264dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(PD, ProtEntities.back(), SA); 265dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxObjCProtocolRefInfo ProtInfo = { 0, getIndexLoc(Loc) }; 2664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ProtInfos.push_back(ProtInfo); 2674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 268dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 269dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i) 270dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ProtInfos[i].protocol = &ProtEntities[i]; 2714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots; 2734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis for (unsigned i = 0, e = Prots.size(); i != e; ++i) 2744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Prots.push_back(&ProtInfos[i]); 2754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 276dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo ClassEntity; 277dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(D, ClassEntity, SA); 2784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxObjCClassDefineInfo Info = { getCursor(D), 279dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis &ClassEntity, 2804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis getIndexContainerForDC(D), 2814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D->getSuperClass() ? &BaseClass : 0, 2824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Prots.data(), 2833de2fc4e42f8d58f061af3ac8bb7d57e8d86a23bMatt Beaumont-Gay static_cast<unsigned>(Prots.size()) }; 2844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CB.defineObjCClass(ClientData, &Info); 2854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) { 288dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCCategoryDeclInfo CatDInfo; 289dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo ClassEntity; 290dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 291dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(D->getClassInterface(), ClassEntity, SA); 292dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 293dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo; 294dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity; 295dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleObjCContainer(D, D->getLocation(), getCursor(D), 296dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isForwardRef=*/false, 297dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isRedeclaration=*/false, 298dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isImplementation=*/false, CatDInfo); 299dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 300dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 301dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) { 302dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const ObjCCategoryDecl *CatD = D->getCategoryDecl(); 303dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCCategoryDeclInfo CatDInfo; 304dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo ClassEntity; 305dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 306dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(CatD->getClassInterface(), ClassEntity, SA); 307dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 308dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo; 309dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity; 310dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleObjCContainer(CatD, D->getLocation(), getCursor(D), 311dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isForwardRef=*/false, 312dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isRedeclaration=*/true, 313dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isImplementation=*/true, CatDInfo); 3144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) { 317dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DeclInfo DInfo; 318dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), 319dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis !D->isCanonicalDecl(), D->isThisDeclarationADefinition(), 320dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo); 3214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) { 324dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DeclInfo DInfo; 325dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), 326dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis /*isRedeclaration=*/false, /*isDefinition=*/false, 327dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo); 3284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, 3314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const NamedDecl *Parent, 3324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *DC, 333aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis const Expr *E, 334aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis CXIdxEntityRefKind Kind) { 3354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 3364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 3374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.indexEntityReference) 3384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 3394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isNotFromSourceFile(D->getLocation())) 3404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 3414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 342dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 343854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E), 344854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer const_cast<Decl*>(cast<Decl>(DC)), CXTU) 345854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer : getRefCursor(D, Loc); 346854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer 347dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo RefEntity, ParentEntity; 348dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(D, RefEntity, SA); 349dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(Parent, ParentEntity, SA); 350854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer CXIdxEntityRefInfo Info = { Cursor, 3514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis getIndexLoc(Loc), 352dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis &RefEntity, 353dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis &ParentEntity, 354aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis getIndexContainerForDC(DC), 355aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis Kind }; 3564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CB.indexEntityReference(ClientData, &Info); 3574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 359dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::startContainer(const NamedDecl *D, bool isStmtBody, 360dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const DeclContext *DC) { 361dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (!CB.startedContainer) 362dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis return; 3634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 364dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (!DC) 365dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DC = cast<DeclContext>(D); 366dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 367dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 368dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo Entity; 369dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(D, Entity, SA); 370dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxContainerInfo Info; 371dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis Info.entity = &Entity; 372dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis Info.cursor = getCursor(D); 373dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis Info.loc = getIndexLoc(D->getLocation()); 374dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis Info.isObjCImpl = isa<ObjCImplDecl>(D); 3754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 376dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientContainer clientCont = CB.startedContainer(ClientData, &Info); 377dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis addContainerInMap(DC, clientCont); 3784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 380dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::endContainer(const DeclContext *DC) { 3814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (CB.endedContainer) { 3824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxEndContainerInfo Info = { getIndexContainerForDC(DC), 3834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis getIndexLoc(cast<Decl>(DC)->getLocEnd()) }; 3844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CB.endedContainer(ClientData, &Info); 3854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 3864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisbool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const { 3894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 3904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 3914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 3924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceLocation FileLoc = SM.getFileLoc(Loc); 3934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileID FID = SM.getFileID(FileLoc); 3944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return SM.getFileEntryForID(FID) == 0; 3954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::addContainerInMap(const DeclContext *DC, 398dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientContainer container) { 3994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(getScopedContext(DC) == DC); 4004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMapTy::iterator I = ContainerMap.find(DC); 4014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (I == ContainerMap.end()) { 4024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (container) 4034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMap[DC] = container; 4044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 4054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 4064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Allow changing the container of a previously seen DeclContext so we 4074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // can handle invalid user code, like a function re-definition. 4084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (container) 4094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I->second = container; 4104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis else 4114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMap.erase(I); 4124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 414dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::addEntityInMap(const NamedDecl *D, 415dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientEntity entity) { 4164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(getEntityDecl(D) == D && 4174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis "Tried to add a non-entity (canonical) decl"); 4184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(EntityMap.find(D) == EntityMap.end()); 4194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (entity || D->isFromASTFile()) 4204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityMap[D] = entity; 4214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 423dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientEntity IndexingContext::getClientEntity(const NamedDecl *D) { 4244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!D) 4254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return 0; 4264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D = getEntityDecl(D); 4274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityMapTy::const_iterator I = EntityMap.find(D); 4284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (I != EntityMap.end()) 4294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return I->second; 4304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!D->isFromASTFile()) { 4324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis //assert(0 && "Entity not in map"); 4334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return 0; 4344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 4354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 436dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 4374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 438dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientEntity idxEntity = 0; 4394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (CB.importedEntity) { 4404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxEntityInfo EntityInfo; 4414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis getEntityInfo(D, EntityInfo, SA); 4424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxImportedEntityInfo Info = { &EntityInfo, 4434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis getCursor(D), 4444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis getIndexLoc(D->getLocation()), 4454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis /*CXIdxASTFile*/0 }; 4464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxEntity = CB.importedEntity(ClientData, &Info); 4474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 4484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis addEntityInMap(D, idxEntity); 4494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return idxEntity; 4504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const { 4534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(D); 4544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D = cast<NamedDecl>(D->getCanonicalDecl()); 4554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(D)) { 4574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Cat->IsClassExtension()) 4584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(Cat->getClassInterface()); 4594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (const ObjCImplementationDecl * 4614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ImplD = dyn_cast<ObjCImplementationDecl>(D)) { 4624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(ImplD->getClassInterface()); 4634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (const ObjCCategoryImplDecl * 4654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CatImplD = dyn_cast<ObjCCategoryImplDecl>(D)) { 4664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(CatImplD->getCategoryDecl()); 4674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 4684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return D; 4704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst DeclContext * 4734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getScopedContext(const DeclContext *DC) const { 4744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Local contexts are ignored for indexing. 4754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *FuncCtx = cast<Decl>(DC)->getParentFunctionOrMethod(); 4764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FuncCtx) 4774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return FuncCtx; 4784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // We consider enums always scoped for indexing. 4804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isa<TagDecl>(DC)) 4814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return DC; 4824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) { 4844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (NS->isAnonymousNamespace()) 4854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getScopedContext(NS->getParent()); 4864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return NS; 4874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 4884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return DC->getRedeclContext(); 4904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 492dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientContainer 4934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getIndexContainerForDC(const DeclContext *DC) const { 4944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis DC = getScopedContext(DC); 4954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMapTy::const_iterator I = ContainerMap.find(DC); 4964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// assert(I != ContainerMap.end() && 4974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// "Failed to include a scoped context in the container map"); 4984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return I->second; 4994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 5004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 501dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientFile IndexingContext::getIndexFile(const FileEntry *File) { 5024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!File) 5034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return 0; 5044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileMapTy::iterator FI = FileMap.find(File); 5064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FI != FileMap.end()) 5074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return FI->second; 5084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 509dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis return 0; 5104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 5114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const { 5134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxLoc idxLoc = { {0, 0}, 0 }; 5144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 5154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return idxLoc; 5164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxLoc.ptr_data[0] = (void*)this; 5184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxLoc.int_data = Loc.getRawEncoding(); 5194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return idxLoc; 5204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 5214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::translateLoc(SourceLocation Loc, 523dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile *indexFile, CXFile *file, 5244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned *line, unsigned *column, 5254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned *offset) { 5264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 5274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 5284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 5304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Loc = SM.getFileLoc(Loc); 5314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); 5334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileID FID = LocInfo.first; 5344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned FileOffset = LocInfo.second; 5354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FID.isInvalid()) 5374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 5384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const FileEntry *FE = SM.getFileEntryForID(FID); 5404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (indexFile) 5414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *indexFile = getIndexFile(FE); 5424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (file) 5434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *file = (void *)FE; 5444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (line) 5454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *line = SM.getLineNumber(FID, FileOffset); 5464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (column) 5474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *column = SM.getColumnNumber(FID, FileOffset); 5484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (offset) 5494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *offset = FileOffset; 5504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 5514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 552dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::getEntityInfo(const NamedDecl *D, 553dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo &EntityInfo, 554dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter &SA) { 555dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis D = getEntityDecl(D); 556dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Unexposed; 557dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.clientEntity = getClientEntity(D); 558dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 559dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (const TagDecl *TD = dyn_cast<TagDecl>(D)) { 560dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis switch (TD->getTagKind()) { 561dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Struct: 562dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Struct; break; 563dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Union: 564dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Union; break; 565dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Class: 566dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXClass; break; 567dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Enum: 568dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Enum; break; 569dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 5704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 571dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } else { 572dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis switch (D->getKind()) { 573dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Typedef: 574dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Typedef; break; 575dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Function: 576dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Function; break; 577dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Var: 578dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Variable; break; 579dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Field: 580dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Field; break; 581dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::EnumConstant: 582dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_EnumConstant; break; 583dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCInterface: 584dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCClass; break; 585dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCProtocol: 586dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCProtocol; break; 587dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCCategory: 588dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCCategory; break; 589dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCMethod: 590dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCMethod; break; 591dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCProperty: 592dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCProperty; break; 593dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCIvar: 594dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCIvar; break; 595dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis default: 596dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis break; 597dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 598dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 5994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (IdentifierInfo *II = D->getIdentifier()) { 6014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityInfo.name = SA.toCStr(II->getName()); 6024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) { 604dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.name = 0; // anonymous record/namespace. 6054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else { 6074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned Begin = SA.getCurSize(); 6084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis { 6094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis llvm::raw_svector_ostream OS(SA.getBuffer()); 6104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D->printName(OS); 6114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 6124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityInfo.name = SA.getCStr(Begin); 6134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 6144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 615dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis { 616dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis unsigned Begin = SA.getCurSize(); 617dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool Ignore = getDeclCursorUSR(D, SA.getBuffer()); 618dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (Ignore) { 619dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.USR = ""; 620dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } else { 621dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.USR = SA.getCStr(Begin); 622dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 6234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 6244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 6254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor IndexingContext::getRefCursor(const NamedDecl *D, SourceLocation Loc) { 6274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) 6284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorTypeRef(TD, Loc, CXTU); 6294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) 6304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorObjCClassRef(ID, Loc, CXTU); 6314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) 6324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorObjCProtocolRef(PD, Loc, CXTU); 6334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis //assert(0 && "not yet"); 6354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return clang_getNullCursor(); 6364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 637