Skip to content

Commit 0bc3fd3

Browse files
committed
TBDGen: Introduce SymbolSource::getDecl() and adopt it.
By adopting this new utility, swift-api-extract more reliably gets the ValueDecl associated with a symbol and therefore reports more accurate availability info.
1 parent 0c130ee commit 0bc3fd3

File tree

5 files changed

+45
-23
lines changed

5 files changed

+45
-23
lines changed

include/swift/AST/TBDGenRequests.h

+20
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,26 @@ class SymbolSource {
222222
return irEntity;
223223
}
224224

225+
/// Returns the associated decl.
226+
const ValueDecl *getDecl() const {
227+
switch (kind) {
228+
case Kind::SIL: {
229+
if (silDeclRef.hasDecl())
230+
return silDeclRef.getDecl();
231+
return nullptr;
232+
}
233+
case Kind::Global:
234+
return Global;
235+
case Kind::IR:
236+
if (irEntity.hasDecl())
237+
return irEntity.getDecl();
238+
return nullptr;
239+
case Kind::LinkerDirective:
240+
case Kind::Unknown:
241+
return nullptr;
242+
}
243+
}
244+
225245
/// Typecheck the entity wrapped by this `SymbolSource`
226246
void typecheck() const {
227247
switch (kind) {

lib/IRGen/TBDGen.cpp

+5-13
Original file line numberDiff line numberDiff line change
@@ -674,19 +674,11 @@ class APIGenRecorder final : public APIRecorder {
674674

675675
apigen::APIAvailability availability;
676676
auto access = apigen::APIAccess::Public;
677-
if (source.kind == SymbolSource::Kind::SIL) {
678-
auto ref = source.getSILDeclRef();
679-
if (ref.hasDecl()) {
680-
availability = getAvailability(ref.getDecl());
681-
if (isSPI(ref.getDecl()))
682-
access = apigen::APIAccess::Private;
683-
}
684-
} else if (source.kind == SymbolSource::Kind::IR) {
685-
auto ref = source.getIRLinkEntity();
686-
if (ref.hasDecl()) {
687-
if (isSPI(ref.getDecl()))
688-
access = apigen::APIAccess::Private;
689-
}
677+
auto decl = source.getDecl();
678+
if (decl) {
679+
availability = getAvailability(decl);
680+
if (isSPI(decl))
681+
access = apigen::APIAccess::Private;
690682
}
691683

692684
api.addSymbol(symbol, moduleLoc, apigen::APILinkage::Exported,

test/APIJSON/apigen.swift

+10-5
Original file line numberDiff line numberDiff line change
@@ -146,19 +146,22 @@ public var myGlobalVar: Int = 42
146146
// CHECK-NEXT: "name": "_$s8MyModule4TestCMn",
147147
// CHECK-NEXT: "access": "public",
148148
// CHECK-NEXT: "file": "/@input/MyModule.swiftinterface",
149-
// CHECK-NEXT: "linkage": "exported"
149+
// CHECK-NEXT: "linkage": "exported",
150+
// CHECK-NEXT: "introduced": "10.13"
150151
// CHECK-NEXT: },
151152
// CHECK-NEXT: {
152153
// CHECK-NEXT: "name": "_$s8MyModule4TestCMo",
153154
// CHECK-NEXT: "access": "public",
154155
// CHECK-NEXT: "file": "/@input/MyModule.swiftinterface",
155-
// CHECK-NEXT: "linkage": "exported"
156+
// CHECK-NEXT: "linkage": "exported",
157+
// CHECK-NEXT: "introduced": "10.13"
156158
// CHECK-NEXT: },
157159
// CHECK-NEXT: {
158160
// CHECK-NEXT: "name": "_$s8MyModule4TestCMu",
159161
// CHECK-NEXT: "access": "public",
160162
// CHECK-NEXT: "file": "/@input/MyModule.swiftinterface",
161-
// CHECK-NEXT: "linkage": "exported"
163+
// CHECK-NEXT: "linkage": "exported",
164+
// CHECK-NEXT: "introduced": "10.13"
162165
// CHECK-NEXT: },
163166
// CHECK-NEXT: {
164167
// CHECK-NEXT: "name": "_$s8MyModule4TestCN",
@@ -320,13 +323,15 @@ public var myGlobalVar: Int = 42
320323
// CHECK-NEXT: "name": "_$s8MyModule7DerivedCMn",
321324
// CHECK-NEXT: "access": "public",
322325
// CHECK-NEXT: "file": "/@input/MyModule.swiftinterface",
323-
// CHECK-NEXT: "linkage": "exported"
326+
// CHECK-NEXT: "linkage": "exported",
327+
// CHECK-NEXT: "introduced": "10.13"
324328
// CHECK-NEXT: },
325329
// CHECK-NEXT: {
326330
// CHECK-NEXT: "name": "_$s8MyModule7DerivedCMo",
327331
// CHECK-NEXT: "access": "public",
328332
// CHECK-NEXT: "file": "/@input/MyModule.swiftinterface",
329-
// CHECK-NEXT: "linkage": "exported"
333+
// CHECK-NEXT: "linkage": "exported",
334+
// CHECK-NEXT: "introduced": "10.13"
330335
// CHECK-NEXT: },
331336
// CHECK-NEXT: {
332337
// CHECK-NEXT: "name": "_$s8MyModule7DerivedCN",

test/APIJSON/spi.swift

+8-4
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@ public func spiAvailableFunc() {}
3333
// CHECK-NEXT: "name": "_$s8MyModule0A6Class2C18spiAvailableMethodyyFTj",
3434
// CHECK-NEXT: "access": "public",
3535
// CHECK-NEXT: "file": "/@input/MyModule.swiftinterface",
36-
// CHECK-NEXT: "linkage": "exported"
36+
// CHECK-NEXT: "linkage": "exported",
37+
// CHECK-NEXT: "unavailable": true
3738
// CHECK-NEXT: },
3839
// CHECK-NEXT: {
3940
// CHECK-NEXT: "name": "_$s8MyModule0A6Class2C18spiAvailableMethodyyFTq",
4041
// CHECK-NEXT: "access": "public",
4142
// CHECK-NEXT: "file": "/@input/MyModule.swiftinterface",
42-
// CHECK-NEXT: "linkage": "exported"
43+
// CHECK-NEXT: "linkage": "exported",
44+
// CHECK-NEXT: "unavailable": true
4345
// CHECK-NEXT: },
4446
// CHECK-NEXT: {
4547
// CHECK-NEXT: "name": "_$s8MyModule0A6Class2CACycfC",
@@ -191,13 +193,15 @@ public func spiAvailableFunc() {}
191193
// CHECK-SPI-NEXT: "name": "_$s8MyModule0A6Class2C18spiAvailableMethodyyFTj",
192194
// CHECK-SPI-NEXT: "access": "private",
193195
// CHECK-SPI-NEXT: "file": "/@input/MyModule.swiftmodule",
194-
// CHECK-SPI-NEXT: "linkage": "exported"
196+
// CHECK-SPI-NEXT: "linkage": "exported",
197+
// CHECK-SPI-NEXT: "introduced": "10.10"
195198
// CHECK-SPI-NEXT: },
196199
// CHECK-SPI-NEXT: {
197200
// CHECK-SPI-NEXT: "name": "_$s8MyModule0A6Class2C18spiAvailableMethodyyFTq",
198201
// CHECK-SPI-NEXT: "access": "private",
199202
// CHECK-SPI-NEXT: "file": "/@input/MyModule.swiftmodule",
200-
// CHECK-SPI-NEXT: "linkage": "exported"
203+
// CHECK-SPI-NEXT: "linkage": "exported",
204+
// CHECK-SPI-NEXT: "introduced": "10.10"
201205
// CHECK-SPI-NEXT: },
202206
// CHECK-SPI-NEXT: {
203207
// CHECK-SPI-NEXT: "name": "_$s8MyModule0A6Class2C9spiMethodyyFTj",

test/APIJSON/struct.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public struct TestStruct {
3939
// CHECK-NEXT: "name": "_$s8MyModule10TestStructVMn",
4040
// CHECK-NEXT: "access": "public",
4141
// CHECK-NEXT: "file": "/@input/MyModule.swiftinterface",
42-
// CHECK-NEXT: "linkage": "exported"
42+
// CHECK-NEXT: "linkage": "exported",
43+
// CHECK-NEXT: "introduced": "10.13"
4344
// CHECK-NEXT: },
4445
// CHECK-NEXT: {
4546
// CHECK-NEXT: "name": "_$s8MyModule10TestStructVN",

0 commit comments

Comments
 (0)