Skip to content

Commit e260e3d

Browse files
authored
Add option 'roslynator_unity_code_analysis.enabled' (#1245)
1 parent 6039512 commit e260e3d

File tree

18 files changed

+100
-19
lines changed

18 files changed

+100
-19
lines changed

ChangeLog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1717
- Fix refactoring [Inline method](https://josefpihrt.github.io/docs/roslynator/refactorings/RR0062) ([PR](https://github.com/dotnet/roslynator/pull/1234))
1818
- [CLI] Fix globbing ([PR](https://github.com/dotnet/roslynator/pull/1238))
1919
- [CLI] Remove assembly resolving ([PR](https://github.com/dotnet/roslynator/pull/1237))
20+
- Detect false positive from Unity code ([RCS1169](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1169)) ([PR](https://github.com/dotnet/roslynator/pull/1245))
21+
- Introduce config option `roslynator_unity_code_analysis.enabled = true|false`
22+
- Make option `roslynator_suppress_unity_script_methods` obsolete
2023

2124
## [4.6.1] - 2023-10-23
2225

src/Analyzers.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5178,6 +5178,9 @@ abstract class Foo : IFoo
51785178
<Title>Make field read-only.</Title>
51795179
<DefaultSeverity>Info</DefaultSeverity>
51805180
<IsEnabledByDefault>true</IsEnabledByDefault>
5181+
<ConfigOptions>
5182+
<Option Key="unity_code_analysis.enabled" />
5183+
</ConfigOptions>
51815184
<Samples>
51825185
<Sample>
51835186
<Before><![CDATA[public class Foo
@@ -6117,6 +6120,7 @@ x = "";]]></Before>
61176120
<IsEnabledByDefault>true</IsEnabledByDefault>
61186121
<SupportsFadeOut>true</SupportsFadeOut>
61196122
<ConfigOptions>
6123+
<Option Key="unity_code_analysis.enabled" />
61206124
<Option Key="suppress_unity_script_methods" />
61216125
</ConfigOptions>
61226126
<Options>

src/Analyzers/CSharp/Analysis/AnalyzerOptionIsObsoleteAnalyzer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ public override void Initialize(AnalysisContext context)
5252
Validate(ref context, compilationOptions, options, Flags.RemoveEmptyLineBetweenClosingBraceAndSwitchSection, ref flags, DiagnosticRules.RemoveUnnecessaryBlankLine, ConfigOptions.BlankLineBetweenClosingBraceAndSwitchSection, LegacyConfigOptions.RemoveEmptyLineBetweenClosingBraceAndSwitchSection, "false");
5353
Validate(ref context, compilationOptions, options, Flags.RemoveParenthesesFromConditionOfConditionalExpressionWhenExpressionIsSingleToken, ref flags, DiagnosticRules.AddOrRemoveParenthesesFromConditionInConditionalOperator, ConfigOptions.ConditionalOperatorConditionParenthesesStyle, LegacyConfigOptions.RemoveParenthesesFromConditionOfConditionalExpressionWhenExpressionIsSingleToken, ConfigOptionValues.ConditionalOperatorConditionParenthesesStyle_OmitWhenConditionIsSingleToken);
5454
Validate(ref context, compilationOptions, options, Flags.RemoveParenthesesWhenCreatingNewObject, ref flags, DiagnosticRules.UseImplicitOrExplicitObjectCreation, ConfigOptions.ObjectCreationParenthesesStyle, LegacyConfigOptions.RemoveParenthesesWhenCreatingNewObject, ConfigOptionValues.ObjectCreationParenthesesStyle_Omit);
55+
#pragma warning disable CS0618 // Type or member is obsolete
5556
Validate(ref context, compilationOptions, options, Flags.SuppressUnityScriptMethods, ref flags, DiagnosticRules.RemoveUnusedMemberDeclaration, ConfigOptions.SuppressUnityScriptMethods, LegacyConfigOptions.SuppressUnityScriptMethods, "true");
57+
#pragma warning restore CS0618 // Type or member is obsolete
5658
Validate(ref context, compilationOptions, options, Flags.UseComparisonInsteadPatternMatchingToCheckForNull, ref flags, DiagnosticRules.NormalizeNullCheck, ConfigOptions.NullCheckStyle, LegacyConfigOptions.UseComparisonInsteadPatternMatchingToCheckForNull, ConfigOptionValues.NullCheckStyle_EqualityOperator);
5759
Validate(ref context, compilationOptions, options, Flags.UseImplicitlyTypedArray, ref flags, DiagnosticRules.UseExplicitlyOrImplicitlyTypedArray, ConfigOptions.ArrayCreationTypeStyle, LegacyConfigOptions.UseImplicitlyTypedArray, ConfigOptionValues.ArrayCreationTypeStyle_Implicit);
5860
Validate(ref context, compilationOptions, options, Flags.UseImplicitlyTypedArrayWhenTypeIsObvious, ref flags, DiagnosticRules.UseExplicitlyOrImplicitlyTypedArray, ConfigOptions.ArrayCreationTypeStyle, LegacyConfigOptions.UseImplicitlyTypedArrayWhenTypeIsObvious, ConfigOptionValues.ArrayCreationTypeStyle_ImplicitWhenTypeIsObvious);

src/Analyzers/CSharp/Analysis/EnumSymbolAnalyzer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,9 @@ private static void AnalyzeNamedType(SymbolAnalysisContext context)
198198

199199
if (CSharpUtility.IsSymbolObsolete(symbolInfo1.Symbol)
200200
|| CSharpUtility.IsSymbolObsolete(symbolInfo2.Symbol))
201+
{
201202
continue;
203+
}
202204

203205
var enumMember1 = (EnumMemberDeclarationSyntax)symbolInfo1.Symbol.GetSyntax(context.CancellationToken);
204206

src/Analyzers/CSharp/Analysis/MakeMemberReadOnly/MakeMemberReadOnlyAnalyzer.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public sealed class MakeMemberReadOnlyAnalyzer : BaseDiagnosticAnalyzer
1818
private static readonly MetadataName Microsoft_AspNetCore_Components_CascadingParameterAttribute = MetadataName.Parse("Microsoft.AspNetCore.Components.CascadingParameterAttribute");
1919
private static readonly MetadataName Microsoft_AspNetCore_Components_InjectAttribute = MetadataName.Parse("Microsoft.AspNetCore.Components.InjectAttribute");
2020
private static readonly MetadataName Newtonsoft_Json_JsonPropertyAttribute = MetadataName.Parse("Newtonsoft.Json.JsonPropertyAttribute");
21+
private static readonly MetadataName UnityEngine_SerializeFieldAttribute = MetadataName.Parse("UnityEngine.SerializeFieldAttribute");
2122

2223
private static ImmutableArray<DiagnosticDescriptor> _supportedDiagnostics;
2324

@@ -135,7 +136,9 @@ private static void AnalyzeTypeDeclaration(
135136
&& fieldSymbol.DeclaredAccessibility == Accessibility.Private
136137
&& !fieldSymbol.IsReadOnly
137138
&& !fieldSymbol.IsVolatile
138-
&& ValidateType(fieldSymbol.Type))
139+
&& ValidateType(fieldSymbol.Type)
140+
&& (context.IsUnityCodeAnalysisEnabled() != true
141+
|| !fieldSymbol.HasAttribute(UnityEngine_SerializeFieldAttribute)))
139142
{
140143
symbols[fieldSymbol.Name] = (declarator, fieldSymbol);
141144
}

src/Analyzers/CSharp/Analysis/UnusedMember/UnusedMemberAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ private static void AnalyzeTypeDeclaration(SyntaxNodeAnalysisContext context)
159159
break;
160160

161161
if (declaration.ReturnsVoid()
162-
&& context.GetSuppressUnityScriptMethods() == true)
162+
&& context.IsUnityCodeAnalysisEnabled() == true)
163163
{
164164
if (canContainUnityScriptMethods is null)
165165
{

src/Common/CSharp/Extensions/CodeStyleExtensions.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -565,12 +565,15 @@ public static BlankLineStyle GetBlankLineAfterFileScopedNamespaceDeclaration(thi
565565
return BlankLineStyle.None;
566566
}
567567

568-
public static bool? GetSuppressUnityScriptMethods(this SyntaxNodeAnalysisContext context)
568+
public static bool? IsUnityCodeAnalysisEnabled(this SyntaxNodeAnalysisContext context)
569569
{
570-
if (ConfigOptions.TryGetValueAsBool(context.GetConfigOptions(), ConfigOptions.SuppressUnityScriptMethods, out bool value))
571-
{
570+
if (ConfigOptions.TryGetValueAsBool(context.GetConfigOptions(), ConfigOptions.UnityCodeAnalysisEnabled, out bool value))
572571
return value;
573-
}
572+
573+
#pragma warning disable CS0618 // Type or member is obsolete
574+
if (ConfigOptions.TryGetValueAsBool(context.GetConfigOptions(), ConfigOptions.SuppressUnityScriptMethods, out value))
575+
return value;
576+
#pragma warning restore CS0618 // Type or member is obsolete
574577

575578
if (context.TryGetOptionAsBool(LegacyConfigOptions.SuppressUnityScriptMethods, out value))
576579
return value;

src/Common/ConfigOptionKeys.Generated.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ internal static partial class ConfigOptionKeys
3737
public const string SuppressUnityScriptMethods = "roslynator_suppress_unity_script_methods";
3838
public const string TabLength = "roslynator_tab_length";
3939
public const string TrailingCommaStyle = "roslynator_trailing_comma_style";
40+
public const string UnityCodeAnalysisEnabled = "roslynator_unity_code_analysis.enabled";
4041
public const string UseAnonymousFunctionOrMethodGroup = "roslynator_use_anonymous_function_or_method_group";
4142
public const string UseBlockBodyWhenDeclarationSpansOverMultipleLines = "roslynator_use_block_body_when_declaration_spans_over_multiple_lines";
4243
public const string UseBlockBodyWhenExpressionSpansOverMultipleLines = "roslynator_use_block_body_when_expression_spans_over_multiple_lines";

src/Common/ConfigOptions.Generated.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
// <auto-generated>
44

5+
using System;
56
using System.Collections.Generic;
67

78
namespace Roslynator
@@ -176,11 +177,12 @@ public static partial class ConfigOptions
176177
defaultValuePlaceholder: "true|false",
177178
description: "Prefix field identifier with underscore");
178179

180+
[Obsolete("", error: false)]
179181
public static readonly ConfigOptionDescriptor SuppressUnityScriptMethods = new(
180182
key: ConfigOptionKeys.SuppressUnityScriptMethods,
181183
defaultValue: null,
182184
defaultValuePlaceholder: "true|false",
183-
description: "Suppress Unity script methods");
185+
description: "[deprecated] This option is obsolete, use option 'roslynator_unity_code_analysis.enabled' instead.");
184186

185187
public static readonly ConfigOptionDescriptor TabLength = new(
186188
key: ConfigOptionKeys.TabLength,
@@ -194,6 +196,12 @@ public static partial class ConfigOptions
194196
defaultValuePlaceholder: "include|omit|omit_when_single_line",
195197
description: "Include/omit trailing comma in initializer or enum");
196198

199+
public static readonly ConfigOptionDescriptor UnityCodeAnalysisEnabled = new(
200+
key: ConfigOptionKeys.UnityCodeAnalysisEnabled,
201+
defaultValue: null,
202+
defaultValuePlaceholder: "true|false",
203+
description: "Enable code analysis to detect Unity-specific code");
204+
197205
public static readonly ConfigOptionDescriptor UseAnonymousFunctionOrMethodGroup = new(
198206
key: ConfigOptionKeys.UseAnonymousFunctionOrMethodGroup,
199207
defaultValue: null,

src/ConfigOptions.xml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,14 @@
170170
<ValuePlaceholder>true|false</ValuePlaceholder>
171171
<Description>Prefix field identifier with underscore</Description>
172172
</Option>
173-
<Option Id="SuppressUnityScriptMethods">
173+
<Option Id="SuppressUnityScriptMethods" IsObsolete="true">
174174
<ValuePlaceholder>true|false</ValuePlaceholder>
175-
<Description>Suppress Unity script methods</Description>
175+
<Description>[deprecated] This option is obsolete, use option 'roslynator_unity_code_analysis.enabled' instead.</Description>
176+
</Option>
177+
<Option Id="UnityCodeAnalysisEnabled">
178+
<Key>unity_code_analysis.enabled</Key>
179+
<ValuePlaceholder>true|false</ValuePlaceholder>
180+
<Description>Enable code analysis to detect Unity-specific code</Description>
176181
</Option>
177182
<Option Id="UseAnonymousFunctionOrMethodGroup">
178183
<Description>Use anonymous function or method group</Description>

0 commit comments

Comments
 (0)