expose "safe fn" in extern block as ForeignItemFn #1960
+627
−42
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.
Currently when parsing a "safe fn"
synwill represent this as aForeignItem::Verbatim.This makes it hard to use them in proc-macros.
Right now
parse_signaturewill returnOk(Some(sig))for signatures without the "safe" keyword. If the "safe" keyword is found it returnsOk(None)instead.If
Noneis returnedForeignItem::parsewill assume that the function signature contains the "safe" keyword and returns aVerbatim.I see 2 possible solutions to improve this:
Option<Safe>toSignatureparse_signatureto returnOk(sig, Some(safe))and store the "safe" keyword in theForeignItemFnForeignSignaturethat extendsSignaturewith the optional safe keywordThere are some Pros/Cons to all 3 approaches
externblock so I am not sure if this is a good abstraction. However this would be the simplest to implement.ForeignItemFnwhich means that there needs to be special handling inForeignItemFn::to_tokensto ensure that the "safe" keyword is inserted at the correct position.Open questions:
ForeignItemFnand I guess that is a breaking change. However I can't imagine you release a breaking version change every time rust adds a new feature with new syntax. No idea how you want to handle something like this.