diff --git a/src/Controls/src/BindingSourceGen/BindingCodeWriter.cs b/src/Controls/src/BindingSourceGen/BindingCodeWriter.cs index 39ba1f2d546a..955de777fbc9 100644 --- a/src/Controls/src/BindingSourceGen/BindingCodeWriter.cs +++ b/src/Controls/src/BindingSourceGen/BindingCodeWriter.cs @@ -92,19 +92,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -177,7 +173,7 @@ public BindingInterceptorCodeBuilder(int indent = 0) public void AppendSetBindingInterceptor(uint id, BindingInvocationDescription binding) { AppendLine(GeneratedCodeAttribute); - AppendInterceptorAttribute(binding.Location); + AppendInterceptorAttribute(binding.InterceptableLocation); AppendMethodName(binding, id); if (binding.SourceType.IsGenericParameter && binding.PropertyType.IsGenericParameter) { @@ -310,9 +306,9 @@ private void AppendMethodName(BindingInvocationDescription binding, uint id) }); } - private void AppendInterceptorAttribute(InterceptorLocation location) + private void AppendInterceptorAttribute(InterceptableLocationRecord location) { - AppendLine($"[InterceptsLocationAttribute(@\"{location.FilePath}\", {location.Line}, {location.Column})]"); + AppendLine($"[InterceptsLocationAttribute({location.Version}, @\"{location.Data}\")]"); } private void AppendSetterAction(BindingInvocationDescription binding, uint id, string sourceVariableName = "source", string valueVariableName = "value") diff --git a/src/Controls/src/BindingSourceGen/BindingInvocationDescription.cs b/src/Controls/src/BindingSourceGen/BindingInvocationDescription.cs index c2e04cd7e56c..1320d064bf6d 100644 --- a/src/Controls/src/BindingSourceGen/BindingInvocationDescription.cs +++ b/src/Controls/src/BindingSourceGen/BindingInvocationDescription.cs @@ -4,7 +4,8 @@ namespace Microsoft.Maui.Controls.BindingSourceGen; public sealed record BindingInvocationDescription( - InterceptorLocation Location, + InterceptableLocationRecord InterceptableLocation, + SimpleLocation SimpleLocation, TypeDescription SourceType, TypeDescription PropertyType, EquatableArray Path, @@ -12,6 +13,9 @@ public sealed record BindingInvocationDescription( bool NullableContextEnabled, InterceptedMethodType MethodType); + +public sealed record InterceptableLocationRecord(int Version, string Data); + public sealed record SourceCodeLocation(string FilePath, TextSpan TextSpan, LinePositionSpan LineSpan) { public static SourceCodeLocation? CreateFrom(Location location) @@ -24,13 +28,13 @@ public Location ToLocation() return Location.Create(FilePath, TextSpan, LineSpan); } - public InterceptorLocation ToInterceptorLocation() + public SimpleLocation ToSimpleLocation() { - return new InterceptorLocation(FilePath, LineSpan.Start.Line + 1, LineSpan.Start.Character + 1); + return new SimpleLocation(FilePath, LineSpan.Start.Line + 1, LineSpan.Start.Character + 1); } } -public sealed record InterceptorLocation(string FilePath, int Line, int Column); +public sealed record SimpleLocation(string FilePath, int Line, int Column); public sealed record TypeDescription( string GlobalName, diff --git a/src/Controls/src/BindingSourceGen/BindingSourceGenerator.cs b/src/Controls/src/BindingSourceGen/BindingSourceGenerator.cs index e9c1a3664331..873f9a07bb90 100644 --- a/src/Controls/src/BindingSourceGen/BindingSourceGenerator.cs +++ b/src/Controls/src/BindingSourceGen/BindingSourceGenerator.cs @@ -41,9 +41,10 @@ public void Initialize(IncrementalGeneratorInitializationContext context) context.RegisterImplementationSourceOutput(bindings, (spc, binding) => { - var fileName = $"{binding.Location.FilePath}-GeneratedBindingInterceptors-{binding.Location.Line}-{binding.Location.Column}.g.cs"; + var location = binding.SimpleLocation; + var fileName = $"{location.FilePath}-GeneratedBindingInterceptors-{location.Line}-{location.Column}.g.cs"; var sanitizedFileName = fileName.Replace('/', '-').Replace('\\', '-').Replace(':', '-'); - var code = BindingCodeWriter.GenerateBinding(binding, (uint)Math.Abs(binding.Location.GetHashCode())); + var code = BindingCodeWriter.GenerateBinding(binding, (uint)Math.Abs(location.GetHashCode())); spc.AddSource(sanitizedFileName, code); }); } @@ -83,8 +84,14 @@ private static Result GetBindingForGeneration(Gene return Result.Failure(interceptedMethodTypeResult.Diagnostics); } +#pragma warning disable RSEXPERIMENTAL002 + var interceptableLocation = context.SemanticModel.GetInterceptableLocation(invocation, t); +#pragma warning restore RSEXPERIMENTAL002 + var sourceCodeLocation = SourceCodeLocation.CreateFrom(method.Name.GetLocation()); - if (sourceCodeLocation == null) + + + if (interceptableLocation == null || sourceCodeLocation == null) { return Result.Failure(DiagnosticsFactory.UnableToResolvePath(invocation.GetLocation())); } @@ -115,7 +122,8 @@ private static Result GetBindingForGeneration(Gene } var binding = new BindingInvocationDescription( - Location: sourceCodeLocation.ToInterceptorLocation(), + InterceptableLocation: new InterceptableLocationRecord(interceptableLocation.Version, interceptableLocation.Data), + SimpleLocation: sourceCodeLocation.ToSimpleLocation(), SourceType: lambdaParamTypeResult.Value.CreateTypeDescription(enabledNullable), PropertyType: lambdaReturnTypeResult.Value.CreateTypeDescription(enabledNullable), Path: new EquatableArray([.. pathParseResult.Value]), diff --git a/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj b/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj index d7df9f008760..ae3ae0620574 100644 --- a/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj +++ b/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj @@ -18,7 +18,7 @@ - + @@ -29,4 +29,4 @@ - \ No newline at end of file + diff --git a/src/Controls/tests/BindingSourceGen.UnitTests/AssertExtensions.cs b/src/Controls/tests/BindingSourceGen.UnitTests/AssertExtensions.cs index 0928bf1eaa07..cb7b18b14333 100644 --- a/src/Controls/tests/BindingSourceGen.UnitTests/AssertExtensions.cs +++ b/src/Controls/tests/BindingSourceGen.UnitTests/AssertExtensions.cs @@ -25,9 +25,15 @@ internal static void BindingsAreEqual(BindingInvocationDescription expectedBindi AssertNoDiagnostics(codeGeneratorResult); Assert.NotNull(codeGeneratorResult.Binding); - //TODO: Change arrays to custom collections implementing IEquatable + // Skip interceptable location + Assert.Equal(expectedBinding.SimpleLocation, codeGeneratorResult.Binding.SimpleLocation); + Assert.Equal(expectedBinding.SourceType, codeGeneratorResult.Binding.SourceType); + Assert.Equal(expectedBinding.PropertyType, codeGeneratorResult.Binding.PropertyType); Assert.Equal(expectedBinding.Path, codeGeneratorResult.Binding.Path); - Assert.Equal(expectedBinding, codeGeneratorResult.Binding); + Assert.Equal(expectedBinding.SetterOptions, codeGeneratorResult.Binding.SetterOptions); + Assert.Equal(expectedBinding.NullableContextEnabled, codeGeneratorResult.Binding.NullableContextEnabled); + Assert.Equal(expectedBinding.MethodType, codeGeneratorResult.Binding.MethodType); + } private static IEnumerable SplitCode(string code) diff --git a/src/Controls/tests/BindingSourceGen.UnitTests/BindingCodeWriterTests.cs b/src/Controls/tests/BindingSourceGen.UnitTests/BindingCodeWriterTests.cs index d2e34b99570f..607c370221d6 100644 --- a/src/Controls/tests/BindingSourceGen.UnitTests/BindingCodeWriterTests.cs +++ b/src/Controls/tests/BindingSourceGen.UnitTests/BindingCodeWriterTests.cs @@ -50,7 +50,8 @@ private static bool ShouldUseSetter(BindingMode mode) public void BuildsWholeBinding() { var code = BindingCodeWriter.GenerateBinding(new BindingInvocationDescription( - Location: new InterceptorLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), + InterceptableLocation: new InterceptableLocationRecord(Version: 1, Data: "serializedData"), + SimpleLocation: new SimpleLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), SourceType: new TypeDescription("global::MyNamespace.MySourceClass", IsValueType: false, IsNullable: false, IsGenericParameter: false), PropertyType: new TypeDescription("global::MyNamespace.MyPropertyClass", IsValueType: false, IsNullable: false, IsGenericParameter: false), Path: new EquatableArray([ @@ -80,19 +81,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -107,7 +104,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 20, 30)] + [InterceptsLocationAttribute(1, @"serializedData")] public static void SetBinding1( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -164,8 +161,8 @@ public void CorrectlyFormatsSimpleBinding() { var codeBuilder = new BindingCodeWriter.BindingInterceptorCodeBuilder(); codeBuilder.AppendSetBindingInterceptor(id: 1, new BindingInvocationDescription( - Location: new InterceptorLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), - SourceType: new TypeDescription("global::MyNamespace.MySourceClass", IsValueType: false, IsNullable: false, IsGenericParameter: false), + InterceptableLocation: new InterceptableLocationRecord(Version: 1, Data: "serializedData"), + SimpleLocation: new SimpleLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), SourceType: new TypeDescription("global::MyNamespace.MySourceClass", IsValueType: false, IsNullable: false, IsGenericParameter: false), PropertyType: new TypeDescription("global::MyNamespace.MyPropertyClass", IsValueType: false, IsNullable: false, IsGenericParameter: false), Path: new EquatableArray([ new MemberAccess("A"), @@ -180,7 +177,7 @@ public void CorrectlyFormatsSimpleBinding() AssertExtensions.CodeIsEqual( $$""" {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 20, 30)] + [InterceptsLocationAttribute(1, @"serializedData")] public static void SetBinding1( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -236,8 +233,8 @@ public void CorrectlyFormatsBindingWithoutAnyNullablesInPath() { var codeBuilder = new BindingCodeWriter.BindingInterceptorCodeBuilder(); codeBuilder.AppendSetBindingInterceptor(id: 1, new BindingInvocationDescription( - Location: new InterceptorLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), - SourceType: new TypeDescription("global::MyNamespace.MySourceClass", IsValueType: false, IsNullable: false, IsGenericParameter: false), + InterceptableLocation: new InterceptableLocationRecord(Version: 1, Data: "serializedData"), + SimpleLocation: new SimpleLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), SourceType: new TypeDescription("global::MyNamespace.MySourceClass", IsValueType: false, IsNullable: false, IsGenericParameter: false), PropertyType: new TypeDescription("global::MyNamespace.MyPropertyClass", IsValueType: false, IsNullable: false, IsGenericParameter: false), Path: new EquatableArray([ new MemberAccess("A"), @@ -252,7 +249,7 @@ public void CorrectlyFormatsBindingWithoutAnyNullablesInPath() AssertExtensions.CodeIsEqual( $$""" {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 20, 30)] + [InterceptsLocationAttribute(1, @"serializedData")] public static void SetBinding1( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -304,8 +301,8 @@ public void CorrectlyFormatsBindingWithoutSetter() { var codeBuilder = new BindingCodeWriter.BindingInterceptorCodeBuilder(); codeBuilder.AppendSetBindingInterceptor(id: 1, new BindingInvocationDescription( - Location: new InterceptorLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), - SourceType: new TypeDescription("global::MyNamespace.MySourceClass", IsNullable: false, IsGenericParameter: false, IsValueType: false), + InterceptableLocation: new InterceptableLocationRecord(Version: 1, Data: "serializedData"), + SimpleLocation: new SimpleLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), SourceType: new TypeDescription("global::MyNamespace.MySourceClass", IsNullable: false, IsGenericParameter: false, IsValueType: false), PropertyType: new TypeDescription("global::MyNamespace.MyPropertyClass", IsNullable: false, IsGenericParameter: false, IsValueType: false), Path: new EquatableArray([ new MemberAccess("A"), @@ -320,7 +317,7 @@ public void CorrectlyFormatsBindingWithoutSetter() AssertExtensions.CodeIsEqual( $$""" {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 20, 30)] + [InterceptsLocationAttribute(1, @"serializedData")] public static void SetBinding1( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -369,8 +366,8 @@ public void CorrectlyFormatsBindingWithIndexers() { var codeBuilder = new BindingCodeWriter.BindingInterceptorCodeBuilder(); codeBuilder.AppendSetBindingInterceptor(id: 1, new BindingInvocationDescription( - Location: new InterceptorLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), - SourceType: new TypeDescription("global::MyNamespace.MySourceClass", IsNullable: false, IsGenericParameter: false), + InterceptableLocation: new InterceptableLocationRecord(Version: 1, Data: "serializedData"), + SimpleLocation: new SimpleLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), SourceType: new TypeDescription("global::MyNamespace.MySourceClass", IsNullable: false, IsGenericParameter: false), PropertyType: new TypeDescription("global::MyNamespace.MyPropertyClass", IsNullable: true, IsGenericParameter: false), Path: new EquatableArray([ new IndexAccess("Item", 12), @@ -385,7 +382,7 @@ public void CorrectlyFormatsBindingWithIndexers() AssertExtensions.CodeIsEqual( $$""" {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 20, 30)] + [InterceptsLocationAttribute(1, @"serializedData")] public static void SetBinding1( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -448,8 +445,8 @@ public void CorrectlyFormatsBindingWithCasts() { var codeBuilder = new BindingCodeWriter.BindingInterceptorCodeBuilder(); codeBuilder.AppendSetBindingInterceptor(id: 1, new BindingInvocationDescription( - Location: new InterceptorLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), - SourceType: new TypeDescription("global::MyNamespace.MySourceClass", IsNullable: false, IsGenericParameter: false), + InterceptableLocation: new InterceptableLocationRecord(Version: 1, Data: "serializedData"), + SimpleLocation: new SimpleLocation(FilePath: @"Path\To\Program.cs", Line: 20, Column: 30), SourceType: new TypeDescription("global::MyNamespace.MySourceClass", IsNullable: false, IsGenericParameter: false), PropertyType: new TypeDescription("global::MyNamespace.MyPropertyClass", IsNullable: false, IsGenericParameter: false), Path: new EquatableArray([ new MemberAccess("A"), @@ -469,7 +466,7 @@ public void CorrectlyFormatsBindingWithCasts() AssertExtensions.CodeIsEqual( $$""" {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 20, 30)] + [InterceptsLocationAttribute(1, @"serializedData")] public static void SetBinding1( this BindableObject bindableObject, BindableProperty bindableProperty, diff --git a/src/Controls/tests/BindingSourceGen.UnitTests/BindingRepresentationGenTests.cs b/src/Controls/tests/BindingSourceGen.UnitTests/BindingRepresentationGenTests.cs index 4d4fb397e314..eeebda8bd839 100644 --- a/src/Controls/tests/BindingSourceGen.UnitTests/BindingRepresentationGenTests.cs +++ b/src/Controls/tests/BindingSourceGen.UnitTests/BindingRepresentationGenTests.cs @@ -18,7 +18,8 @@ public void GenerateSimpleBinding() var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("string"), new TypeDescription("int", IsValueType: true), new EquatableArray([ @@ -42,7 +43,8 @@ public void GenerateBindingWithNestedProperties() var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Microsoft.Maui.Controls.Button"), new TypeDescription("int", IsValueType: true, IsNullable: true), new EquatableArray([ @@ -72,7 +74,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true, IsNullable: true), new EquatableArray([ @@ -99,7 +102,8 @@ public void GenerateBindingWithNullableReferenceSourceWhenNullableEnabled() var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Microsoft.Maui.Controls.Button", IsNullable: true), new TypeDescription("int", IsValueType: true, IsNullable: true), new EquatableArray([ @@ -129,7 +133,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true, IsNullable: true), new EquatableArray([ @@ -153,7 +158,8 @@ public void GenerateBindingWithNullableSourceReferenceAndNullableReferenceElemen var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Microsoft.Maui.Controls.Button", IsNullable: true), new TypeDescription("int", IsValueType: true, IsNullable: true), new EquatableArray([ @@ -183,7 +189,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("string", IsNullable: true), new EquatableArray([ @@ -213,7 +220,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 4, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 4, 7), new TypeDescription("global::Foo", IsNullable: true), new TypeDescription("int", IsValueType: true, IsNullable: true), new EquatableArray([ @@ -249,7 +257,8 @@ class Bar var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 4, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 4, 7), new TypeDescription("global::Foo", IsNullable: true), new TypeDescription("int", IsValueType: true), new EquatableArray([ @@ -285,7 +294,8 @@ class Bar var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 4, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 4, 7), new TypeDescription("global::Foo", IsNullable: true), new TypeDescription("int", IsNullable: true, IsValueType: true), new EquatableArray([ @@ -326,7 +336,8 @@ class CustomLength var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 4, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 4, 7), new TypeDescription("global::Foo", IsNullable: true), new TypeDescription("global::CustomLength", IsNullable: true), new EquatableArray([ @@ -356,7 +367,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true), new EquatableArray([ @@ -387,7 +399,8 @@ class Foo """; var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 4, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 4, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true), new EquatableArray([ @@ -421,7 +434,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 6, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 6, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true), new EquatableArray([ @@ -451,7 +465,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true, IsNullable: true), new EquatableArray([ @@ -486,7 +501,8 @@ class Bar var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true, IsNullable: true), new EquatableArray([ @@ -535,7 +551,8 @@ public class MyPropertyClass var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 6, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 6, 7), new TypeDescription("global::MyNamespace.MySourceClass"), new TypeDescription("global::MyNamespace.MyPropertyClass", IsNullable: true), new EquatableArray([ @@ -569,7 +586,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 6, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 6, 7), new TypeDescription("global::Foo"), new TypeDescription("char", IsValueType: true), new EquatableArray([ @@ -600,7 +618,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 4, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 4, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true), new EquatableArray([ @@ -630,7 +649,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("string", IsNullable: true), new EquatableArray([ @@ -660,7 +680,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("string"), new EquatableArray([ @@ -695,7 +716,8 @@ class C var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true, IsNullable: true), new EquatableArray([ @@ -731,7 +753,8 @@ class C var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true), new EquatableArray([ @@ -770,7 +793,8 @@ class C var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsNullable: true, IsValueType: true), new EquatableArray([ @@ -803,7 +827,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsNullable: true, IsValueType: true), new EquatableArray([ @@ -834,7 +859,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true), new EquatableArray([ @@ -872,7 +898,8 @@ struct C var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("int", IsNullable: true, IsValueType: true), new EquatableArray([ @@ -903,7 +930,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("char", IsValueType: true), new EquatableArray([ @@ -933,7 +961,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("char", IsValueType: true), new EquatableArray([ @@ -963,7 +992,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("string"), new EquatableArray([ @@ -992,7 +1022,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo"), new TypeDescription("string"), new EquatableArray([ @@ -1021,7 +1052,8 @@ class Foo var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 3, 7), new TypeDescription("global::Foo", IsNullable: true), new TypeDescription("int", IsValueType: true, IsNullable: true), new EquatableArray([ @@ -1056,7 +1088,8 @@ public void Bar() var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 12, 15), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 12, 15), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true), new EquatableArray([ @@ -1097,7 +1130,8 @@ public void Bar() var codeGeneratorResult = SourceGenHelpers.Run(source); var expectedBinding = new BindingInvocationDescription( - new InterceptorLocation(@"Path\To\Program.cs", 12, 15), + new InterceptableLocationRecord(1, "serializedData"), + new SimpleLocation(@"Path\To\Program.cs", 12, 15), new TypeDescription("global::Foo"), new TypeDescription("int", IsValueType: true), new EquatableArray([ diff --git a/src/Controls/tests/BindingSourceGen.UnitTests/BindingTransformerTests.cs b/src/Controls/tests/BindingSourceGen.UnitTests/BindingTransformerTests.cs index bc3512adc660..5c872721c743 100644 --- a/src/Controls/tests/BindingSourceGen.UnitTests/BindingTransformerTests.cs +++ b/src/Controls/tests/BindingSourceGen.UnitTests/BindingTransformerTests.cs @@ -9,7 +9,8 @@ public class BindingTransformerTests public void WrapMemberAccessInConditionalAccessWhenSourceTypeIsReferenceType() { var binding = new BindingInvocationDescription( - Location: new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + InterceptableLocation: new InterceptableLocationRecord(1, "serializedData"), + SimpleLocation: new SimpleLocation(@"Path\To\Program.cs", 3, 7), SourceType: new TypeDescription("MyType", IsValueType: false), PropertyType: new TypeDescription("MyType2"), Path: new EquatableArray([new MemberAccess("A")]), @@ -28,7 +29,8 @@ public void WrapMemberAccessInConditionalAccessWhenSourceTypeIsReferenceType() public void WrapMemberAccessInConditionalAccessWhePreviousPartTypeIsReferenceType() { var binding = new BindingInvocationDescription( - Location: new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + InterceptableLocation: new InterceptableLocationRecord(1, "serializedData"), + SimpleLocation: new SimpleLocation(@"Path\To\Program.cs", 3, 7), SourceType: new TypeDescription("MyType", IsValueType: true), PropertyType: new TypeDescription("MyType2"), Path: new EquatableArray( @@ -55,7 +57,8 @@ public void WrapMemberAccessInConditionalAccessWhePreviousPartTypeIsReferenceTyp public void DoNotWrapMemberAccessInConditionalAccessWhePreviousPartTypeIsValueType() { var binding = new BindingInvocationDescription( - Location: new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + InterceptableLocation: new InterceptableLocationRecord(1, "serializedData"), + SimpleLocation: new SimpleLocation(@"Path\To\Program.cs", 3, 7), SourceType: new TypeDescription("MyType", IsValueType: false), PropertyType: new TypeDescription("MyType2"), Path: new EquatableArray( @@ -82,7 +85,8 @@ public void DoNotWrapMemberAccessInConditionalAccessWhePreviousPartTypeIsValueTy public void WrapAccessInConditionalAccessWhenAllPartsAreReferenceTypes() { var binding = new BindingInvocationDescription( - Location: new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + InterceptableLocation: new InterceptableLocationRecord(1, "serializedData"), + SimpleLocation: new SimpleLocation(@"Path\To\Program.cs", 3, 7), SourceType: new TypeDescription("MyType"), PropertyType: new TypeDescription("MyType2"), Path: new EquatableArray( @@ -111,7 +115,8 @@ public void WrapAccessInConditionalAccessWhenAllPartsAreReferenceTypes() public void DoNotWrapAccessInConditionalAccessWhenNoPartsAreReferenceTypes() { var binding = new BindingInvocationDescription( - Location: new InterceptorLocation(@"Path\To\Program.cs", 3, 7), + InterceptableLocation: new InterceptableLocationRecord(1, "serializedData"), + SimpleLocation: new SimpleLocation(@"Path\To\Program.cs", 3, 7), SourceType: new TypeDescription("MyType", IsValueType: true), PropertyType: new TypeDescription("MyType2"), Path: new EquatableArray( diff --git a/src/Controls/tests/BindingSourceGen.UnitTests/Controls.BindingSourceGen.UnitTests.csproj b/src/Controls/tests/BindingSourceGen.UnitTests/Controls.BindingSourceGen.UnitTests.csproj index f353f69562f1..0370ac2ba6f3 100644 --- a/src/Controls/tests/BindingSourceGen.UnitTests/Controls.BindingSourceGen.UnitTests.csproj +++ b/src/Controls/tests/BindingSourceGen.UnitTests/Controls.BindingSourceGen.UnitTests.csproj @@ -10,7 +10,7 @@ - + @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/src/Controls/tests/BindingSourceGen.UnitTests/IncrementalGenerationTests.cs b/src/Controls/tests/BindingSourceGen.UnitTests/IncrementalGenerationTests.cs index 1b9b6560e167..a03198f8eaa3 100644 --- a/src/Controls/tests/BindingSourceGen.UnitTests/IncrementalGenerationTests.cs +++ b/src/Controls/tests/BindingSourceGen.UnitTests/IncrementalGenerationTests.cs @@ -102,31 +102,6 @@ private static void AssertStepRunReasonEquals(IncrementalStepRunReason expectedR Assert.Equal(expectedReason, steps.Single(r => r.Name == stepName).Outputs.Single().Reason); } - [Fact] - public void DoesNotRegenerateCodeWhenNewCodeInsertedBelow() - { - var source = """ - using Microsoft.Maui.Controls; - var label = new Label(); - label.SetBinding(Label.RotationProperty, static (string s) => s.Length); - """; - - var newSource = """ - using Microsoft.Maui.Controls; - var label = new Label(); - label.SetBinding(Label.RotationProperty, static (string s) => s.Length); - - var x = 42; - """; - - var results = RunGeneratorOnMultipleSourcesAndReturnSteps( - new Dictionary { { nameof(source), source } }, - new Dictionary { { nameof(source), newSource } }); - - var outputs = results[nameof(source)].SelectMany(step => step.Outputs); - Assert.All(outputs, output => Assert.True(output.Reason == IncrementalStepRunReason.Unchanged || output.Reason == IncrementalStepRunReason.Cached)); - } - [Fact] public void DoesNotRegerateCodeWhenDifferentFileEdited() { @@ -197,7 +172,7 @@ private static Dictionary RunGeneratorOnM // Sometimes the binding has more than one run of the same step associated with it. // In such cases keep the one with Modified reason for safety. return bindingRunPairs - .GroupBy(bindingRunPair => bindingRunPair.binding.Location.FilePath) + .GroupBy(bindingRunPair => bindingRunPair.binding.SimpleLocation.FilePath) .ToDictionary( x => x.Key, x => x diff --git a/src/Controls/tests/BindingSourceGen.UnitTests/IntegrationTests.cs b/src/Controls/tests/BindingSourceGen.UnitTests/IntegrationTests.cs index e4a1b7944695..d0ecb5e9cce4 100644 --- a/src/Controls/tests/BindingSourceGen.UnitTests/IntegrationTests.cs +++ b/src/Controls/tests/BindingSourceGen.UnitTests/IntegrationTests.cs @@ -16,7 +16,7 @@ public void GenerateSimpleBinding() var result = SourceGenHelpers.Run(source); Assert.NotNull(result.Binding); - var id = Math.Abs(result.Binding.Location.GetHashCode()); + var id = Math.Abs(result.Binding.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( @@ -37,19 +37,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -64,7 +60,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 3, 7)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -119,7 +115,8 @@ public void GenerateSimpleBindingCreate() AssertExtensions.AssertNoDiagnostics(result); Assert.NotNull(result.Binding); - var id = Math.Abs(result.Binding.Location.GetHashCode()); + var id = Math.Abs(result.Binding.SimpleLocation.GetHashCode()); + AssertExtensions.CodeIsEqual( $$""" //------------------------------------------------------------------------------ @@ -138,19 +135,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -165,7 +158,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 2, 27)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static BindingBase Create{{id}}( Func getter, BindingMode mode = BindingMode.Default, @@ -293,7 +286,7 @@ public class B """; var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( $$""" @@ -313,19 +306,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -340,7 +329,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 6, 7)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -418,7 +407,7 @@ public class B """; var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( $$""" @@ -438,19 +427,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -465,7 +450,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 7, 7)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -649,7 +634,7 @@ public class C public void GenerateSimpleBindingWhenNullableDisabledAndPropertyNullable(string source) { var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( $$""" @@ -669,19 +654,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -696,7 +677,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 7, 7)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -788,7 +769,7 @@ public class D { """; var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( $$""" @@ -808,19 +789,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -835,7 +812,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 7, 7)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -927,7 +904,7 @@ public class MyPropertyClass """; var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( @@ -948,19 +925,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -975,7 +948,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 4, 7)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -1072,7 +1045,7 @@ public class MyPropertyClass """; var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( @@ -1093,19 +1066,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -1120,7 +1089,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 4, 7)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -1204,7 +1173,7 @@ public class Wrapper """; var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( @@ -1225,19 +1194,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -1251,7 +1216,7 @@ namespace Microsoft.Maui.Controls.Generated internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 3, 7)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -1332,7 +1297,7 @@ public class MyPropertyClass """; var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( @@ -1353,19 +1318,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -1380,7 +1341,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 6, 7)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -1467,7 +1428,7 @@ public void SetBinding() """; var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( $$""" @@ -1487,19 +1448,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -1514,7 +1471,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 17, 23)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -1592,7 +1549,7 @@ public void SetBinding() """; var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( $$""" @@ -1612,19 +1569,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -1639,7 +1592,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 17, 23)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -1720,7 +1673,7 @@ public void SetBinding() """; var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( $$""" @@ -1740,19 +1693,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -1767,7 +1716,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 17, 23)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, @@ -1847,7 +1796,7 @@ public void SetBinding() """; var result = SourceGenHelpers.Run(source); - var id = Math.Abs(result.Binding!.Location.GetHashCode()); + var id = Math.Abs(result.Binding!.SimpleLocation.GetHashCode()); AssertExtensions.AssertNoDiagnostics(result); AssertExtensions.CodeIsEqual( $$""" @@ -1867,19 +1816,15 @@ namespace System.Runtime.CompilerServices using System.CodeDom.Compiler; {{BindingCodeWriter.GeneratedCodeAttribute}} + [global::System.Diagnostics.Conditional("DEBUG")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] file sealed class InterceptsLocationAttribute : Attribute { - public InterceptsLocationAttribute(string filePath, int line, int column) + public InterceptsLocationAttribute(int version, string data) { - FilePath = filePath; - Line = line; - Column = column; + _ = version; + _ = data; } - - public string FilePath { get; } - public int Line { get; } - public int Column { get; } } } @@ -1894,7 +1839,7 @@ internal static partial class GeneratedBindingInterceptors { {{BindingCodeWriter.GeneratedCodeAttribute}} - [InterceptsLocationAttribute(@"Path\To\Program.cs", 17, 23)] + [InterceptsLocationAttribute({{result.Binding.InterceptableLocation.Version}}, @"{{result.Binding.InterceptableLocation.Data}}")] public static void SetBinding{{id}}( this BindableObject bindableObject, BindableProperty bindableProperty, diff --git a/src/Controls/tests/BindingSourceGen.UnitTests/SourceGenHelpers.cs b/src/Controls/tests/BindingSourceGen.UnitTests/SourceGenHelpers.cs index 9e714287fd26..3535e04c1bfc 100644 --- a/src/Controls/tests/BindingSourceGen.UnitTests/SourceGenHelpers.cs +++ b/src/Controls/tests/BindingSourceGen.UnitTests/SourceGenHelpers.cs @@ -17,7 +17,7 @@ internal record CodeGeneratorResult( internal static class SourceGenHelpers { private static readonly CSharpParseOptions ParseOptions = new CSharpParseOptions(LanguageVersion.Preview).WithFeatures( - [new KeyValuePair("InterceptorsPreviewNamespaces", "Microsoft.Maui.Controls.Generated")]); + [new KeyValuePair("InterceptorsNamespaces", "Microsoft.Maui.Controls.Generated")]); internal static List StepsForComparison = [TrackingNames.Bindings, TrackingNames.BindingsWithDiagnostics];