Skip to content

Commit bd07973

Browse files
authored
Merge pull request #39456 from apple/sg-optional-requirement
[SymbolGraph] Determine optional requirement by presence of OptionalAttr
2 parents 2c4f360 + 6aa3e0f commit bd07973

File tree

3 files changed

+45
-15
lines changed

3 files changed

+45
-15
lines changed

lib/SymbolGraphGen/SymbolGraph.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -431,16 +431,11 @@ SymbolGraph::recordRequirementRelationships(Symbol S) {
431431
void SymbolGraph::recordOptionalRequirementRelationships(Symbol S) {
432432
const auto VD = S.getSymbolDecl();
433433
if (const auto *Protocol = dyn_cast<ProtocolDecl>(VD->getDeclContext())) {
434-
if (VD->isProtocolRequirement()) {
435-
if (const auto *ClangDecl = VD->getClangDecl()) {
436-
if (const auto *Method = dyn_cast<clang::ObjCMethodDecl>(ClangDecl)) {
437-
if (Method->isOptional()) {
438-
recordEdge(Symbol(this, VD, nullptr),
439-
Symbol(this, Protocol, nullptr),
440-
RelationshipKind::OptionalRequirementOf());
441-
}
442-
}
443-
}
434+
if (VD->isProtocolRequirement() &&
435+
VD->getAttrs().hasAttribute<OptionalAttr>()) {
436+
recordEdge(Symbol(this, VD, nullptr),
437+
Symbol(this, Protocol, nullptr),
438+
RelationshipKind::OptionalRequirementOf());
444439
}
445440
}
446441
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// REQUIRES: objc_interop
2+
3+
// RUN: %empty-directory(%t)
4+
// RUN: mkdir -p %t/frameworks/OptionalRequirementOf.framework/Modules/OptionalRequirementOf.swiftmodule
5+
// RUN: split-file %s %t
6+
7+
// RUN: %target-build-swift %t/reqs.swift -module-name OptionalRequirementOf -emit-module-path %t/frameworks/OptionalRequirementOf.framework/Modules/OptionalRequirementOf.swiftmodule/%target-swiftmodule-name -import-underlying-module -F %t/frameworks -Xfrontend -disable-objc-attr-requires-foundation-module
8+
// RUN: %target-swift-symbolgraph-extract -module-name OptionalRequirementOf -F %t/frameworks -pretty-print -output-dir %t
9+
// RUN: %FileCheck %s --input-file %t/OptionalRequirementOf.symbols.json
10+
11+
// ObjCProto.objcReq -> ObjCProto
12+
// CHECK-DAG: "kind": "requirementOf",{{[[:space:]]*}}"source": "c:@M@OptionalRequirementOf@objc(pl)SwiftProto(im)swiftReq",{{[[:space:]]*}}"target": "c:@M@OptionalRequirementOf@objc(pl)SwiftProto"
13+
// CHECK-DAG: "kind": "optionalRequirementOf",{{[[:space:]]*}}"source": "c:@M@OptionalRequirementOf@objc(pl)SwiftProto(im)swiftReq",{{[[:space:]]*}}"target": "c:@M@OptionalRequirementOf@objc(pl)SwiftProto"
14+
15+
// SwiftProto.swiftReq -> SwiftProto
16+
// CHECK-DAG: "kind": "requirementOf",{{[[:space:]]*}}"source": "c:objc(pl)ObjCProto(im)objcReq",{{[[:space:]]*}}"target": "c:objc(pl)ObjCProto"
17+
// CHECK-DAG: "kind": "optionalRequirementOf",{{[[:space:]]*}}"source": "c:objc(pl)ObjCProto(im)objcReq",{{[[:space:]]*}}"target": "c:objc(pl)ObjCProto"
18+
19+
//--- reqs.swift
20+
@objc
21+
public protocol SwiftProto {
22+
@objc optional func swiftReq()
23+
}
24+
25+
//--- frameworks/OptionalRequirementOf.framework/module.map
26+
framework module OptionalRequirementOf {
27+
header "req.h"
28+
export *
29+
}
30+
31+
//--- frameworks/OptionalRequirementOf.framework/Headers/req.h
32+
@protocol ObjCProto
33+
@optional
34+
- (void)objcReq;
35+
@end
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
// RUN: %empty-directory(%t)
2-
// RUN: %target-build-swift %s -module-name ConformsTo -emit-module -emit-module-path %t/
3-
// RUN: %target-swift-symbolgraph-extract -module-name ConformsTo -I %t -pretty-print -output-dir %t
4-
// RUN: %FileCheck %s --input-file %t/ConformsTo.symbols.json
2+
// RUN: %target-build-swift %s -module-name RequirementOf -emit-module -emit-module-path %t/
3+
// RUN: %target-swift-symbolgraph-extract -module-name RequirementOf -I %t -pretty-print -output-dir %t
4+
// RUN: %FileCheck %s --input-file %t/RequirementOf.symbols.json
55

66
public protocol P {
77
var x: Int { get }
88
}
99

1010
// CHECK: "kind": "requirementOf"
11-
// CHECK-NEXT: "source": "s:10ConformsTo1PP1xSivp"
12-
// CHECK-NEXT: "target": "s:10ConformsTo1PP"
11+
// CHECK-NEXT: "source": "s:13RequirementOf1PP1xSivp"
12+
// CHECK-NEXT: "target": "s:13RequirementOf1PP"
1313
// CHECK-NOT: defaultImplementationOf

0 commit comments

Comments
 (0)