Skip to content

[clang][ExtractAPI] Remove symbols defined in categories to external types unless requested #92522

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
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
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ class SymbolGraphSerializer : public APISetVisitor<SymbolGraphSerializer> {

const bool EmitSymbolLabelsForTesting = false;

const bool SkipSymbolsInCategoriesToExternalTypes = false;

/// The object instantiated by the last call to serializeAPIRecord.
Object *CurrentSymbol = nullptr;

Expand Down Expand Up @@ -271,10 +273,13 @@ class SymbolGraphSerializer : public APISetVisitor<SymbolGraphSerializer> {

SymbolGraphSerializer(const APISet &API, const APIIgnoresList &IgnoresList,
bool EmitSymbolLabelsForTesting = false,
bool ForceEmitToMainModule = false)
bool ForceEmitToMainModule = false,
bool SkipSymbolsInCategoriesToExternalTypes = false)
: Base(API), ForceEmitToMainModule(ForceEmitToMainModule),
IgnoresList(IgnoresList),
EmitSymbolLabelsForTesting(EmitSymbolLabelsForTesting) {}
EmitSymbolLabelsForTesting(EmitSymbolLabelsForTesting),
SkipSymbolsInCategoriesToExternalTypes(
SkipSymbolsInCategoriesToExternalTypes) {}
};

} // namespace extractapi
Expand Down
11 changes: 9 additions & 2 deletions clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -925,6 +925,10 @@ bool SymbolGraphSerializer::visitObjCInterfaceRecord(

bool SymbolGraphSerializer::traverseObjCCategoryRecord(
const ObjCCategoryRecord *Record) {
if (SkipSymbolsInCategoriesToExternalTypes &&
!API.findRecordForUSR(Record->Interface.USR))
return true;

auto *CurrentModule = ModuleForCurrentSymbol;
if (Record->isExtendingExternalModule())
ModuleForCurrentSymbol = &ExtendedModules[Record->Interface.Source];
Expand Down Expand Up @@ -1040,8 +1044,11 @@ void SymbolGraphSerializer::serializeGraphToStream(
void SymbolGraphSerializer::serializeMainSymbolGraph(
raw_ostream &OS, const APISet &API, const APIIgnoresList &IgnoresList,
SymbolGraphSerializerOption Options) {
SymbolGraphSerializer Serializer(API, IgnoresList,
Options.EmitSymbolLabelsForTesting);
SymbolGraphSerializer Serializer(
API, IgnoresList, Options.EmitSymbolLabelsForTesting,
/*ForceEmitToMainModule=*/true,
/*SkipSymbolsInCategoriesToExternalTypes=*/true);

Serializer.traverseAPISet();
Serializer.serializeGraphToStream(OS, Options, API.ProductName,
std::move(Serializer.MainModule));
Expand Down
18 changes: 13 additions & 5 deletions clang/test/ExtractAPI/objc_external_category.m
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
// RUN: --emit-extension-symbol-graphs --symbol-graph-dir=%t/symbols \
// RUN: --product-name=Module -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules-cache \
// RUN: -triple arm64-apple-macosx -x objective-c-header %t/input.h -verify
// RUN: %clang_cc1 -extract-api --pretty-sgf --emit-sgf-symbol-labels-for-testing \
// RUN: --product-name=Module -o %t/ModuleNoExt.symbols.json -triple arm64-apple-macosx \
// RUN: -x objective-c-header %t/input.h

//--- input.h
#include "ExternalModule.h"
Expand All @@ -28,15 +31,20 @@ @interface ExtInterface
header "ExternalModule.h"
}

// Main symbol graph from the build with extension SGFs
// RUN: FileCheck %s --input-file %t/symbols/Module.symbols.json --check-prefix MOD

// MOD-NOT: "!testRelLabel": "memberOf $ c:objc(cs)ExtInterface(py)Property $ c:objc(cs)ExtInterface"
// MOD-NOT: "!testRelLabel": "memberOf $ c:objc(cs)ExtInterface(im)InstanceMethod $ c:objc(cs)ExtInterface"
// MOD-NOT: "!testRelLabel": "memberOf $ c:objc(cs)ExtInterface(cm)ClassMethod $ c:objc(cs)ExtInterface"
// MOD-NOT: "!testLabel": "c:objc(cs)ExtInterface(py)Property"
// MOD-NOT: "!testLabel": "c:objc(cs)ExtInterface(im)InstanceMethod"
// MOD-NOT: "!testLabel": "c:objc(cs)ExtInterface(cm)ClassMethod"
// MOD-NOT: "!testLabel": "c:objc(cs)ExtInterface"
// MOD-DAG: "!testLabel": "c:objc(cs)ModInterface"
// MOD-NOT: "c:objc(cs)ExtInterface(py)Property"
// MOD-NOT: "c:objc(cs)ExtInterface(im)InstanceMethod"
// MOD-NOT: "c:objc(cs)ExtInterface(cm)ClassMethod"
// MOD-NOT: "c:objc(cs)ExtInterface"
// MOD-DAG: "c:objc(cs)ModInterface"

// Symbol graph from the build without extension SGFs should be identical to main symbol graph with extension SGFs
// RUN: diff %t/symbols/Module.symbols.json %t/ModuleNoExt.symbols.json

// RUN: FileCheck %s --input-file %t/symbols/[email protected] --check-prefix EXT
// EXT-DAG: "!testRelLabel": "memberOf $ c:objc(cs)ExtInterface(py)Property $ c:objc(cs)ExtInterface"
Expand Down
Loading