-
Notifications
You must be signed in to change notification settings - Fork 112
Diagnose when we incorrectly infer the type of a capture list item in an exit test. #1152
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
Conversation
…t test. This PR adds the ability to infer the type of a parameter of a function or closure that encloses an exit test. For example, `x` here: ```swift func f(x: Int) async { await #expect(processExitsWith: .failure) { [x] in ... } } ``` This inference still fails if a parameter is shadowed by a variable with an incompatible type; we still need something like `decltype()` to solve for such cases. Still, being able to capture `@Test` function arguments with minimal ceremony is helpful: ```swift @test(arguments: 0 ..< 100) func f(i: Int) async { await #expect(exitsWith: .failure) { [i] in ... } } ```
|
||
// Diagnose that the type of 'expr' is invalid. | ||
let name = nameExpr.representedLiteralValue ?? expr.trimmedDescription | ||
let capture = ClosureCaptureSyntax(name: .identifier(name)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This fake ClosureCaptureSyntax
instance is created because we can't pass such a thing as an expression and we need to use a string instead. It's a temporary abstraction until swiftlang/swift-syntax#3085 is resolved.
@swift-ci test |
@swift-ci test |
Preemptively merging before all CI is complete as it passed previously and is passing now on Linux. Windows and Mac CI are stuck waiting. |
Follow-up to #1130, split out for clarity.
This PR adds a custom diagnostic at compile time if we incorrectly infer the type of a captured function argument or
self
in an exit test. For example:This improves our feedback to the developer when we encounter a pattern like that. The developer will now see:
Checklist: