From 248e785f103233a73c27b98e605db9aa812e51aa Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sat, 17 Feb 2024 17:54:02 +0100 Subject: [PATCH] Fix RCS1250 (#1403) --- ChangeLog.md | 1 + ...mplicitOrExplicitObjectCreationAnalysis.cs | 7 ++++- ...seImplicitOrExplicitObjectCreationTests.cs | 27 +++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 39c4c2d486..403fe6a98b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix analyzer [RCS0049](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS0049) ([PR](https://github.com/dotnet/roslynator/pull/1386)) - Fix analyzer [RCS1159](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1159) ([PR](https://github.com/dotnet/roslynator/pull/1390)) - Fix analyzer [RCS1019](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1019) ([PR](https://github.com/dotnet/roslynator/pull/1402)) +- Fix analyzer [RCS1250](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1250) ([PR](https://github.com/dotnet/roslynator/pull/1403)) - Fix code fix for [CS8600](https://josefpihrt.github.io/docs/roslynator/fixes/CS8600) changing the wrong type when casts or `var` are involved ([PR](https://github.com/dotnet/roslynator/pull/1393) by @jroessel) ## [4.10.0] - 2024-01-24 diff --git a/src/Analyzers/CSharp/Analysis/ObjectCreation/ImplicitOrExplicitObjectCreationAnalysis.cs b/src/Analyzers/CSharp/Analysis/ObjectCreation/ImplicitOrExplicitObjectCreationAnalysis.cs index 55935e90c6..67b269d8b9 100644 --- a/src/Analyzers/CSharp/Analysis/ObjectCreation/ImplicitOrExplicitObjectCreationAnalysis.cs +++ b/src/Analyzers/CSharp/Analysis/ObjectCreation/ImplicitOrExplicitObjectCreationAnalysis.cs @@ -1,5 +1,7 @@ // Copyright (c) .NET Foundation and Contributors. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; using Roslynator.CSharp.CodeStyle; @@ -48,7 +50,10 @@ protected override void ReportVarToExplicit(ref SyntaxNodeAnalysisContext contex #if ROSLYN_4_7 protected override bool UseCollectionExpressionFromImplicit(ref SyntaxNodeAnalysisContext context) { - return ((ImplicitObjectCreationExpressionSyntax)context.Node).ArgumentList?.Arguments.Any() != true + var implicitObjectCreation = (ImplicitObjectCreationExpressionSyntax)context.Node; + + return implicitObjectCreation.ArgumentList?.Arguments.Any() != true + && implicitObjectCreation.Initializer?.Expressions.Any(f => f.IsKind(SyntaxKind.SimpleAssignmentExpression)) != true && UseCollectionExpression(ref context); } diff --git a/src/Tests/Analyzers.Tests/RCS1250UseImplicitOrExplicitObjectCreationTests.cs b/src/Tests/Analyzers.Tests/RCS1250UseImplicitOrExplicitObjectCreationTests.cs index 9dd53aa4af..d0a84f8985 100644 --- a/src/Tests/Analyzers.Tests/RCS1250UseImplicitOrExplicitObjectCreationTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1250UseImplicitOrExplicitObjectCreationTests.cs @@ -1854,4 +1854,31 @@ void M(List x) } ", options: Options.AddConfigOption(ConfigOptionKeys.ObjectCreationTypeStyle, ConfigOptionValues.ObjectCreationTypeStyle_Explicit)); } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.UseImplicitOrExplicitObjectCreation)] + public async Task TestNoDiagnostic_ObjectInitializerWithPropertySet() + { + await VerifyNoDiagnosticAsync(""" +using System; +using System.Collections; +using System.Collections.Generic; + +class C : IEnumerable +{ + public string P { get; set; } + + public IEnumerator GetEnumerator() => throw new NotImplementedException(); + + IEnumerator IEnumerable.GetEnumerator() => throw new NotImplementedException(); + + static C M() + { + C c = new() { P = "" }; + + return c; + } +} +""", options: Options.AddConfigOption(ConfigOptionKeys.ObjectCreationTypeStyle, ConfigOptionValues.ObjectCreationTypeStyle_Implicit) + .AddConfigOption(ConfigOptionKeys.UseCollectionExpression, true)); + } }