-
Notifications
You must be signed in to change notification settings - Fork 511
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
Avoid allocations in CanWrap... methods #3711
Avoid allocations in CanWrap... methods #3711
Conversation
Codecov Report
Additional details and impacted files@@ Coverage Diff @@
## master #3711 +/- ##
==========================================
+ Coverage 93.12% 93.13% +0.01%
==========================================
Files 1088 1088
Lines 114954 115026 +72
Branches 4088 4113 +25
==========================================
+ Hits 107047 107126 +79
+ Misses 6865 6860 -5
+ Partials 1042 1040 -2 |
Is it still benefitial to use GetOrAdd after having checked with TryGetValue, or would it be even better to simply call TryAdd instead, to not need to capture any variables at all and get rid of the local function? |
Answering myself: Since the local function in your code is rarely called, I assume there will be no practical difference in performance. But maybe it would be better with the simpler code, for readability?
Just a thought. |
@@ -65,18 +65,22 @@ internal static bool CanWrapObject(object obj, Type underlyingType) | |||
return false; | |||
} | |||
|
|||
ConcurrentDictionary<Type, bool> wrappedObject = SupportedObjectWrappers.GetOrAdd(underlyingType, _ => new ConcurrentDictionary<Type, bool>()); |
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.
Was there an actual problem with this first lookup (in each method)? I haven't dug into your IL comparison, but since no capture is needed, it seems the only possible overhead would be creating the func instance. I think I recall that lambdas are automatically detected to be static if possible, but in case that is not correct, wouldn't simply marking the lambda as static be the best change?
ConcurrentDictionary<Type, bool> wrappedObject = SupportedObjectWrappers.GetOrAdd(underlyingType, static _ => new ConcurrentDictionary<Type, bool>());
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.
The IL confirmed that the delegate instance is indeed cached between calls in a static field:
// Load the delegate instance from a static field
IL_0033: ldsfld class System.Func`2<System.Type, ConcurrentDictionary`2<SyntaxKind, bool>> StyleCop.Analyzers.Lightup.LightupHelpers/'<>c'::'<>9__30_0'
IL_0038: dup
// Branch if not null?
IL_0039: brtrue.s IL_0052
IL_003b: pop
// ..
// Create the delegate
IL_0047: newobj instance void class System.Func`2<System.Type, ConcurrentDictionary`2<SyntaxKind, bool>>::.ctor(object, native int)
IL_004c: dup
// Store it
IL_004d: stsfld class System.Func`2<System.Type, ConcurrentDictionary`2<SyntaxKind, bool>> StyleCop.Analyzers.Lightup.LightupHelpers/'<>c'::'<>9__30_0'
// Invoke the delegate
IL_0052: callvirt instance !1/*class [System.Collections.Concurrent]System.Collections.Concurrent.ConcurrentDictionary`2<valuetype [Microsoft.CodeAnalysis.CSharp]Microsoft.CodeAnalysis.CSharp.SyntaxKind, bool>*/ class [System.Collections.Concurrent]System.Collections.Concurrent.ConcurrentDictionary`2<class [System.Runtime]System.Type, class [System.Collections.Concurrent]System.Collections.Concurrent.ConcurrentDictionary`2<valuetype [Microsoft.CodeAnalysis.CSharp]Microsoft.CodeAnalysis.CSharp.SyntaxKind, bool>>::GetOrAdd(!0/*class [System.Runtime]System.Type*/, class [System.Runtime]System.Func`2<!0/*class [System.Runtime]System.Type*/, !1/*class [System.Collections.Concurrent]System.Collections.Concurrent.ConcurrentDictionary`2<valuetype [Microsoft.CodeAnalysis.CSharp]Microsoft.CodeAnalysis.CSharp.SyntaxKind, bool>*/>)
This is indeed better. It works in this case because the cached value is a bool (value type). For the |
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.
Requesting simplification
@@ -65,15 +65,17 @@ internal static bool CanWrapObject(object obj, Type underlyingType) | |||
return false; | |||
} | |||
|
|||
ConcurrentDictionary<Type, bool> wrappedObject = SupportedObjectWrappers.GetOrAdd(underlyingType, _ => new ConcurrentDictionary<Type, bool>()); |
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 line does not need to change.
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.
I just kept the static
to emphasize the non-capturing semantic of the lambda.
@@ -65,15 +65,17 @@ internal static bool CanWrapObject(object obj, Type underlyingType) | |||
return false; | |||
} | |||
|
|||
ConcurrentDictionary<Type, bool> wrappedObject = SupportedObjectWrappers.GetOrAdd(underlyingType, _ => new ConcurrentDictionary<Type, bool>()); | |||
|
|||
// Avoid creating the delegate if the value already exists |
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 comment is sufficient for the method (it already states the complete intent, and it's just a simple bug that we didn't adhere to it)
{ | ||
canCast = wrappedObject.GetOrAdd( | ||
obj.GetType(), | ||
kind => underlyingType.GetTypeInfo().IsAssignableFrom(obj.GetType().GetTypeInfo())); |
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 line is the source of the capturing allocation (specifically, capturing a method parameter in a lambda forces the the capture to be allocated on all paths and not just the one that creates this delegate).
canCast = underlyingType.GetTypeInfo().IsAssignableFrom(obj.GetType().GetTypeInfo()); | ||
wrappedObject.TryAdd(obj.GetType(), canCast); |
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.
❗ Requesting that this pull request be reduced to just this two line change in each case.
@sharwell Merging failed due to some (unrelated?) build error. |
I consider myself unlucky when it comes to these builds, but you are on another level :-) I think that you got all the "usual" random build errors plus one that I don't think I have ever seen. There are however some new commits on master, so you can merge those and push again. Maybe fifth time is the charm? Otherwise I hope that @sharwell can merge this anyway. |
I'll just restart the build. Merging from master will turn off the auto merge. |
…20) [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [StyleCop.Analyzers](https://github.com/DotNetAnalyzers/StyleCopAnalyzers) | `1.2.0-beta.507` -> `1.2.0-beta.556` | [![age](https://developer.mend.io/api/mc/badges/age/nuget/StyleCop.Analyzers/1.2.0-beta.556?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/StyleCop.Analyzers/1.2.0-beta.556?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/StyleCop.Analyzers/1.2.0-beta.507/1.2.0-beta.556?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/StyleCop.Analyzers/1.2.0-beta.507/1.2.0-beta.556?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>DotNetAnalyzers/StyleCopAnalyzers (StyleCop.Analyzers)</summary> ### [`v1.2.0-beta.556`](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/releases/tag/1.2.0-beta.556) [Compare Source](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/compare/1.2.0-beta.553...1.2.0-beta.556) #### What's Changed - Update SA1011 to forbid trailing space before the end of a switch case by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3674](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3674) - Rewrite IOperationWrapper as a wrapper structure around IOperation by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3611](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3611) - Update SA1202 to support interfaces (C# 8) and records (C# 9, 10) by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3694](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3694) - Update documentation for SA1308 to also mention prefix "t\_" by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3697](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3697) - Update SA1642 and its code fix to handle record structs correctly by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3696](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3696) - Update dependencies by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3700](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3700) - Mark several test classes as partial by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3702](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3702) - Add missing test files and fix inheritance by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3703](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3703) - Generate and validate derived test classes by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3704](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3704) - Update SA1011 to not require space before a range operator by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3709](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3709) - Update SA1131 to treat methods as constants by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3710](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3710) - Avoid allocations in CanWrap... methods by [@​martin-strecker-sonarsource](https://github.com/martin-strecker-sonarsource) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711) - Update SA1648 to accept inheritdoc on members implemented from static abstract/virtual interface members by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3715](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3715) - Update SA1600 to also handle records by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3725](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3725) - Update SA1119 to allow parenthesis around a ref ternary conditional expression when it is the left-hand side of an assigment by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3737](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3737) - Update SA1119 to allow parenthesized switch expressions followed by an invocation by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3733](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3733) - Add c# 12 test project by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3734](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3734) - Run tests in parallel jobs by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3740](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3740) - Update SA1010 to accept whitespace before collection initializers by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3745](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3745) - Update SA1513 to not require a blank line if the closing brace is at the end of a collection expression by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3746](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3746) - Update SA1118 to allow multi-line collection expressions by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3749](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3749) - Update SA1009 to require a space after the closing parenthesis if it is followed by ++ or -- from a prefix unary expression by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3750](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3750) - Update SA1008 to allow space before the opening parenthesis of a using alias definition of a tuple type by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3748](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3748) - Update documentation for SA1102 to contain compilable code examples by [@​arphox](https://github.com/arphox) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755) - Update SA1008 to not crash if there is no previous token by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3741](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3741) - Change default value of test property CodeActionValidationMode to SemanticStructure instead of None and update so that tests still pass by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3753](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3753) - Allow inheritdoc for class constructors with base types by [@​MartyIX](https://github.com/MartyIX) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719) - Fix that SA1134 Fix All maybe non-deterministic by [@​pdelvo](https://github.com/pdelvo) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/2853](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/2853) - Coverage improvements by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3675](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3675) - Fix SA1131 to not treat "complex" expressions as a literal by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3760](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3760) #### New Contributors - [@​martin-strecker-sonarsource](https://github.com/martin-strecker-sonarsource) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711) - [@​arphox](https://github.com/arphox) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755) - [@​MartyIX](https://github.com/MartyIX) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719) **Full Changelog**: DotNetAnalyzers/StyleCopAnalyzers@1.2.0-beta.507...1.2.0-beta.556 ### [`v1.2.0-beta.553`](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/releases/tag/1.2.0-beta.553) [Compare Source](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/compare/1.2.0-beta.507...1.2.0-beta.553) ##### What's Changed - Update SA1011 to forbid trailing space before the end of a switch case by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3674](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3674) - Rewrite IOperationWrapper as a wrapper structure around IOperation by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3611](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3611) - Update SA1202 to support interfaces (C# 8) and records (C# 9, 10) by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3694](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3694) - Update documentation for SA1308 to also mention prefix "t\_" by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3697](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3697) - Update SA1642 and its code fix to handle record structs correctly by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3696](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3696) - Update dependencies by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3700](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3700) - Mark several test classes as partial by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3702](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3702) - Add missing test files and fix inheritance by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3703](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3703) - Generate and validate derived test classes by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3704](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3704) - Update SA1011 to not require space before a range operator by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3709](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3709) - Update SA1131 to treat methods as constants by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3710](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3710) - Avoid allocations in CanWrap... methods by [@​martin-strecker-sonarsource](https://github.com/martin-strecker-sonarsource) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711) - Update SA1648 to accept inheritdoc on members implemented from static abstract/virtual interface members by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3715](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3715) - Update SA1600 to also handle records by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3725](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3725) - Update SA1119 to allow parenthesis around a ref ternary conditional expression when it is the left-hand side of an assigment by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3737](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3737) - Update SA1119 to allow parenthesized switch expressions followed by an invocation by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3733](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3733) - Add c# 12 test project by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3734](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3734) - Run tests in parallel jobs by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3740](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3740) - Update SA1010 to accept whitespace before collection initializers by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3745](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3745) - Update SA1513 to not require a blank line if the closing brace is at the end of a collection expression by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3746](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3746) - Update SA1118 to allow multi-line collection expressions by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3749](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3749) - Update SA1009 to require a space after the closing parenthesis if it is followed by ++ or -- from a prefix unary expression by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3750](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3750) - Update SA1008 to allow space before the opening parenthesis of a using alias definition of a tuple type by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3748](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3748) - Update documentation for SA1102 to contain compilable code examples by [@​arphox](https://github.com/arphox) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755) - Update SA1008 to not crash if there is no previous token by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3741](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3741) - Change default value of test property CodeActionValidationMode to SemanticStructure instead of None and update so that tests still pass by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3753](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3753) - Allow inheritdoc for class constructors with base types by [@​MartyIX](https://github.com/MartyIX) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719) - Fix that SA1134 Fix All maybe non-deterministic by [@​pdelvo](https://github.com/pdelvo) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/2853](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/2853) - Coverage improvements by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3675](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3675) ##### New Contributors - [@​martin-strecker-sonarsource](https://github.com/martin-strecker-sonarsource) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711) - [@​arphox](https://github.com/arphox) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755) - [@​MartyIX](https://github.com/MartyIX) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719) **Full Changelog**: DotNetAnalyzers/StyleCopAnalyzers@1.2.0-beta.507...1.2.0-beta.553 </details> --- ### Configuration 📅 **Schedule**: Branch creation - "after 9pm,before 6am" in timezone Europe/Zurich, Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/smartive/cas-fee-adv-mumble-api). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMDMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjEwMy4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…591) [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [StyleCop.Analyzers](https://github.com/DotNetAnalyzers/StyleCopAnalyzers) | `1.2.0-beta.507` -> `1.2.0-beta.556` | [![age](https://developer.mend.io/api/mc/badges/age/nuget/StyleCop.Analyzers/1.2.0-beta.556?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/StyleCop.Analyzers/1.2.0-beta.556?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/StyleCop.Analyzers/1.2.0-beta.507/1.2.0-beta.556?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/StyleCop.Analyzers/1.2.0-beta.507/1.2.0-beta.556?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>DotNetAnalyzers/StyleCopAnalyzers (StyleCop.Analyzers)</summary> ### [`v1.2.0-beta.556`](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/releases/tag/1.2.0-beta.556) [Compare Source](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/compare/1.2.0-beta.553...1.2.0-beta.556) #### What's Changed - Update SA1011 to forbid trailing space before the end of a switch case by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3674](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3674) - Rewrite IOperationWrapper as a wrapper structure around IOperation by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3611](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3611) - Update SA1202 to support interfaces (C# 8) and records (C# 9, 10) by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3694](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3694) - Update documentation for SA1308 to also mention prefix "t\_" by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3697](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3697) - Update SA1642 and its code fix to handle record structs correctly by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3696](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3696) - Update dependencies by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3700](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3700) - Mark several test classes as partial by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3702](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3702) - Add missing test files and fix inheritance by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3703](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3703) - Generate and validate derived test classes by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3704](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3704) - Update SA1011 to not require space before a range operator by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3709](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3709) - Update SA1131 to treat methods as constants by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3710](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3710) - Avoid allocations in CanWrap... methods by [@​martin-strecker-sonarsource](https://github.com/martin-strecker-sonarsource) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711) - Update SA1648 to accept inheritdoc on members implemented from static abstract/virtual interface members by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3715](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3715) - Update SA1600 to also handle records by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3725](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3725) - Update SA1119 to allow parenthesis around a ref ternary conditional expression when it is the left-hand side of an assigment by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3737](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3737) - Update SA1119 to allow parenthesized switch expressions followed by an invocation by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3733](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3733) - Add c# 12 test project by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3734](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3734) - Run tests in parallel jobs by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3740](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3740) - Update SA1010 to accept whitespace before collection initializers by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3745](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3745) - Update SA1513 to not require a blank line if the closing brace is at the end of a collection expression by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3746](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3746) - Update SA1118 to allow multi-line collection expressions by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3749](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3749) - Update SA1009 to require a space after the closing parenthesis if it is followed by ++ or -- from a prefix unary expression by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3750](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3750) - Update SA1008 to allow space before the opening parenthesis of a using alias definition of a tuple type by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3748](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3748) - Update documentation for SA1102 to contain compilable code examples by [@​arphox](https://github.com/arphox) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755) - Update SA1008 to not crash if there is no previous token by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3741](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3741) - Change default value of test property CodeActionValidationMode to SemanticStructure instead of None and update so that tests still pass by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3753](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3753) - Allow inheritdoc for class constructors with base types by [@​MartyIX](https://github.com/MartyIX) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719) - Fix that SA1134 Fix All maybe non-deterministic by [@​pdelvo](https://github.com/pdelvo) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/2853](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/2853) - Coverage improvements by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3675](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3675) - Fix SA1131 to not treat "complex" expressions as a literal by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3760](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3760) #### New Contributors - [@​martin-strecker-sonarsource](https://github.com/martin-strecker-sonarsource) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711) - [@​arphox](https://github.com/arphox) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755) - [@​MartyIX](https://github.com/MartyIX) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719) **Full Changelog**: DotNetAnalyzers/StyleCopAnalyzers@1.2.0-beta.507...1.2.0-beta.556 ### [`v1.2.0-beta.553`](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/releases/tag/1.2.0-beta.553) [Compare Source](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/compare/1.2.0-beta.507...1.2.0-beta.553) ##### What's Changed - Update SA1011 to forbid trailing space before the end of a switch case by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3674](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3674) - Rewrite IOperationWrapper as a wrapper structure around IOperation by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3611](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3611) - Update SA1202 to support interfaces (C# 8) and records (C# 9, 10) by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3694](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3694) - Update documentation for SA1308 to also mention prefix "t\_" by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3697](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3697) - Update SA1642 and its code fix to handle record structs correctly by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3696](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3696) - Update dependencies by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3700](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3700) - Mark several test classes as partial by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3702](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3702) - Add missing test files and fix inheritance by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3703](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3703) - Generate and validate derived test classes by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3704](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3704) - Update SA1011 to not require space before a range operator by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3709](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3709) - Update SA1131 to treat methods as constants by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3710](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3710) - Avoid allocations in CanWrap... methods by [@​martin-strecker-sonarsource](https://github.com/martin-strecker-sonarsource) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711) - Update SA1648 to accept inheritdoc on members implemented from static abstract/virtual interface members by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3715](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3715) - Update SA1600 to also handle records by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3725](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3725) - Update SA1119 to allow parenthesis around a ref ternary conditional expression when it is the left-hand side of an assigment by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3737](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3737) - Update SA1119 to allow parenthesized switch expressions followed by an invocation by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3733](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3733) - Add c# 12 test project by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3734](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3734) - Run tests in parallel jobs by [@​sharwell](https://github.com/sharwell) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3740](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3740) - Update SA1010 to accept whitespace before collection initializers by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3745](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3745) - Update SA1513 to not require a blank line if the closing brace is at the end of a collection expression by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3746](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3746) - Update SA1118 to allow multi-line collection expressions by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3749](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3749) - Update SA1009 to require a space after the closing parenthesis if it is followed by ++ or -- from a prefix unary expression by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3750](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3750) - Update SA1008 to allow space before the opening parenthesis of a using alias definition of a tuple type by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3748](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3748) - Update documentation for SA1102 to contain compilable code examples by [@​arphox](https://github.com/arphox) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755) - Update SA1008 to not crash if there is no previous token by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3741](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3741) - Change default value of test property CodeActionValidationMode to SemanticStructure instead of None and update so that tests still pass by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3753](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3753) - Allow inheritdoc for class constructors with base types by [@​MartyIX](https://github.com/MartyIX) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719) - Fix that SA1134 Fix All maybe non-deterministic by [@​pdelvo](https://github.com/pdelvo) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/2853](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/2853) - Coverage improvements by [@​bjornhellander](https://github.com/bjornhellander) in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3675](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3675) ##### New Contributors - [@​martin-strecker-sonarsource](https://github.com/martin-strecker-sonarsource) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3711) - [@​arphox](https://github.com/arphox) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3755) - [@​MartyIX](https://github.com/MartyIX) made their first contribution in [https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/3719) **Full Changelog**: DotNetAnalyzers/StyleCopAnalyzers@1.2.0-beta.507...1.2.0-beta.553 </details> --- ### Configuration 📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/ThorstenSauter/NoPlan). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMDMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjEwMy4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
The "CanWrap.." methods are in the hot path in our repository (see SonarSource/sonar-dotnet/issues/8106). It is likely that the methods are on the hot path in your analyzer as well (they are called by each ...Wrapper.IsInstance implementation).
The following improvements can be validated by the generated IL:
IL_00000
creates a capture class for the whole method. In the new version, no capture class is created.Func<,>
delegate instantiation for_ => new ConcurrentDictionary<Type, bool>()
is deferred for sure. The function delegate inIL_0047
seems to be stored in a hidden static field and reused in the old version. The new version makes sure that the delegate is not instantiated on the happy path for sure.IL_0033
in the new version is only conditional executed after the branch after theSupportedSyntaxWrappers.TryGetValue
(IL_0017
) and a second branch after the static field lookup (IL_0025
).wrappedSyntax.TryGetValue
is not successfulcanCast
is calculated and added to theConcurrentDictionary
without a delegate. This is possible becausecanCast
is a value type. Unlike with reference types, the created value doesn't suffer from concurrency issues ifTryAdd
fails.The allocation saving for the capture class was measured in this SonarSource/sonar-dotnet/pull/8107 on our side with the similar changes in place.
The IL for the old version of
CanWrapNode
looks like so (3 timesnewobj
):The IL for the new version looks like so (1 time
newobj
):