Skip to content

Commit c669004

Browse files
committed
[ASTGen] Clone expanded AvailabilitySpec to set macro location
1 parent 0a56198 commit c669004

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

include/swift/AST/ASTBridging.h

+9
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,15 @@ BridgedAvailabilitySpec BridgedAvailabilitySpec_createForDomainIdentifier(
735735
BridgedASTContext cContext, BridgedIdentifier cName, BridgedSourceLoc cLoc,
736736
BridgedVersionTuple cVersion, BridgedSourceRange cVersionRange);
737737

738+
SWIFT_NAME("BridgedAvailabilitySpec.clone(self:_:)")
739+
BridgedAvailabilitySpec
740+
BridgedAvailabilitySpec_clone(BridgedAvailabilitySpec spec,
741+
BridgedASTContext cContext);
742+
743+
SWIFT_NAME("BridgedAvailabilitySpec.setMacroLoc(self:_:)")
744+
void BridgedAvailabilitySpec_setMacroLoc(BridgedAvailabilitySpec spec,
745+
BridgedSourceLoc cLoc);
746+
738747
SWIFT_NAME("getter:BridgedAvailabilitySpec.domainOrIdentifier(self:)")
739748
BridgedAvailabilityDomainOrIdentifier
740749
BridgedAvailabilitySpec_getDomainOrIdentifier(BridgedAvailabilitySpec spec);

lib/AST/Bridging/AvailabilityBridging.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,17 @@ BridgedAvailabilitySpec BridgedAvailabilitySpec_createForDomainIdentifier(
9494
cVersion.unbridged(), cVersionRange.unbridged());
9595
}
9696

97+
BridgedAvailabilitySpec
98+
BridgedAvailabilitySpec_clone(BridgedAvailabilitySpec spec,
99+
BridgedASTContext cContext) {
100+
return spec.unbridged()->clone(cContext.unbridged());
101+
}
102+
103+
void BridgedAvailabilitySpec_setMacroLoc(BridgedAvailabilitySpec spec,
104+
BridgedSourceLoc cLoc) {
105+
spec.unbridged()->setMacroLoc(cLoc.unbridged());
106+
}
107+
97108
BridgedAvailabilityDomainOrIdentifier
98109
BridgedAvailabilitySpec_getDomainOrIdentifier(BridgedAvailabilitySpec spec) {
99110
return spec.unbridged()->getDomainOrIdentifier();

lib/ASTGen/Sources/ASTGen/Availability.swift

+9-2
Original file line numberDiff line numberDiff line change
@@ -309,10 +309,15 @@ extension ASTGenVisitor {
309309
version: version?.bridged ?? BridgedVersionTuple()
310310
)
311311
if !expanded.isEmpty {
312+
let macroLoc = self.generateSourceLoc(domainNode)
312313
expanded.withElements(ofType: UnsafeRawPointer.self) { buffer in
313314
for ptr in buffer {
314-
// TODO: Clone and spec.setMacroLoc().
315-
result.append(BridgedAvailabilitySpec(raw: UnsafeMutableRawPointer(mutating: ptr)))
315+
// Make a copy of the specs to add the macro source location
316+
// for the diagnostic about the use of macros in inlinable code.
317+
let spec = BridgedAvailabilitySpec(raw: UnsafeMutableRawPointer(mutating: ptr))
318+
.clone(self.ctx)
319+
spec.setMacroLoc(macroLoc)
320+
result.append(spec)
316321
}
317322
}
318323
return
@@ -325,6 +330,8 @@ extension ASTGenVisitor {
325330
// TODO: Diagnostics.
326331
fatalError("expected version")
327332
}
333+
// FIXME: Wasting ASTContext memory.
334+
// 'AvailabilitySpec' is 'ASTAllocated' but created spec is ephemeral in context of `@available` attributes.
328335
let spec = BridgedAvailabilitySpec.createForDomainIdentifier(
329336
self.ctx,
330337
name: platform.identifier,

0 commit comments

Comments
 (0)