Skip to content

Commit

Permalink
[index] Fix forward declarations interfering with USR generation of e…
Browse files Browse the repository at this point in the history
…xternal source symbols

Patch by Nathan Hawes.
https://reviews.llvm.org/D33346

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@303484 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
akyrtzi committed May 20, 2017
1 parent c43ddad commit 088eaf5
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 21 deletions.
5 changes: 5 additions & 0 deletions include/clang/AST/DeclBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class DeclarationName;
class DependentDiagnostic;
class EnumDecl;
class ExportDecl;
class ExternalSourceSymbolAttr;
class FunctionDecl;
class FunctionType;
enum Linkage : unsigned char;
Expand Down Expand Up @@ -562,6 +563,10 @@ class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) Decl {
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
/// module in which it was defined.
bool isModulePrivate() const {
Expand Down
21 changes: 21 additions & 0 deletions lib/AST/DeclBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,27 @@ bool Decl::isExported() const {
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 {
return hasAttr<AliasAttr>() || hasAttr<IFuncAttr>();
}
Expand Down
11 changes: 1 addition & 10 deletions lib/Index/IndexSymbol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -318,16 +318,7 @@ SymbolInfo index::getSymbolInfo(const Decl *D) {
if (Info.Properties & (unsigned)SymbolProperty::Generic)
Info.Lang = SymbolLanguage::CXX;

auto getExternalSymAttr = [](const Decl *D) -> ExternalSourceSymbolAttr* {
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 (auto *attr = D->getExternalSourceSymbolAttr()) {
if (attr->getLanguage() == "Swift")
Info.Lang = SymbolLanguage::Swift;
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Index/USRGeneration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ static bool printLoc(llvm::raw_ostream &OS, SourceLocation Loc,
static StringRef GetExternalSourceContainer(const NamedDecl *D) {
if (!D)
return StringRef();
if (auto *attr = D->getAttr<ExternalSourceSymbolAttr>()) {
if (auto *attr = D->getExternalSourceSymbolAttr()) {
return attr->getDefinedIn();
}
return StringRef();
Expand Down
4 changes: 4 additions & 0 deletions test/Index/Core/external-source-symbol-attr.m
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
#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))

// Forward declarations should not affect module namespacing below
@class I1;
@class I2;

// This should not be indexed.
GEN_DECL("some_module")
@interface I1
Expand Down
11 changes: 1 addition & 10 deletions tools/libclang/CIndex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7487,16 +7487,7 @@ unsigned clang_Cursor_isExternalSymbol(CXCursor C,

const Decl *D = getCursorDecl(C);

auto getExternalSymAttr = [](const Decl *D) -> ExternalSourceSymbolAttr* {
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 (auto *attr = D->getExternalSourceSymbolAttr()) {
if (language)
*language = cxstring::createDup(attr->getLanguage());
if (definedIn)
Expand Down

0 comments on commit 088eaf5

Please sign in to comment.