diff --git a/Directory.Packages.props b/Directory.Packages.props index 56f9bfb..8503447 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -36,8 +36,8 @@ - - + + diff --git a/SourceKit.Sample/Generators/ValidArrayQueryUsage.cs b/SourceKit.Sample/Generators/ValidArrayQueryUsage.cs new file mode 100644 index 0000000..4e7c542 --- /dev/null +++ b/SourceKit.Sample/Generators/ValidArrayQueryUsage.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using SourceKit.Generators.Builder.Annotations; + +namespace SourceKit.Sample.Generators; + +file class ArrayQueryUsage +{ + public void A() + { + var query = ArrayQuery1.Build(x => x.WithValue("aboba")); + } +} + +[GenerateBuilder] +file record ArrayQuery1(Guid[] Ids, [RequiredValue] string Value, string NotRequiredValue = "aboba") +{ + public static ArrayQuery1 Build(Func action) + { + return action(new Builder()).Build(); + } + + public sealed class Builder + { + private readonly List _ids; + private string _value; + + public Builder() + { + _ids = new List(); + } + + [InitializesProperty(nameof(Ids))] + public Builder WithId(Guid element) + { + _ids.Add(element); + return this; + } + + [InitializesPropertyAttribute(nameof(Ids))] + public Builder WithIds(IEnumerable elements) + { + _ids.AddRange(elements); + return this; + } + + [InitializesPropertyAttribute(nameof(Value))] + public Builder WithValue(string value) + { + _value = value; + return this; + } + + public ArrayQuery1 Build() + { + return new ArrayQuery1(_ids.Distinct().ToArray(), string.Empty, string.Empty); + } + } +} \ No newline at end of file diff --git a/src/generators/SourceKit.Generators.Builder/Analyzers/RequiredValueAnalyzer.cs b/src/generators/SourceKit.Generators.Builder/Analyzers/RequiredValueAnalyzer.cs index 51df955..3020dc8 100644 --- a/src/generators/SourceKit.Generators.Builder/Analyzers/RequiredValueAnalyzer.cs +++ b/src/generators/SourceKit.Generators.Builder/Analyzers/RequiredValueAnalyzer.cs @@ -82,7 +82,7 @@ private void AnalyzeOperation(OperationAnalysisContext context) .Where(x => x.GetAttributes().HasAttribute(requiredValueAttribute)) .Select(x => x.Name); - IEnumerable descendantInvocations = modelTypeMembers + IEnumerable descendantInvocations = operation.Descendants() .OfType(); IEnumerable initializedPropertyNames = GetInitializedPropertyNames(descendantInvocations); diff --git a/tests/SourceKit.Tests/Generators/RequiredValueAnalyzerTests.cs b/tests/SourceKit.Tests/Generators/RequiredValueAnalyzerTests.cs index 35c693e..44b8a6d 100644 --- a/tests/SourceKit.Tests/Generators/RequiredValueAnalyzerTests.cs +++ b/tests/SourceKit.Tests/Generators/RequiredValueAnalyzerTests.cs @@ -13,7 +13,7 @@ namespace SourceKit.Tests.Generators; public class RequiredValueAnalyzerTests { [Fact] - public async Task A() + public async Task RequiredValue_ShouldProduceError_WhenRequiredValueNotDefined() { var usageFile = await SourceFile.LoadAsync("SourceKit.Sample/Generators/ArrayQueryUsage.cs"); @@ -37,4 +37,25 @@ public async Task A() await test.RunAsync(); } + + [Fact] + public async Task RequiredValue_ShouldProduceNoError_WhenRequiredValueDefined() + { + var usageFile = await SourceFile.LoadAsync("SourceKit.Sample/Generators/ValidArrayQueryUsage.cs"); + + var test = new CSharpAnalyzerTest + { + TestState = + { + Sources = { usageFile }, + AdditionalReferences = + { + typeof(GenerateBuilderAttribute).Assembly, + }, + ReferenceAssemblies = ReferenceAssemblies.Net.Net60, + }, + }; + + await test.RunAsync(); + } } \ No newline at end of file