Index: lib/Index/IndexSymbol.cpp =================================================================== --- lib/Index/IndexSymbol.cpp +++ lib/Index/IndexSymbol.cpp @@ -319,6 +319,17 @@ Info.Lang = SymbolLanguage::CXX; auto getExternalSymAttr = [](const Decl *D) -> ExternalSourceSymbolAttr* { + const NamedDecl *Definition = nullptr; + if (auto ID = dyn_cast(D)) { + Definition = ID->getDefinition(); + } else if (auto PD = dyn_cast(D)) { + Definition = PD->getDefinition(); + } else if (auto TD = dyn_cast(D)) { + Definition = TD->getDefinition(); + } + if (Definition) + D = Definition; + if (auto *attr = D->getAttr()) return attr; if (auto *dcd = dyn_cast(D->getDeclContext())) { Index: lib/Index/USRGeneration.cpp =================================================================== --- lib/Index/USRGeneration.cpp +++ lib/Index/USRGeneration.cpp @@ -49,6 +49,18 @@ static StringRef GetExternalSourceContainer(const NamedDecl *D) { if (!D) return StringRef(); + + const NamedDecl *Definition = nullptr; + if (auto ID = dyn_cast(D)) { + Definition = ID->getDefinition(); + } else if (auto PD = dyn_cast(D)) { + Definition = PD->getDefinition(); + } else if (auto TD = dyn_cast(D)) { + Definition = TD->getDefinition(); + } + if (Definition) + D = Definition; + if (auto *attr = D->getAttr()) { return attr->getDefinedIn(); } Index: test/Index/Core/external-source-symbol-attr.m =================================================================== --- test/Index/Core/external-source-symbol-attr.m +++ test/Index/Core/external-source-symbol-attr.m @@ -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