diff --git a/src/EFCore.Analyzers/NullableAttributes.cs b/src/EFCore.Analyzers/NullableAttributes.cs
deleted file mode 100644
index 65ae3ef18b8..00000000000
--- a/src/EFCore.Analyzers/NullableAttributes.cs
+++ /dev/null
@@ -1,201 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace System.Diagnostics.CodeAnalysis
-{
-#if !NETSTANDARD2_1
- /// Specifies that null is allowed as an input even if the corresponding type disallows it.
- [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)]
-#if SYSTEM_PRIVATE_CORELIB
- public
-#else
- internal
-#endif
- sealed class AllowNullAttribute : Attribute
- { }
-
- /// Specifies that null is disallowed as an input even if the corresponding type allows it.
- [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)]
-#if SYSTEM_PRIVATE_CORELIB
- public
-#else
- internal
-#endif
- sealed class DisallowNullAttribute : Attribute
- { }
-
- /// Specifies that an output may be null even if the corresponding type disallows it.
- [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)]
-#if SYSTEM_PRIVATE_CORELIB
- public
-#else
- internal
-#endif
- sealed class MaybeNullAttribute : Attribute
- { }
-
- /// Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.
- [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)]
-#if SYSTEM_PRIVATE_CORELIB
- public
-#else
- internal
-#endif
- sealed class NotNullAttribute : Attribute
- { }
-
- /// Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it.
- [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
-#if SYSTEM_PRIVATE_CORELIB
- public
-#else
- internal
-#endif
- sealed class MaybeNullWhenAttribute : Attribute
- {
- /// Initializes the attribute with the specified return value condition.
- ///
- /// The return value condition. If the method returns this value, the associated parameter may be null.
- ///
- public MaybeNullWhenAttribute(bool returnValue) => ReturnValue = returnValue;
-
- /// Gets the return value condition.
- public bool ReturnValue { get; }
- }
-
- /// Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it.
- [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
-#if SYSTEM_PRIVATE_CORELIB
- public
-#else
- internal
-#endif
- sealed class NotNullWhenAttribute : Attribute
- {
- /// Initializes the attribute with the specified return value condition.
- ///
- /// The return value condition. If the method returns this value, the associated parameter will not be null.
- ///
- public NotNullWhenAttribute(bool returnValue) => ReturnValue = returnValue;
-
- /// Gets the return value condition.
- public bool ReturnValue { get; }
- }
-
- /// Specifies that the output will be non-null if the named parameter is non-null.
- [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false)]
-#if SYSTEM_PRIVATE_CORELIB
- public
-#else
- internal
-#endif
- sealed class NotNullIfNotNullAttribute : Attribute
- {
- /// Initializes the attribute with the associated parameter name.
- ///
- /// The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
- ///
- public NotNullIfNotNullAttribute(string parameterName) => ParameterName = parameterName;
-
- /// Gets the associated parameter name.
- public string ParameterName { get; }
- }
-
- /// Applied to a method that will never return under any circumstance.
- [AttributeUsage(AttributeTargets.Method, Inherited = false)]
-#if SYSTEM_PRIVATE_CORELIB
- public
-#else
- internal
-#endif
- sealed class DoesNotReturnAttribute : Attribute
- { }
-
- /// Specifies that the method will not return if the associated Boolean parameter is passed the specified value.
- [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
-#if SYSTEM_PRIVATE_CORELIB
- public
-#else
- internal
-#endif
- sealed class DoesNotReturnIfAttribute : Attribute
- {
- /// Initializes the attribute with the specified parameter value.
- ///
- /// The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
- /// the associated parameter matches this value.
- ///
- public DoesNotReturnIfAttribute(bool parameterValue) => ParameterValue = parameterValue;
-
- /// Gets the condition parameter value.
- public bool ParameterValue { get; }
- }
-#endif
-
- /// Specifies that the method or property will ensure that the listed field and property members have not-null values.
- [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
-#if SYSTEM_PRIVATE_CORELIB
- public
-#else
- internal
-#endif
- sealed class MemberNotNullAttribute : Attribute
- {
- /// Initializes the attribute with a field or property member.
- ///
- /// The field or property member that is promised to be not-null.
- ///
- public MemberNotNullAttribute(string member) => Members = [member];
-
- /// Initializes the attribute with the list of field and property members.
- ///
- /// The list of field and property members that are promised to be not-null.
- ///
- public MemberNotNullAttribute(params string[] members) => Members = members;
-
- /// Gets field or property member names.
- public string[] Members { get; }
- }
-
- /// Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.
- [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
-#if SYSTEM_PRIVATE_CORELIB
- public
-#else
- internal
-#endif
- sealed class MemberNotNullWhenAttribute : Attribute
- {
- /// Initializes the attribute with the specified return value condition and a field or property member.
- ///
- /// The return value condition. If the method returns this value, the associated field or property member will not be null.
- ///
- ///
- /// The field or property member that is promised to be not-null.
- ///
- public MemberNotNullWhenAttribute(bool returnValue, string member)
- {
- ReturnValue = returnValue;
- Members = [member];
- }
-
- /// Initializes the attribute with the specified return value condition and list of field and property members.
- ///
- /// The return value condition. If the method returns this value, the associated field and property members will not be null.
- ///
- ///
- /// The list of field and property members that are promised to be not-null.
- ///
- public MemberNotNullWhenAttribute(bool returnValue, params string[] members)
- {
- ReturnValue = returnValue;
- Members = members;
- }
-
- /// Gets the return value condition.
- public bool ReturnValue { get; }
-
- /// Gets field or property member names.
- public string[] Members { get; }
- }
-}
diff --git a/src/EFCore.Analyzers/StringsUsageInRawQueriesDiagnosticAnalyzer.cs b/src/EFCore.Analyzers/StringsUsageInRawQueriesDiagnosticAnalyzer.cs
index 3461b63aacd..faa7e1f7990 100644
--- a/src/EFCore.Analyzers/StringsUsageInRawQueriesDiagnosticAnalyzer.cs
+++ b/src/EFCore.Analyzers/StringsUsageInRawQueriesDiagnosticAnalyzer.cs
@@ -2,7 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Immutable;
-using System.Diagnostics.CodeAnalysis;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;
@@ -173,23 +172,22 @@ internal static string GetReplacementMethodName(string oldName)
}
private static DiagnosticDescriptor? AnalyzeInvocation(IInvocationOperation invocation)
- {
- // ...an interpolated string
- if (invocation.Arguments[1].Value is IInterpolatedStringOperation interpolatedString
- && AnalyzeInterpolatedString(interpolatedString))
+ => invocation.Arguments[1].Value switch
{
- return InterpolatedStringDescriptor;
- }
+ // ...an interpolated string
+ IInterpolatedStringOperation interpolatedString when AnalyzeInterpolatedString(interpolatedString)
+ => InterpolatedStringDescriptor,
- // ...a string concatenation
- if (TryGetStringConcatenation(invocation.Arguments[1].Value, out var concatenation)
- && AnalyzeConcatenation(concatenation))
- {
- return StringConcatenationDescriptor;
- }
+ // ...a string concatenation
+ IBinaryOperation
+ {
+ OperatorKind: BinaryOperatorKind.Add,
+ Type.SpecialType: SpecialType.System_String,
+ } concatenation when AnalyzeConcatenation(concatenation)
+ => StringConcatenationDescriptor,
- return null;
- }
+ _ => null,
+ };
private static bool AnalyzeInterpolatedString(IInterpolatedStringOperation interpolatedString)
{
@@ -215,22 +213,6 @@ private static bool AnalyzeInterpolatedString(IInterpolatedStringOperation inter
return false;
}
- private static bool TryGetStringConcatenation(IOperation operation, [NotNullWhen(true)] out IBinaryOperation? concatenation)
- {
- if (operation is IBinaryOperation
- {
- OperatorKind: BinaryOperatorKind.Add,
- Type.SpecialType: SpecialType.System_String,
- } binaryOperation)
- {
- concatenation = binaryOperation;
- return true;
- }
-
- concatenation = default;
- return false;
- }
-
private static bool AnalyzeConcatenation(IBinaryOperation operation)
{
var left = operation.LeftOperand;
diff --git a/test/EFCore.Analyzers.Tests/StringInterpolationnRawQueriesAnalyzerTests.cs b/test/EFCore.Analyzers.Tests/StringInterpolationInRawQueriesAnalyzerTests.cs
similarity index 98%
rename from test/EFCore.Analyzers.Tests/StringInterpolationnRawQueriesAnalyzerTests.cs
rename to test/EFCore.Analyzers.Tests/StringInterpolationInRawQueriesAnalyzerTests.cs
index 7b18727dd2f..e375ce540cb 100644
--- a/test/EFCore.Analyzers.Tests/StringInterpolationnRawQueriesAnalyzerTests.cs
+++ b/test/EFCore.Analyzers.Tests/StringInterpolationInRawQueriesAnalyzerTests.cs
@@ -7,7 +7,7 @@ namespace Microsoft.EntityFrameworkCore;
using Verify = CSharpCodeFixVerifier;
-public class StringInterpolationnRawQueriesAnalyzerTests
+public class StringInterpolationInRawQueriesAnalyzerTests
{
public static readonly TheoryData DoNotReportData =
[