-
Notifications
You must be signed in to change notification settings - Fork 796
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
Enforce union case declarations AttributeTargets #16764
Enforce union case declarations AttributeTargets #16764
Conversation
❗ Release notes required
|
….com:edgarfgp/fsharp into enforce-attribute-targets-on-union-case-decl
This is ready |
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.
Thanks for the fix, tests and refactoring. That's a good one.
I wonder if we should add some notes to some docs about it. This is a technically correct behavior but might seem unintuitive to F# newcomers.
Im planning to submit a RFC with the |
Awesome :) |
This PR should merged before #16790. Thanks |
@dotnet/fsharp-team-msft |
Co-authored-by: Brian Rourke Boll <brianrourkeboll@users.noreply.github.com>
Thought it's a breaking change, I think it's fine from the the "correctness" point of view, however having If something is using generated attributes, they can be "correctly" utilised in C#, but not in F#, since from F# standpoint, That said, I don't mind merging it as it is now, but it still feels weird to me that we allow |
@vzarytovskii As you know there not an actual spec yet for this, so if |
* Real accessibility (#15484) * merge * remove unused binding * temp * temp * temp * temp * temp * temp * fantomas * temp * temp * quotes * temp * realsig build and test * tuples, staticint tests * SerializableAttribute tests * SeqExpressionStepping * AsyncExpressionStepping * misc * AttributeTargets * CCtorDUWithMember ListExpressionStepping * temp * cleanup * fantomas * temp * temp * temp * Automated command ran: fantomas Co-authored-by: KevinRansom <5175830+KevinRansom@users.noreply.github.com> * Some cleanup * clean * fantoms * temp * merge issues * fantomas * temp * Update src/Compiler/TypedTree/TypedTreeBasics.fs Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com> * Update src/Compiler/Optimize/Optimizer.fs Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com> * inline * Fix plain build. * Update changelog * Fixed release notes * feedback * remove surplus realsigs * Update src/Compiler/TypedTree/TypedTree.fsi Co-authored-by: Petr Pokorny <petr@innit.cz> * Update tests/FSharp.Compiler.ComponentTests/EmittedIL/ComputationExpressions/ComputationExpressions.fs Co-authored-by: Petr Pokorny <petr@innit.cz> * baselines * baselines * baselines * build.sh * restore quotes * moar quotes * mutable police * fantomas * t * Update baselines * Shadowing/LinqCount.fsx baseline * Shadowing lingcount * access.fsx --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com> Co-authored-by: Vlad Zarytovskii <vzaritovsky@hotmail.com> Co-authored-by: Petr Pokorny <petr@innit.cz> * Fix range start of INTERP_STRING_PART (#16785) * use the same mechanism we used to fix the range start of INTERP_STRING_END to also fix the range start of INTERP_STRING_PART * - use a new rule for '"}" +' to catch the correct range start - clean up work around structures introduced before and not needed anymore with this * Revert "- use a new rule for '"}" +' to catch the correct range start" This reverts commit 4d01cda. * add second PR to changelog * remove commented poc code * Enforce union case declarations AttributeTargets (#16764) * Enforce union-cases AttributeTargets * release notes * LanguageFeature.EnforceAttributeTargetsUnionCaseDeclarations * release notes * format code * improve naming * Update src/Compiler/Checking/CheckExpressions.fs Co-authored-by: Brian Rourke Boll <brianrourkeboll@users.noreply.github.com> * Fix merge conflict --------- Co-authored-by: Brian Rourke Boll <brianrourkeboll@users.noreply.github.com> * Don't consider parse warnings as errors in ComputeTcIntermediate (#16792) * Fix seqexpression testcases (#16795) * correct realsignature test cases for seqexpr tests * rename typo --------- Co-authored-by: Kevin Ransom (msft) <codecutter@hotmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com> Co-authored-by: Vlad Zarytovskii <vzaritovsky@hotmail.com> Co-authored-by: Petr Pokorny <petr@innit.cz> Co-authored-by: dawe <dawedawe@posteo.de> Co-authored-by: Edgar Gonzalez <edgar.gonzalez@fundourselves.com> Co-authored-by: Brian Rourke Boll <brianrourkeboll@users.noreply.github.com> Co-authored-by: Florian Verdonck <florian.verdonck@outlook.com>
This is not always the case. There's no single direct mapping between union cases and their compiled .NET representations: depending on the union and its union cases, they compile to different things (nested classes, properties, constructor methods, case test properties, nested For example, these union cases compile to properties, not methods: type U =
| A
| B I don't see any tests covering these cases. Is there an RFC for this? |
@auduchinok No Yet. Im going through the issues and figuring out which
I will look into this as create a PR with tests |
let attrs = | ||
// The attributes of a union case decl get attached to the generated "static factory" method | ||
// Enforce that the union-cases can only be targeted by attributes with AttributeTargets.Method | ||
if g.langVersion.SupportsFeature(LanguageFeature.EnforceAttributeTargetsUnionCaseDeclarations) then |
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.
Following the logic from IlxGen, this should branch on arguments for the case.
Case with no data is a property.
Case with fields is a method.
There are other concerns affecting DU IL generation (structness, null as true value, number of cases), but so far I have not found any other affecting case-level attribute placement beyond what I wrote above (and what Eugene pointed out).
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.
Thanks for the review. See #16807
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.
If you find any other case. Let me know, I really want to improve this area of the compiler
Description
Fixes #3112
UnionCase compiles down to a static
Method
so should only enforceAttributeTargets.Method
SharpLabOld Rule
New Rule
Checklist
Test cases added
Performance benchmarks added in case of performance changes
Release notes entry updated: