Skip to content

Allow for emission of swift.extension symbols for extensions to external types in SymbolGraphGen #59047

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions include/swift/Option/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -1351,6 +1351,11 @@ def pretty_print: Flag<["-"], "pretty-print">,
Flags<[SwiftAPIExtractOption, SwiftSymbolGraphExtractOption]>,
HelpText<"Pretty-print the output JSON">;

def emit_extension_block_symbols: Flag<["-"], "emit-extension-block-symbols">,
Flags<[SwiftSymbolGraphExtractOption, FrontendOption,
NoInteractiveOption, SupplementaryOutput, HelpHidden]>,
HelpText<"Emit 'swift.extension' symbols for extensions to external types instead of directly associating members and conformances with the extended nominal when generating symbol graphs">;

// swift-symbolgraph-extract-only options
def output_dir : Separate<["-"], "output-dir">,
Flags<[NoDriverOption, SwiftSymbolGraphExtractOption, SwiftAPIDigesterOption,
Expand Down
5 changes: 5 additions & 0 deletions include/swift/SymbolGraphGen/SymbolGraphOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ struct SymbolGraphOptions {

/// Whether to include documentation for clang nodes or not.
bool IncludeClangDocs = false;

/// Whether to emit "swift.extension" symbols for extensions to external types
/// along with "extensionTo" relationships instead of directly associating
/// members and conformances with the extended nominal.
bool EmitExtensionBlockSymbols = false;
};

} // end namespace symbolgraphgen
Expand Down
2 changes: 2 additions & 0 deletions lib/Driver/ToolChains.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -616,6 +616,7 @@ ToolChain::constructInvocation(const CompileJobAction &job,
context.Args.AddLastArg(Arguments, options::OPT_emit_symbol_graph_dir);
}
context.Args.AddLastArg(Arguments, options::OPT_include_spi_symbols);
context.Args.AddLastArg(Arguments, options::OPT_emit_extension_block_symbols);
context.Args.AddLastArg(Arguments, options::OPT_symbol_graph_minimum_access_level);

return II;
Expand Down Expand Up @@ -1112,6 +1113,7 @@ ToolChain::constructInvocation(const MergeModuleJobAction &job,
context.Args.AddLastArg(Arguments, options::OPT_emit_symbol_graph);
context.Args.AddLastArg(Arguments, options::OPT_emit_symbol_graph_dir);
context.Args.AddLastArg(Arguments, options::OPT_include_spi_symbols);
context.Args.AddLastArg(Arguments, options::OPT_emit_extension_block_symbols);
context.Args.AddLastArg(Arguments, options::OPT_symbol_graph_minimum_access_level);

context.Args.AddLastArg(Arguments, options::OPT_import_objc_header);
Expand Down
1 change: 1 addition & 0 deletions lib/DriverTool/swift_symbolgraph_extract_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ int swift_symbolgraph_extract_main(ArrayRef<const char *> Args,
ParsedArgs.hasArg(OPT_skip_inherited_docs),
ParsedArgs.hasArg(OPT_include_spi_symbols),
/*IncludeClangDocs=*/false,
ParsedArgs.hasArg(OPT_emit_extension_block_symbols),
};

if (auto *A = ParsedArgs.getLastArg(OPT_minimum_access_level)) {
Expand Down
2 changes: 2 additions & 0 deletions lib/Frontend/CompilerInvocation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1284,6 +1284,8 @@ static void ParseSymbolGraphArgs(symbolgraphgen::SymbolGraphOptions &Opts,

Opts.SkipInheritedDocs = Args.hasArg(OPT_skip_inherited_docs);
Opts.IncludeSPISymbols = Args.hasArg(OPT_include_spi_symbols);
Opts.EmitExtensionBlockSymbols =
Args.hasArg(OPT_emit_extension_block_symbols);

if (auto *A = Args.getLastArg(OPT_symbol_graph_minimum_access_level)) {
Opts.MinimumAccessLevel =
Expand Down
15 changes: 14 additions & 1 deletion lib/SymbolGraphGen/Edge.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,20 @@ struct RelationshipKind {
static inline RelationshipKind OptionalRequirementOf() {
return RelationshipKind { "optionalRequirementOf" };
}


/**
A symbol A extends a symbol B with members or conformances.

This relationship describes the connection between extension blocks
(swift.extension symbols) and the type they extend.

The implied inverse of this relationship is a symbol B that is extended
by an extension block symbol A.
*/
static inline RelationshipKind ExtensionTo() {
return RelationshipKind{"extensionTo"};
}

bool operator==(const RelationshipKind &Other) const {
return Name == Other.Name;
}
Expand Down
4 changes: 2 additions & 2 deletions lib/SymbolGraphGen/FormatVersion.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#define SWIFT_SYMBOLGRAPHGEN_FORMATVERSION_H

#define SWIFT_SYMBOLGRAPH_FORMAT_MAJOR 0
#define SWIFT_SYMBOLGRAPH_FORMAT_MINOR 5
#define SWIFT_SYMBOLGRAPH_FORMAT_PATCH 3
#define SWIFT_SYMBOLGRAPH_FORMAT_MINOR 6
#define SWIFT_SYMBOLGRAPH_FORMAT_PATCH 0

#endif // SWIFT_SYMBOLGRAPHGEN_FORMATVERSION_H
5 changes: 4 additions & 1 deletion lib/SymbolGraphGen/JSON.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
// Adds Symbol Graph JSON serialization to other types.
//===----------------------------------------------------------------------===//

#include "JSON.h"
#include "Symbol.h"
#include "swift/AST/ASTContext.h"
#include "swift/AST/Decl.h"
#include "swift/AST/FileUnit.h"
Expand All @@ -21,7 +23,6 @@
#include "swift/AST/USRGeneration.h"
#include "swift/ClangImporter/ClangModule.h"
#include "swift/Serialization/SerializedModuleLoader.h"
#include "JSON.h"

void swift::symbolgraphgen::serialize(const llvm::VersionTuple &VT,
llvm::json::OStream &OS) {
Expand Down Expand Up @@ -69,6 +70,8 @@ void swift::symbolgraphgen::serialize(const ExtensionDecl *Extension,
if (const auto *ExtendedModule = ExtendedNominal->getModuleContext()) {
OS.attribute("extendedModule", ExtendedModule->getNameStr());
}

OS.attribute("typeKind", Symbol::getKind(ExtendedNominal).first);
}

SmallVector<Requirement, 4> FilteredRequirements;
Expand Down
Loading