Skip to content

Commit 0fbf660

Browse files
Merge pull request #81399 from hnrklssn/swiftify-anonymous-params-rel
Swiftify anonymous params rel
2 parents c44f7fd + f9e8041 commit 0fbf660

File tree

4 files changed

+72
-6
lines changed

4 files changed

+72
-6
lines changed

lib/Macros/Sources/SwiftMacros/SwiftifyImportMacro.swift

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,19 @@ protocol ParamInfo: CustomStringConvertible {
4545
) -> BoundsCheckedThunkBuilder
4646
}
4747

48+
func getParamName(_ param: FunctionParameterSyntax, _ paramIndex: Int) -> TokenSyntax {
49+
let name = param.secondName ?? param.firstName
50+
if name.trimmed.text == "_" {
51+
return "_param\(raw: paramIndex)"
52+
}
53+
return name
54+
}
55+
4856
func tryGetParamName(_ funcDecl: FunctionDeclSyntax, _ expr: SwiftifyExpr) -> TokenSyntax? {
4957
switch expr {
5058
case .param(let i):
5159
let funcParam = getParam(funcDecl, i - 1)
52-
return funcParam.secondName ?? funcParam.firstName
60+
return getParamName(funcParam, i - 1)
5361
case .`self`:
5462
return .keyword(.self)
5563
default: return nil
@@ -419,7 +427,12 @@ struct FunctionCallBuilder: BoundsCheckedThunkBuilder {
419427
// filter out deleted parameters, i.e. ones where argTypes[i] _contains_ nil
420428
return type == nil || type! != nil
421429
}.map { (i: Int, e: FunctionParameterSyntax) in
422-
e.with(\.type, (argTypes[i] ?? e.type)!)
430+
let param = e.with(\.type, (argTypes[i] ?? e.type)!)
431+
let name = param.secondName ?? param.firstName
432+
if name.trimmed.text == "_" {
433+
return param.with(\.secondName, getParamName(param, i))
434+
}
435+
return param
423436
}
424437
if let last = newParams.popLast() {
425438
newParams.append(last.with(\.trailingComma, nil))
@@ -437,7 +450,7 @@ struct FunctionCallBuilder: BoundsCheckedThunkBuilder {
437450
let functionRef = DeclReferenceExprSyntax(baseName: base.name)
438451
let args: [ExprSyntax] = base.signature.parameterClause.parameters.enumerated()
439452
.map { (i: Int, param: FunctionParameterSyntax) in
440-
let name = param.secondName ?? param.firstName
453+
let name = getParamName(param, i)
441454
let declref = DeclReferenceExprSyntax(baseName: name)
442455
return pointerArgs[i] ?? ExprSyntax(declref)
443456
}
@@ -647,7 +660,7 @@ extension ParamBoundsThunkBuilder {
647660
}
648661

649662
var name: TokenSyntax {
650-
return param.secondName ?? param.firstName
663+
getParamName(param, index)
651664
}
652665
}
653666

@@ -828,8 +841,7 @@ struct CountedOrSizedPointerThunkBuilder: ParamBoundsThunkBuilder, PointerBounds
828841
}
829842

830843
func castPointerToOpaquePointer(_ baseAddress: ExprSyntax) throws -> ExprSyntax {
831-
let i = try getParameterIndexForParamName(signature.parameterClause.parameters, name)
832-
let type = peelOptionalType(getParam(signature, i).type)
844+
let type = peelOptionalType(getParam(signature, index).type)
833845
if type.canRepresentBasicType(type: OpaquePointer.self) {
834846
return ExprSyntax("OpaquePointer(\(baseAddress))")
835847
}

test/Interop/C/swiftify-import/Inputs/counted-by-noescape.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,5 @@ void nullable(int len, int * __counted_by(len) _Nullable p __noescape);
2222
int * __counted_by(len) __noescape returnPointer(int len);
2323

2424
int * __counted_by(len1) returnLifetimeBound(int len1, int len2, int * __counted_by(len2) p __lifetimebound);
25+
26+
void anonymous(int len, int * __counted_by(len) _Nullable __noescape);

test/Interop/C/swiftify-import/counted-by-noescape.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import CountedByNoEscapeClang
1313

1414
// CHECK: @available(visionOS 1.1, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *)
15+
// CHECK-NEXT: @lifetime(_param1: copy _param1)
16+
// CHECK-NEXT: @_alwaysEmitIntoClient public func anonymous(_ _param1: inout MutableSpan<Int32>?)
17+
// CHECK-NEXT: @available(visionOS 1.1, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *)
1518
// CHECK-NEXT: @lifetime(p: copy p)
1619
// CHECK-NEXT: @_alwaysEmitIntoClient public func complexExpr(_ len: Int32, _ offset: Int32, _ p: inout MutableSpan<Int32>)
1720
// CHECK-NEXT: @available(visionOS 1.1, tvOS 12.2, watchOS 5.2, iOS 12.2, macOS 10.14.4, *)
@@ -102,3 +105,9 @@ public func callSimple(_ p: inout MutableSpan<CInt>) {
102105
public func callSwiftAttr(_ p: inout MutableSpan<CInt>) {
103106
swiftAttr(&p)
104107
}
108+
109+
@lifetime(p: copy p)
110+
@inlinable
111+
public func callAnonymous(_ p: inout MutableSpan<CInt>?) {
112+
anonymous(&p)
113+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// REQUIRES: swift_swift_parser
2+
3+
// RUN: %target-swift-frontend %s -swift-version 5 -module-name main -typecheck -plugin-path %swift-plugin-dir -strict-memory-safety -warnings-as-errors -dump-macro-expansions 2>&1 | %FileCheck --match-full-lines %s
4+
5+
@_SwiftifyImport(.countedBy(pointer: .param(1), count: "len"))
6+
public func myFunc(_: UnsafePointer<CInt>, _ len: CInt) {
7+
}
8+
9+
@_SwiftifyImport(.countedBy(pointer: .param(1), count: "len"))
10+
public func myFunc2(_ p: UnsafePointer<CInt>, _ len: CInt, _: CInt) {
11+
}
12+
13+
@_SwiftifyImport(.countedBy(pointer: .param(1), count: "len"), .nonescaping(pointer: .param(1)))
14+
public func myFunc3(_: UnsafePointer<CInt>, _ len: CInt) {
15+
}
16+
17+
@_SwiftifyImport(.countedBy(pointer: .param(1), count: "len"), .nonescaping(pointer: .param(1)))
18+
public func myFunc4(_: UnsafeMutablePointer<CInt>, _ len: CInt) {
19+
}
20+
21+
// CHECK: @_alwaysEmitIntoClient
22+
// CHECK-NEXT: public func myFunc(_ _param0: UnsafeBufferPointer<CInt>) {
23+
// CHECK-NEXT: return unsafe myFunc(_param0.baseAddress!, CInt(exactly: _param0.count)!)
24+
// CHECK-NEXT: }
25+
26+
// CHECK: @_alwaysEmitIntoClient
27+
// CHECK-NEXT: public func myFunc2(_ p: UnsafeBufferPointer<CInt>, _ _param2: CInt) {
28+
// CHECK-NEXT: return unsafe myFunc2(p.baseAddress!, CInt(exactly: p.count)!, _param2)
29+
// CHECK-NEXT: }
30+
31+
// CHECK: @_alwaysEmitIntoClient
32+
// CHECK-NEXT: public func myFunc3(_ _param0: Span<CInt>) {
33+
// CHECK-NEXT: return unsafe _param0.withUnsafeBufferPointer { __param0Ptr in
34+
// CHECK-NEXT: return unsafe myFunc3(__param0Ptr.baseAddress!, CInt(exactly: __param0Ptr.count)!)
35+
// CHECK-NEXT: }
36+
// CHECK-NEXT: }
37+
38+
// CHECK: @_alwaysEmitIntoClient @lifetime(_param0: copy _param0)
39+
// CHECK-NEXT: public func myFunc4(_ _param0: inout MutableSpan<CInt>) {
40+
// CHECK-NEXT: return unsafe _param0.withUnsafeMutableBufferPointer { __param0Ptr in
41+
// CHECK-NEXT: return unsafe myFunc4(__param0Ptr.baseAddress!, CInt(exactly: __param0Ptr.count)!)
42+
// CHECK-NEXT: }
43+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)