[SymbolGraph] Don't link type identifier fragments to private symbols

These links will never resolve because the symbols are never emitted
in the first place.

rdar://64178490
This commit is contained in:
Ashley Garland
2020-08-07 12:31:16 -07:00
parent c6cd4b07b2
commit ecf8d556e5
4 changed files with 31 additions and 7 deletions

View File

@@ -138,7 +138,15 @@ void DeclarationFragmentPrinter::printTypeRef(Type T, const TypeDecl *RefTo,
openFragment(FragmentKind::TypeIdentifier); openFragment(FragmentKind::TypeIdentifier);
printText(Name.str()); printText(Name.str());
USR.clear(); USR.clear();
if (Name.str() != "Self") {
auto ShouldLink = Name.str() != "Self";
if (const auto *TD = T->getAnyNominal()) {
if (SG->isImplicitlyPrivate(TD)) {
ShouldLink = false;
}
}
if (ShouldLink) {
llvm::raw_svector_ostream OS(USR); llvm::raw_svector_ostream OS(USR);
ide::printDeclUSR(RefTo, OS); ide::printDeclUSR(RefTo, OS);
} }

View File

@@ -59,6 +59,9 @@ public:
Text, Text,
}; };
private: private:
/// The symbol graph for which a declaration is being printed.
const SymbolGraph *SG;
/// The output stream to print fragment objects to. /// The output stream to print fragment objects to.
llvm::json::OStream &OS; llvm::json::OStream &OS;
@@ -81,9 +84,11 @@ private:
unsigned NumFragments; unsigned NumFragments;
public: public:
DeclarationFragmentPrinter(llvm::json::OStream &OS, DeclarationFragmentPrinter(const SymbolGraph *SG,
llvm::json::OStream &OS,
Optional<StringRef> Key = None) Optional<StringRef> Key = None)
: OS(OS), : SG(SG),
OS(OS),
Kind(FragmentKind::None), Kind(FragmentKind::None),
NumFragments(0) { NumFragments(0) {
if (Key) { if (Key) {

View File

@@ -558,7 +558,7 @@ void
SymbolGraph::serializeDeclarationFragments(StringRef Key, SymbolGraph::serializeDeclarationFragments(StringRef Key,
const Symbol &S, const Symbol &S,
llvm::json::OStream &OS) { llvm::json::OStream &OS) {
DeclarationFragmentPrinter Printer(OS, Key); DeclarationFragmentPrinter Printer(this, OS, Key);
auto Options = getDeclarationFragmentsPrintOptions(); auto Options = getDeclarationFragmentsPrintOptions();
if (S.getSynthesizedBaseType()) { if (S.getSynthesizedBaseType()) {
Options.setBaseType(S.getSynthesizedBaseType()); Options.setBaseType(S.getSynthesizedBaseType());
@@ -570,7 +570,7 @@ void
SymbolGraph::serializeNavigatorDeclarationFragments(StringRef Key, SymbolGraph::serializeNavigatorDeclarationFragments(StringRef Key,
const Symbol &S, const Symbol &S,
llvm::json::OStream &OS) { llvm::json::OStream &OS) {
DeclarationFragmentPrinter Printer(OS, Key); DeclarationFragmentPrinter Printer(this, OS, Key);
if (const auto *TD = dyn_cast<GenericTypeDecl>(S.getSymbolDecl())) { if (const auto *TD = dyn_cast<GenericTypeDecl>(S.getSymbolDecl())) {
Printer.printAbridgedType(TD, /*PrintKeyword=*/false); Printer.printAbridgedType(TD, /*PrintKeyword=*/false);
@@ -587,7 +587,7 @@ void
SymbolGraph::serializeSubheadingDeclarationFragments(StringRef Key, SymbolGraph::serializeSubheadingDeclarationFragments(StringRef Key,
const Symbol &S, const Symbol &S,
llvm::json::OStream &OS) { llvm::json::OStream &OS) {
DeclarationFragmentPrinter Printer(OS, Key); DeclarationFragmentPrinter Printer(this, OS, Key);
if (const auto *TD = dyn_cast<GenericTypeDecl>(S.getSymbolDecl())) { if (const auto *TD = dyn_cast<GenericTypeDecl>(S.getSymbolDecl())) {
Printer.printAbridgedType(TD, /*PrintKeyword=*/true); Printer.printAbridgedType(TD, /*PrintKeyword=*/true);
@@ -603,7 +603,7 @@ SymbolGraph::serializeSubheadingDeclarationFragments(StringRef Key,
void void
SymbolGraph::serializeDeclarationFragments(StringRef Key, Type T, SymbolGraph::serializeDeclarationFragments(StringRef Key, Type T,
llvm::json::OStream &OS) { llvm::json::OStream &OS) {
DeclarationFragmentPrinter Printer(OS, Key); DeclarationFragmentPrinter Printer(this, OS, Key);
T->print(Printer, getDeclarationFragmentsPrintOptions()); T->print(Printer, getDeclarationFragmentsPrintOptions());
} }

View File

@@ -0,0 +1,11 @@
// RUN: %empty-directory(%t)
// RUN: %target-build-swift %s -module-name UnderscoreNotLinked -emit-module -emit-module-path %t/
// RUN: %target-swift-symbolgraph-extract -module-name UnderscoreNotLinked -I %t -pretty-print -output-dir %t
// RUN: %FileCheck %s --input-file %t/UnderscoreNotLinked.symbols.json
public protocol _ShouldntBeLinked {}
public protocol ShouldBeLinked : _ShouldntBeLinked {}
public struct MyStruct : ShouldBeLinked {}
// CHECK: "spelling": "_ShouldntBeLinked"
// CHECK-NOT: "preciseIdentifier": "s:19UnderscoreNotLinked011_ShouldntBeC0P"