bool ide::printDeclUSR(const ValueDecl *D, raw_ostream &OS) { if (!D->hasName() && !isa<ParamDecl>(D) && !isa<AccessorDecl>(D)) return true; // Ignore. if (D->getModuleContext()->isBuiltinModule()) return true; // Ignore. if (isa<ModuleDecl>(D)) return true; // Ignore. auto interpretAsClangNode = [](const ValueDecl *D)->ClangNode { ClangNode ClangN = D->getClangNode(); if (auto ClangD = ClangN.getAsDecl()) { // NSErrorDomain causes the clang enum to be imported like this: // // struct MyError { // enum Code : Int32 { // case errFirst // case errSecond // } // static var errFirst: MyError.Code { get } // static var errSecond: MyError.Code { get } // } // // The clang enum constants are associated with both the static vars and // the enum cases. // But we want unique USRs for the above symbols, so use the clang USR // for the enum cases, and the Swift USR for the vars. // if (auto *ClangEnumConst = dyn_cast<clang::EnumConstantDecl>(ClangD)) { if (auto *ClangEnum = dyn_cast<clang::EnumDecl>(ClangEnumConst->getDeclContext())) { if (ClangEnum->hasAttr<clang::NSErrorDomainAttr>() && isa<VarDecl>(D)) return ClangNode(); } } } return ClangN; }; if (ClangNode ClangN = interpretAsClangNode(D)) { llvm::SmallString<128> Buf; if (auto ClangD = ClangN.getAsDecl()) { bool Ignore = clang::index::generateUSRForDecl(ClangD, Buf); if (!Ignore) OS << Buf.str(); return Ignore; } auto &Importer = *D->getASTContext().getClangModuleLoader(); auto ClangMacroInfo = ClangN.getAsMacro(); bool Ignore = clang::index::generateUSRForMacro( D->getBaseName().getIdentifier().str(), ClangMacroInfo->getDefinitionLoc(), Importer.getClangASTContext().getSourceManager(), Buf); if (!Ignore) OS << Buf.str(); return Ignore; } if (shouldUseObjCUSR(D)) { return printObjCUSR(D, OS); } if (!D->hasInterfaceType()) return true; // Invalid code. if (D->getInterfaceType().findIf([](Type t) -> bool { return t->is<ModuleType>(); })) return true; Mangle::ASTMangler NewMangler; std::string Mangled = NewMangler.mangleDeclAsUSR(D, getUSRSpacePrefix()); OS << Mangled; return false; }