From 18c930b955447dd884f5f5c874e41b55983a3c11 Mon Sep 17 00:00:00 2001 From: Lilian Kasem Date: Tue, 21 Feb 2023 14:12:25 -0800 Subject: [PATCH 1/4] Add deferred binding attribute analyzer and cleanup project --- sdk/Sdk.Analyzers/Constants.cs | 5 +- .../DeferredBindingAttributeNotSupported.cs | 58 ++++++++ sdk/Sdk.Analyzers/DiagnosticDescriptors.cs | 11 +- .../AttributeDataExtensions.cs | 19 ++- .../MethodSymbolExtensions.cs | 0 .../ParameterSymbolExtensions.cs | 0 .../{ => Extensions}/TypeSymbolExtensions.cs | 0 .../WebJobsAttributesNotSupported.cs | 4 +- .../AsyncVoidAnalyzerTests.cs | 12 +- ...ferredBindingAttributeNotSupportedTests.cs | 134 ++++++++++++++++++ .../Sdk.Analyzers.Tests.csproj | 6 +- .../WebJobsAttributesNotSupportedTests.cs | 14 +- 12 files changed, 238 insertions(+), 25 deletions(-) create mode 100644 sdk/Sdk.Analyzers/DeferredBindingAttributeNotSupported.cs rename sdk/Sdk.Analyzers/{ => Extensions}/AttributeDataExtensions.cs (64%) rename sdk/Sdk.Analyzers/{ => Extensions}/MethodSymbolExtensions.cs (100%) rename sdk/Sdk.Analyzers/{ => Extensions}/ParameterSymbolExtensions.cs (100%) rename sdk/Sdk.Analyzers/{ => Extensions}/TypeSymbolExtensions.cs (100%) rename test/Sdk.Analyzers.Tests/{Sdk.Analyzers.Tests => }/AsyncVoidAnalyzerTests.cs (96%) create mode 100644 test/Sdk.Analyzers.Tests/DeferredBindingAttributeNotSupportedTests.cs rename test/Sdk.Analyzers.Tests/{Sdk.Analyzers.Tests => }/Sdk.Analyzers.Tests.csproj (78%) rename test/Sdk.Analyzers.Tests/{Sdk.Analyzers.Tests => }/WebJobsAttributesNotSupportedTests.cs (95%) diff --git a/sdk/Sdk.Analyzers/Constants.cs b/sdk/Sdk.Analyzers/Constants.cs index b9ecc9db6..b526a6363 100644 --- a/sdk/Sdk.Analyzers/Constants.cs +++ b/sdk/Sdk.Analyzers/Constants.cs @@ -9,7 +9,10 @@ internal static class Types { public const string WorkerFunctionAttribute = "Microsoft.Azure.Functions.Worker.FunctionAttribute"; public const string WebJobsBindingAttribute = "Microsoft.Azure.WebJobs.Description.BindingAttribute"; - + public const string SupportsDeferredBindingAttribute = "Microsoft.Azure.Functions.Worker.Extensions.Abstractions.SupportsDeferredBindingAttribute"; + public const string InputBindingAttribute = "Microsoft.Azure.Functions.Worker.Extensions.Abstractions.InputBindingAttribute"; + public const string TriggerBindingAttribute = "Microsoft.Azure.Functions.Worker.Extensions.Abstractions.TriggerBindingAttribute"; + // System types internal const string TaskType = "System.Threading.Tasks.Task"; } diff --git a/sdk/Sdk.Analyzers/DeferredBindingAttributeNotSupported.cs b/sdk/Sdk.Analyzers/DeferredBindingAttributeNotSupported.cs new file mode 100644 index 000000000..459e1b2ce --- /dev/null +++ b/sdk/Sdk.Analyzers/DeferredBindingAttributeNotSupported.cs @@ -0,0 +1,58 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +using System; +using System.Collections.Immutable; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace Microsoft.Azure.Functions.Worker.Sdk.Analyzers +{ + [DiagnosticAnalyzer(LanguageNames.CSharp)] + public class DeferredBindingAttributeNotSupported : DiagnosticAnalyzer + { + public override ImmutableArray SupportedDiagnostics { get { return ImmutableArray.Create(DiagnosticDescriptors.DeferredBindingAttributeNotSupported); } } + + public override void Initialize(AnalysisContext context) + { + context.EnableConcurrentExecution(); + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze); + context.RegisterSymbolAction(AnalyzeMethod, SymbolKind.NamedType); + } + + private static void AnalyzeMethod(SymbolAnalysisContext symbolAnalysisContext) + { + var symbol = (INamedTypeSymbol)symbolAnalysisContext.Symbol; + + var attributes = symbol.GetAttributes(); + + if (attributes.IsEmpty) + { + return; + } + + foreach (var attribute in attributes) + { + if (attribute.IsSupportsDeferredBindingAttribute() && !IsInputOrTriggerBinding(symbol)) + { + var location = Location.Create(attribute.ApplicationSyntaxReference.SyntaxTree, attribute.ApplicationSyntaxReference.Span); + var diagnostic = Diagnostic.Create(DiagnosticDescriptors.DeferredBindingAttributeNotSupported, location, attribute.AttributeClass.Name); + symbolAnalysisContext.ReportDiagnostic(diagnostic); + } + } + } + + private static bool IsInputOrTriggerBinding(INamedTypeSymbol symbol) + { + var baseType = symbol.BaseType?.ToDisplayString(); + + if (string.Equals(baseType,Constants.Types.InputBindingAttribute, StringComparison.Ordinal) + || string.Equals(baseType,Constants.Types.TriggerBindingAttribute, StringComparison.Ordinal)) + { + return true; + } + + return false; + } + } +} diff --git a/sdk/Sdk.Analyzers/DiagnosticDescriptors.cs b/sdk/Sdk.Analyzers/DiagnosticDescriptors.cs index 613dfc39c..2a094e367 100644 --- a/sdk/Sdk.Analyzers/DiagnosticDescriptors.cs +++ b/sdk/Sdk.Analyzers/DiagnosticDescriptors.cs @@ -1,9 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. -using System; -using System.Collections.Generic; -using System.Text; using Microsoft.CodeAnalysis; namespace Microsoft.Azure.Functions.Worker.Sdk.Analyzers @@ -16,13 +13,17 @@ private static DiagnosticDescriptor Create(string id, string title,string messag return new DiagnosticDescriptor(id, title, messageFormat, category, severity, isEnabledByDefault: true, helpLinkUri: helpLink); } - public static DiagnosticDescriptor WebJobsAttributesAreNotSuppoted { get; } + public static DiagnosticDescriptor WebJobsAttributesAreNotSupported { get; } = Create(id: "AZFW0001", title: "Invalid binding attributes", messageFormat: "The attribute '{0}' is a WebJobs attribute and not supported in the .NET Worker (Isolated Process).", category: Constants.DiagnosticsCategories.Usage, severity: DiagnosticSeverity.Error); - + public static DiagnosticDescriptor AsyncVoidReturnType { get; } = Create(id: "AZFW0002", title: "Avoid async void methods", messageFormat: "Do not use void as the return type for async methods. Use Task instead.", category: Constants.DiagnosticsCategories.Usage, severity: DiagnosticSeverity.Error); + public static DiagnosticDescriptor DeferredBindingAttributeNotSupported{ get; } + = Create(id: "AZFW0003", title: "Invalid class attribute", messageFormat: "The attribute '{0}' can only be used on trigger and input binding attributes.", + category: Constants.DiagnosticsCategories.Usage, severity: DiagnosticSeverity.Error); + } } diff --git a/sdk/Sdk.Analyzers/AttributeDataExtensions.cs b/sdk/Sdk.Analyzers/Extensions/AttributeDataExtensions.cs similarity index 64% rename from sdk/Sdk.Analyzers/AttributeDataExtensions.cs rename to sdk/Sdk.Analyzers/Extensions/AttributeDataExtensions.cs index ebec79ad5..26663c774 100644 --- a/sdk/Sdk.Analyzers/AttributeDataExtensions.cs +++ b/sdk/Sdk.Analyzers/Extensions/AttributeDataExtensions.cs @@ -22,7 +22,7 @@ public static bool IsWebJobAttribute(this AttributeData attributeData) { return false; } - + foreach (var attribute in attributeAttributes) { if (string.Equals(attribute.AttributeClass?.ToDisplayString(), Constants.Types.WebJobsBindingAttribute, @@ -34,4 +34,21 @@ public static bool IsWebJobAttribute(this AttributeData attributeData) return false; } + + /// + /// Checks if an attribute is the SupportsDeferredBinding attribute. + /// + /// The attribute to check. + /// A boolean value indicating whether the attribute is a SupportsDeferredBinding attribute. + public static bool IsSupportsDeferredBindingAttribute(this AttributeData attributeData) + { + if (string.Equals(attributeData.AttributeClass?.ToDisplayString(), + Constants.Types.SupportsDeferredBindingAttribute, + StringComparison.Ordinal)) + { + return true; + } + + return false; + } } diff --git a/sdk/Sdk.Analyzers/MethodSymbolExtensions.cs b/sdk/Sdk.Analyzers/Extensions/MethodSymbolExtensions.cs similarity index 100% rename from sdk/Sdk.Analyzers/MethodSymbolExtensions.cs rename to sdk/Sdk.Analyzers/Extensions/MethodSymbolExtensions.cs diff --git a/sdk/Sdk.Analyzers/ParameterSymbolExtensions.cs b/sdk/Sdk.Analyzers/Extensions/ParameterSymbolExtensions.cs similarity index 100% rename from sdk/Sdk.Analyzers/ParameterSymbolExtensions.cs rename to sdk/Sdk.Analyzers/Extensions/ParameterSymbolExtensions.cs diff --git a/sdk/Sdk.Analyzers/TypeSymbolExtensions.cs b/sdk/Sdk.Analyzers/Extensions/TypeSymbolExtensions.cs similarity index 100% rename from sdk/Sdk.Analyzers/TypeSymbolExtensions.cs rename to sdk/Sdk.Analyzers/Extensions/TypeSymbolExtensions.cs diff --git a/sdk/Sdk.Analyzers/WebJobsAttributesNotSupported.cs b/sdk/Sdk.Analyzers/WebJobsAttributesNotSupported.cs index 5b74f5706..0c1485ffa 100644 --- a/sdk/Sdk.Analyzers/WebJobsAttributesNotSupported.cs +++ b/sdk/Sdk.Analyzers/WebJobsAttributesNotSupported.cs @@ -10,7 +10,7 @@ namespace Microsoft.Azure.Functions.Worker.Sdk.Analyzers [DiagnosticAnalyzer(LanguageNames.CSharp)] public class WebJobsAttributesNotSupported : DiagnosticAnalyzer { - public override ImmutableArray SupportedDiagnostics { get { return ImmutableArray.Create(DiagnosticDescriptors.WebJobsAttributesAreNotSuppoted); } } + public override ImmutableArray SupportedDiagnostics { get { return ImmutableArray.Create(DiagnosticDescriptors.WebJobsAttributesAreNotSupported); } } public override void Initialize(AnalysisContext context) { @@ -34,7 +34,7 @@ public override void Initialize(AnalysisContext context) foreach (var attribute in webjobsAttributes) { var location = Location.Create(attribute.ApplicationSyntaxReference.SyntaxTree, attribute.ApplicationSyntaxReference.Span); - c.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.WebJobsAttributesAreNotSuppoted, location, attribute.AttributeClass.Name)); + c.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.WebJobsAttributesAreNotSupported, location, attribute.AttributeClass.Name)); } } }, SymbolKind.Method); diff --git a/test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests/AsyncVoidAnalyzerTests.cs b/test/Sdk.Analyzers.Tests/AsyncVoidAnalyzerTests.cs similarity index 96% rename from test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests/AsyncVoidAnalyzerTests.cs rename to test/Sdk.Analyzers.Tests/AsyncVoidAnalyzerTests.cs index b7b2393a7..0e3a8ae7a 100644 --- a/test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests/AsyncVoidAnalyzerTests.cs +++ b/test/Sdk.Analyzers.Tests/AsyncVoidAnalyzerTests.cs @@ -1,5 +1,5 @@ using Xunit; -using AnalizerTest = Microsoft.CodeAnalysis.CSharp.Testing.CSharpAnalyzerTest; +using AnalyzerTest = Microsoft.CodeAnalysis.CSharp.Testing.CSharpAnalyzerTest; using AnalyzerVerifier = Microsoft.CodeAnalysis.CSharp.Testing.XUnit.AnalyzerVerifier; using CodeFixTest = Microsoft.CodeAnalysis.CSharp.Testing.CSharpCodeFixTest; using CodeFixVerifier = Microsoft.CodeAnalysis.CSharp.Testing.CSharpCodeFixVerifier; @@ -35,7 +35,7 @@ public static async void Run([QueueTrigger(""myqueue-items"")] string myQueueIte } } }"; - var test = new AnalizerTest + var test = new AnalyzerTest { ReferenceAssemblies = LoadRequiredDependencyAssemblies(), TestCode = inputCode @@ -72,7 +72,7 @@ public static async Task Run([QueueTrigger(""myqueue-items"")] string myQueueIte } } }"; - var test = new AnalizerTest + var test = new AnalyzerTest { ReferenceAssemblies = LoadRequiredDependencyAssemblies(), TestCode = inputCode @@ -80,7 +80,7 @@ public static async Task Run([QueueTrigger(""myqueue-items"")] string myQueueIte await test.RunAsync(); } - + [Fact] public async Task AnalyzerDoesNotReportForNonAsyncCode() { @@ -100,7 +100,7 @@ public static void Run([QueueTrigger(""myqueue-items"")] string myQueueItem, Fun } } }"; - var test = new AnalizerTest + var test = new AnalyzerTest { ReferenceAssemblies = LoadRequiredDependencyAssemblies(), TestCode = inputCode @@ -165,7 +165,7 @@ public static async Task Run([QueueTrigger(""myqueue-items"")] string myQueueIte test.ExpectedDiagnostics.AddRange(new[] { expectedDiagnosticResult }); await test.RunAsync(CancellationToken.None); } - + private static ReferenceAssemblies LoadRequiredDependencyAssemblies() { var referenceAssemblies = ReferenceAssemblies.Net.Net50.WithPackages(ImmutableArray.Create( diff --git a/test/Sdk.Analyzers.Tests/DeferredBindingAttributeNotSupportedTests.cs b/test/Sdk.Analyzers.Tests/DeferredBindingAttributeNotSupportedTests.cs new file mode 100644 index 000000000..776ac2e61 --- /dev/null +++ b/test/Sdk.Analyzers.Tests/DeferredBindingAttributeNotSupportedTests.cs @@ -0,0 +1,134 @@ +using Xunit; +using AnalyzerTest = Microsoft.CodeAnalysis.CSharp.Testing.CSharpAnalyzerTest; +using Verify = Microsoft.CodeAnalysis.CSharp.Testing.XUnit.AnalyzerVerifier; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.Testing; +using System.Collections.Immutable; + +namespace Sdk.Analyzers.Tests +{ + public class DeferredBindingAttributeNotSupportedTests + { + [Fact] + public async Task TriggerBindingClass_SupportsDeferredBindingAttribute_Diagnostics_NotExpected() + { + string testCode = @" + using Microsoft.Azure.Functions.Worker.Extensions.Abstractions; + + namespace TestBindings + { + [SupportsDeferredBinding] + public sealed class BlobTriggerAttribute : TriggerBindingAttribute + { + } + }"; + + var test = new AnalyzerTest + { + ReferenceAssemblies = ReferenceAssemblies.Net.Net50.WithPackages(ImmutableArray.Create( + new PackageIdentity("Microsoft.Azure.Functions.Worker", "1.12.1-preview1"), + new PackageIdentity("Microsoft.Azure.Functions.Worker.Sdk", "1.9.0-preview1"), + new PackageIdentity("Microsoft.Azure.Functions.Worker.Extensions.Abstractions", "1.2.0-preview1"))), + + TestCode = testCode + }; + + // test.ExpectedDiagnostics is an empty collection. + + await test.RunAsync(); + } + + [Fact] + public async Task InputBindingClass_SupportsDeferredBindingAttribute_Diagnostics_NotExpected() + { + string testCode = @" + using Microsoft.Azure.Functions.Worker.Extensions.Abstractions; + + namespace TestBindings + { + [SupportsDeferredBinding] + public sealed class BlobInputAttribute : InputBindingAttribute + { + } + }"; + + var test = new AnalyzerTest + { + ReferenceAssemblies = ReferenceAssemblies.Net.Net50.WithPackages(ImmutableArray.Create( + new PackageIdentity("Microsoft.Azure.Functions.Worker", "1.12.1-preview1"), + new PackageIdentity("Microsoft.Azure.Functions.Worker.Sdk", "1.9.0-preview1"), + new PackageIdentity("Microsoft.Azure.Functions.Worker.Extensions.Abstractions", "1.2.0-preview1"))), + + TestCode = testCode + }; + + // test.ExpectedDiagnostics is an empty collection. + + await test.RunAsync(); + } + + [Fact] + public async Task OutputBindingClass_SupportsDeferredBindingAttribute_Diagnostic_Expected() + { + string testCode = @" + using Microsoft.Azure.Functions.Worker.Extensions.Abstractions; + + namespace TestBindings + { + [SupportsDeferredBinding] + public sealed class BlobOutputAttribute : OutputBindingAttribute + { + } + }"; + + var test = new AnalyzerTest + { + ReferenceAssemblies = ReferenceAssemblies.Net.Net50.WithPackages(ImmutableArray.Create( + new PackageIdentity("Microsoft.Azure.Functions.Worker", "1.12.1-preview1"), + new PackageIdentity("Microsoft.Azure.Functions.Worker.Sdk", "1.9.0-preview1"), + new PackageIdentity("Microsoft.Azure.Functions.Worker.Extensions.Abstractions", "1.2.0-preview1"))), + + TestCode = testCode + }; + + test.ExpectedDiagnostics.Add(Verify.Diagnostic() + .WithSeverity(Microsoft.CodeAnalysis.DiagnosticSeverity.Error) + .WithSpan(6, 22, 6, 45) + .WithArguments("SupportsDeferredBindingAttribute")); + + await test.RunAsync(); + } + + [Fact] + public async Task ClassWithoutBase_SupportsDeferredBindingAttribute_Diagnostic_Expected() + { + string testCode = @" + using Microsoft.Azure.Functions.Worker.Extensions.Abstractions; + + namespace TestBindings + { + [SupportsDeferredBinding] + public sealed class JustAnotherClass + { + } + }"; + + var test = new AnalyzerTest + { + ReferenceAssemblies = ReferenceAssemblies.Net.Net50.WithPackages(ImmutableArray.Create( + new PackageIdentity("Microsoft.Azure.Functions.Worker", "1.12.1-preview1"), + new PackageIdentity("Microsoft.Azure.Functions.Worker.Sdk", "1.9.0-preview1"), + new PackageIdentity("Microsoft.Azure.Functions.Worker.Extensions.Abstractions", "1.2.0-preview1"))), + + TestCode = testCode + }; + + test.ExpectedDiagnostics.Add(Verify.Diagnostic() + .WithSeverity(Microsoft.CodeAnalysis.DiagnosticSeverity.Error) + .WithSpan(6, 22, 6, 45) + .WithArguments("SupportsDeferredBindingAttribute")); + + await test.RunAsync(); + } + } +} diff --git a/test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests.csproj b/test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests.csproj similarity index 78% rename from test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests.csproj rename to test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests.csproj index a0f2feec2..b48449823 100644 --- a/test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests.csproj +++ b/test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests.csproj @@ -22,9 +22,9 @@ - - - + + + diff --git a/test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests/WebJobsAttributesNotSupportedTests.cs b/test/Sdk.Analyzers.Tests/WebJobsAttributesNotSupportedTests.cs similarity index 95% rename from test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests/WebJobsAttributesNotSupportedTests.cs rename to test/Sdk.Analyzers.Tests/WebJobsAttributesNotSupportedTests.cs index 99d83d9cb..040a29c91 100644 --- a/test/Sdk.Analyzers.Tests/Sdk.Analyzers.Tests/WebJobsAttributesNotSupportedTests.cs +++ b/test/Sdk.Analyzers.Tests/WebJobsAttributesNotSupportedTests.cs @@ -1,5 +1,5 @@ using Xunit; -using AnalizerTest = Microsoft.CodeAnalysis.CSharp.Testing.CSharpAnalyzerTest; +using AnalyzerTest = Microsoft.CodeAnalysis.CSharp.Testing.CSharpAnalyzerTest; using Verify = Microsoft.CodeAnalysis.CSharp.Testing.XUnit.AnalyzerVerifier; using System.Threading.Tasks; using Microsoft.CodeAnalysis.Testing; @@ -28,7 +28,7 @@ public static void Run([HttpTrigger(AuthorizationLevel.Anonymous, ""get"")] Http } } }"; - var test = new AnalizerTest + var test = new AnalyzerTest { // TODO: This needs to pull from a local source ReferenceAssemblies = ReferenceAssemblies.Net.Net50.WithPackages(ImmutableArray.Create( @@ -43,7 +43,7 @@ public static void Run([HttpTrigger(AuthorizationLevel.Anonymous, ""get"")] Http test.ExpectedDiagnostics.Add(Verify.Diagnostic().WithSeverity(Microsoft.CodeAnalysis.DiagnosticSeverity.Error) .WithSpan(12, 105, 12, 122).WithArguments("TimerTriggerAttribute")); - + await test.RunAsync(); } @@ -67,7 +67,7 @@ public static string Run([TimerTrigger(""0 */1 * * * *"")] MyInfo myTimer) public record MyInfo(bool IsPastDue); }"; - var test = new AnalizerTest + var test = new AnalyzerTest { ReferenceAssemblies = ReferenceAssemblies.Net.Net50.WithPackages(ImmutableArray.Create( new PackageIdentity("Microsoft.Azure.Functions.Worker", "1.10.0"), @@ -98,14 +98,14 @@ public static class Function1 { [Function(""Function1"")] [return: Microsoft.Azure.WebJobs.Queue(""dest-q"")] - public static string Run([TimerTrigger(""0 */1 * * * *"")] object myTimer, + public static string Run([TimerTrigger(""0 */1 * * * *"")] object myTimer, [Blob(""samples-workitems/{queueTrigger}"", FileAccess.Read)] Stream myBlob) { return ""Azure""; } } }"; - var test = new AnalizerTest + var test = new AnalyzerTest { ReferenceAssemblies = ReferenceAssemblies.Net.Net50.WithPackages(ImmutableArray.Create( new PackageIdentity("Microsoft.Azure.Functions.Worker", "1.10.0"), @@ -142,7 +142,7 @@ public void Run([TimerTrigger(""0 */5 * * * *"")] object myTimer) } } }"; - var test = new AnalizerTest + var test = new AnalyzerTest { // TODO: This needs to pull from a local source ReferenceAssemblies = ReferenceAssemblies.Net.Net50.WithPackages(ImmutableArray.Create( From 022a09be583fc3f5f31c82bb4b191b96c4ea923b Mon Sep 17 00:00:00 2001 From: Lilian Kasem Date: Tue, 21 Feb 2023 14:15:19 -0800 Subject: [PATCH 2/4] update release note --- sdk/release_notes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdk/release_notes.md b/sdk/release_notes.md index cb7322a01..a7e030f0c 100644 --- a/sdk/release_notes.md +++ b/sdk/release_notes.md @@ -2,3 +2,5 @@ + +- Add analyzer for SupportsDeferredBindingAttribute #1367 From b62464cc9246ea9067e1c2b9d106a2aeaa3cfa8b Mon Sep 17 00:00:00 2001 From: Lilian Kasem Date: Tue, 21 Feb 2023 14:18:07 -0800 Subject: [PATCH 3/4] Update sln to remove extra "Sdk.Analyzers.Tests" --- DotNetWorker.sln | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DotNetWorker.sln b/DotNetWorker.sln index d57e0c7fe..397438389 100644 --- a/DotNetWorker.sln +++ b/DotNetWorker.sln @@ -70,7 +70,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Worker.Extensions.Kafka", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sdk.Analyzers", "sdk\Sdk.Analyzers\Sdk.Analyzers.csproj", "{055D602D-D2B3-416B-AC59-1972D832032A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sdk.Analyzers.Tests", "test\Sdk.Analyzers.Tests\Sdk.Analyzers.Tests\Sdk.Analyzers.Tests.csproj", "{A75EA1E1-2801-460C-87C0-DE6A82D30851}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sdk.Analyzers.Tests", "test\Sdk.Analyzers.Tests\Sdk.Analyzers.Tests.csproj", "{A75EA1E1-2801-460C-87C0-DE6A82D30851}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{083592CA-7DAB-44CE-8979-44FAFA46AEC3}" EndProject From 16fc6c1dd05150625f8b2fd32e8f6f97ad807832 Mon Sep 17 00:00:00 2001 From: Lilian Kasem Date: Wed, 22 Feb 2023 14:05:03 -0800 Subject: [PATCH 4/4] fix analyzer ref --- .../DeferredBindingAttributeNotSupportedTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Sdk.Analyzers.Tests/DeferredBindingAttributeNotSupportedTests.cs b/test/Sdk.Analyzers.Tests/DeferredBindingAttributeNotSupportedTests.cs index 776ac2e61..dc4908f3e 100644 --- a/test/Sdk.Analyzers.Tests/DeferredBindingAttributeNotSupportedTests.cs +++ b/test/Sdk.Analyzers.Tests/DeferredBindingAttributeNotSupportedTests.cs @@ -1,6 +1,6 @@ using Xunit; -using AnalyzerTest = Microsoft.CodeAnalysis.CSharp.Testing.CSharpAnalyzerTest; -using Verify = Microsoft.CodeAnalysis.CSharp.Testing.XUnit.AnalyzerVerifier; +using AnalyzerTest = Microsoft.CodeAnalysis.CSharp.Testing.CSharpAnalyzerTest; +using Verify = Microsoft.CodeAnalysis.CSharp.Testing.XUnit.AnalyzerVerifier; using System.Threading.Tasks; using Microsoft.CodeAnalysis.Testing; using System.Collections.Immutable;