From f2f0bed885334740da04ffb4906583329f0a5a1a Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Tue, 16 Jul 2019 13:11:15 -0700 Subject: [PATCH] Support [Parameter] attribute on base class of overridden properties (dotnet/aspnetcore-tooling#835) * Support [Parameter] attribute on base class of overridden properties * Fix test \n\nCommit migrated from https://github.com/dotnet/aspnetcore-tooling/commit/c228339bb38de8508e391a7c14577f0d5ae43c9c --- .../ComponentTagHelperDescriptorProvider.cs | 7 ++ ...omponentTagHelperDescriptorProviderTest.cs | 67 +++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/src/ComponentTagHelperDescriptorProvider.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/src/ComponentTagHelperDescriptorProvider.cs index 17eb8b3918..30b8983983 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/src/ComponentTagHelperDescriptorProvider.cs +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/src/ComponentTagHelperDescriptorProvider.cs @@ -386,6 +386,13 @@ namespace Microsoft.CodeAnalysis.Razor if (!property.GetAttributes().Any(a => a.AttributeClass == symbols.ParameterAttribute)) { + if (property.IsOverride) + { + // This property does not contain [Parameter] attribute but it was overridden. Don't ignore it for now. + // We can ignore it if the base class does not contains a [Parameter] as well. + continue; + } + // Does not have [Parameter] kind = PropertyKind.Ignored; } diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperDescriptorProviderTest.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperDescriptorProviderTest.cs index 84e92ba30f..329a8606b5 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperDescriptorProviderTest.cs +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperDescriptorProviderTest.cs @@ -1436,5 +1436,72 @@ namespace Test Assert.Empty(component.BoundAttributes); } + + [Fact] // Testing multilevel overrides with the [Parameter] attribute on different levels. + public void Execute_MultiLevelOverriddenProperties_CreatesDescriptorCorrectly() + { + // Arrange + + var compilation = BaseCompilation.AddSyntaxTrees(Parse(@" +using Microsoft.AspNetCore.Components; + +namespace Test +{ + public abstract class MyBaseComponent : ComponentBase + { + [Parameter] + public virtual string Header { get; set; } + + public virtual string Footer { get; set; } + } + + public abstract class MyDerivedComponent1 : MyBaseComponent + { + public override string Header { get; set; } + + [Parameter] + public override string Footer { get; set; } + } + + public class MyDerivedComponent2 : MyDerivedComponent1 + { + public override string Header { get; set; } + + public override string Footer { get; set; } + } +} +")); + + Assert.Empty(compilation.GetDiagnostics()); + + var context = TagHelperDescriptorProviderContext.Create(); + context.SetCompilation(compilation); + + var provider = new ComponentTagHelperDescriptorProvider(); + + // Act + provider.Execute(context); + + // Assert + var components = ExcludeBuiltInComponents(context); + components = AssertAndExcludeFullyQualifiedNameMatchComponents(components, expectedCount: 1); + var component = Assert.Single(components, c => c.IsComponentTagHelper()); + + Assert.Equal("TestAssembly", component.AssemblyName); + Assert.Equal("Test.MyDerivedComponent2", component.Name); + + Assert.Collection( + component.BoundAttributes.OrderBy(a => a.Name), + a => + { + Assert.Equal("Footer", a.Name); + Assert.Equal("System.String", a.TypeName); + }, + a => + { + Assert.Equal("Header", a.Name); + Assert.Equal("System.String", a.TypeName); + }); + } } }