Add a test for property access on ~Escapable types#1155
Open
natecook1000 wants to merge 61 commits intoswiftlang:jgrynspan/162-redesign-value-capturefrom
Open
Add a test for property access on ~Escapable types#1155natecook1000 wants to merge 61 commits intoswiftlang:jgrynspan/162-redesign-value-capturefrom
natecook1000 wants to merge 61 commits intoswiftlang:jgrynspan/162-redesign-value-capturefrom
Conversation
This PR completely rewrites how we capture expectation conditions. For example, given the following expectation: ```swift ``` We currently detect that there is a binary operation and emit code that calls the binary operator as a closure and passes the left-hand value and right-hand value, then checks that the result of the operation is `true`. This is sufficient for simpler expressions like that one, but more complex ones (including any that involve `try` or `await` keywords) cannot be expanded correctly. With this PR, such expressions _can_ generally be expanded correctly. The change involves rewriting the macro condition as a closure to which is passed a local, mutable "context" value. Subexpressions of the condition expression are then rewritten by walking the syntax tree of the expression (using typical swift-syntax API) and replacing them with calls into the context value that pass in the value and related state. If the expectation ultimately fails, the collected data is transformed into an instance of the SPI type `Expression` that contains the source code of the expression and interesting subexpressions as well as the runtime values of those subexpressions. Nodes in the syntax tree are identified by a unique ID which is composed of the swift-syntax ID for that node as well as all its parent nodes in a compact bitmask format. These IDs can be transformed into graph/trie key paths when expression/subexpression relationships need to be reconstructed on failure, meaning that a single rewritten node doesn't otherwise need to know its "place" in the overall expression. There remain a few caveats (that also generally affect the current implementation): - Mutating member functions are syntactically indistinguishable from non-mutating ones and miscompile when rewritten; - Expressions involving move-only types are also indistinguishable, but need lifetime management to be rewritten correctly; and - Expressions where the `try` or `await` keyword is _outside_ the `#expect` macro cannot be expanded correctly because the macro cannot see those keywords during expansion. The first issue might be resolvable in the future using pointer tricks, although I don't hold a lot of hope for it. The second issue is probably resolved by non-escaping types. The third issue is an area of active exploration for us and the macros/swift-syntax team.
This tests using a ~Escapable type as the LHS of a property access inside the `#expect` and `#require` macros. A ~Escapable return value from `#require` is unsupported.
Contributor
|
@swift-ci please test |
Contributor
|
I believe this test is dependent on #840, right? |
Member
Author
|
Right! I believe it's aimed at that branch, not main. Should I direct it somewhere else? |
Contributor
|
Nope, just confirming the dependency is why the test failed. You could redirect the PR to merge to that branch, and then it would pass? |
Contributor
|
@swift-ci test |
…(still not ~Copyable though)
…nonescapable-test
…cript to allow yielding return of values" This reverts commit f920afe.
…nonescapable-test
3ae7e90 to
9209cf3
Compare
5d450c9 to
c9d3cec
Compare
dbcc432 to
b369b13
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This tests using a ~Escapable type as the LHS of a property access inside the
#expectand#requiremacros. A ~Escapable return value from#requireis unsupported.Checklist: