[index] Fix forward declarations interfering with USR generation of external source symbols
Patch by Nathan Hawes. https://reviews.llvm.org/D33346 llvm-svn: 303484
This commit is contained in:
parent
f1c3beecb2
commit
11d704839f
|
@ -34,6 +34,7 @@ class DeclarationName;
|
||||||
class DependentDiagnostic;
|
class DependentDiagnostic;
|
||||||
class EnumDecl;
|
class EnumDecl;
|
||||||
class ExportDecl;
|
class ExportDecl;
|
||||||
|
class ExternalSourceSymbolAttr;
|
||||||
class FunctionDecl;
|
class FunctionDecl;
|
||||||
class FunctionType;
|
class FunctionType;
|
||||||
enum Linkage : unsigned char;
|
enum Linkage : unsigned char;
|
||||||
|
@ -562,6 +563,10 @@ public:
|
||||||
NextInContextAndBits.setInt(Bits);
|
NextInContextAndBits.setInt(Bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// \brief Looks on this and related declarations for an applicable
|
||||||
|
/// external source symbol attribute.
|
||||||
|
ExternalSourceSymbolAttr *getExternalSourceSymbolAttr() const;
|
||||||
|
|
||||||
/// \brief Whether this declaration was marked as being private to the
|
/// \brief Whether this declaration was marked as being private to the
|
||||||
/// module in which it was defined.
|
/// module in which it was defined.
|
||||||
bool isModulePrivate() const {
|
bool isModulePrivate() const {
|
||||||
|
|
|
@ -407,6 +407,27 @@ bool Decl::isExported() const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ExternalSourceSymbolAttr *Decl::getExternalSourceSymbolAttr() const {
|
||||||
|
const Decl *Definition = nullptr;
|
||||||
|
if (auto ID = dyn_cast<ObjCInterfaceDecl>(this)) {
|
||||||
|
Definition = ID->getDefinition();
|
||||||
|
} else if (auto PD = dyn_cast<ObjCProtocolDecl>(this)) {
|
||||||
|
Definition = PD->getDefinition();
|
||||||
|
} else if (auto TD = dyn_cast<TagDecl>(this)) {
|
||||||
|
Definition = TD->getDefinition();
|
||||||
|
}
|
||||||
|
if (!Definition)
|
||||||
|
Definition = this;
|
||||||
|
|
||||||
|
if (auto *attr = Definition->getAttr<ExternalSourceSymbolAttr>())
|
||||||
|
return attr;
|
||||||
|
if (auto *dcd = dyn_cast<Decl>(getDeclContext())) {
|
||||||
|
return dcd->getAttr<ExternalSourceSymbolAttr>();
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
bool Decl::hasDefiningAttr() const {
|
bool Decl::hasDefiningAttr() const {
|
||||||
return hasAttr<AliasAttr>() || hasAttr<IFuncAttr>();
|
return hasAttr<AliasAttr>() || hasAttr<IFuncAttr>();
|
||||||
}
|
}
|
||||||
|
|
|
@ -318,16 +318,7 @@ SymbolInfo index::getSymbolInfo(const Decl *D) {
|
||||||
if (Info.Properties & (unsigned)SymbolProperty::Generic)
|
if (Info.Properties & (unsigned)SymbolProperty::Generic)
|
||||||
Info.Lang = SymbolLanguage::CXX;
|
Info.Lang = SymbolLanguage::CXX;
|
||||||
|
|
||||||
auto getExternalSymAttr = [](const Decl *D) -> ExternalSourceSymbolAttr* {
|
if (auto *attr = D->getExternalSourceSymbolAttr()) {
|
||||||
if (auto *attr = D->getAttr<ExternalSourceSymbolAttr>())
|
|
||||||
return attr;
|
|
||||||
if (auto *dcd = dyn_cast<Decl>(D->getDeclContext())) {
|
|
||||||
if (auto *attr = dcd->getAttr<ExternalSourceSymbolAttr>())
|
|
||||||
return attr;
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
};
|
|
||||||
if (auto *attr = getExternalSymAttr(D)) {
|
|
||||||
if (attr->getLanguage() == "Swift")
|
if (attr->getLanguage() == "Swift")
|
||||||
Info.Lang = SymbolLanguage::Swift;
|
Info.Lang = SymbolLanguage::Swift;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ static bool printLoc(llvm::raw_ostream &OS, SourceLocation Loc,
|
||||||
static StringRef GetExternalSourceContainer(const NamedDecl *D) {
|
static StringRef GetExternalSourceContainer(const NamedDecl *D) {
|
||||||
if (!D)
|
if (!D)
|
||||||
return StringRef();
|
return StringRef();
|
||||||
if (auto *attr = D->getAttr<ExternalSourceSymbolAttr>()) {
|
if (auto *attr = D->getExternalSourceSymbolAttr()) {
|
||||||
return attr->getDefinedIn();
|
return attr->getDefinedIn();
|
||||||
}
|
}
|
||||||
return StringRef();
|
return StringRef();
|
||||||
|
|
|
@ -4,6 +4,10 @@
|
||||||
#define GEN_DECL(mod_name) __attribute__((external_source_symbol(language="Swift", defined_in=mod_name, generated_declaration)))
|
#define GEN_DECL(mod_name) __attribute__((external_source_symbol(language="Swift", defined_in=mod_name, generated_declaration)))
|
||||||
#define PUSH_GEN_DECL(mod_name) push(GEN_DECL(mod_name), apply_to=any(enum, objc_interface, objc_category, objc_protocol))
|
#define PUSH_GEN_DECL(mod_name) push(GEN_DECL(mod_name), apply_to=any(enum, objc_interface, objc_category, objc_protocol))
|
||||||
|
|
||||||
|
// Forward declarations should not affect module namespacing below
|
||||||
|
@class I1;
|
||||||
|
@class I2;
|
||||||
|
|
||||||
// This should not be indexed.
|
// This should not be indexed.
|
||||||
GEN_DECL("some_module")
|
GEN_DECL("some_module")
|
||||||
@interface I1
|
@interface I1
|
||||||
|
|
|
@ -7487,16 +7487,7 @@ unsigned clang_Cursor_isExternalSymbol(CXCursor C,
|
||||||
|
|
||||||
const Decl *D = getCursorDecl(C);
|
const Decl *D = getCursorDecl(C);
|
||||||
|
|
||||||
auto getExternalSymAttr = [](const Decl *D) -> ExternalSourceSymbolAttr* {
|
if (auto *attr = D->getExternalSourceSymbolAttr()) {
|
||||||
if (auto *attr = D->getAttr<ExternalSourceSymbolAttr>())
|
|
||||||
return attr;
|
|
||||||
if (auto *dcd = dyn_cast<Decl>(D->getDeclContext())) {
|
|
||||||
if (auto *attr = dcd->getAttr<ExternalSourceSymbolAttr>())
|
|
||||||
return attr;
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
};
|
|
||||||
if (auto *attr = getExternalSymAttr(D)) {
|
|
||||||
if (language)
|
if (language)
|
||||||
*language = cxstring::createDup(attr->getLanguage());
|
*language = cxstring::createDup(attr->getLanguage());
|
||||||
if (definedIn)
|
if (definedIn)
|
||||||
|
|
Loading…
Reference in New Issue