From d19845730f522e4aa7449131cbd0b370d120d50c Mon Sep 17 00:00:00 2001 From: Crystal Qian Date: Wed, 31 Aug 2016 15:38:35 -0700 Subject: [PATCH] Added a copy constructor for tag helper descriptors. (#827) --- .../TagHelpers/TagHelperDescriptorResolver.cs | 18 ++------ .../TagHelpers/TagHelperDescriptor.cs | 32 +++++++++++++- .../TagHelpers/TagHelperDescriptorTest.cs | 43 +++++++++++++++++++ 3 files changed, 78 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.AspNetCore.Razor.Runtime/Runtime/TagHelpers/TagHelperDescriptorResolver.cs b/src/Microsoft.AspNetCore.Razor.Runtime/Runtime/TagHelpers/TagHelperDescriptorResolver.cs index 59eadf06e2..9f8dd9312b 100644 --- a/src/Microsoft.AspNetCore.Razor.Runtime/Runtime/TagHelpers/TagHelperDescriptorResolver.cs +++ b/src/Microsoft.AspNetCore.Razor.Runtime/Runtime/TagHelpers/TagHelperDescriptorResolver.cs @@ -151,20 +151,10 @@ namespace Microsoft.AspNetCore.Razor.Runtime.TagHelpers if (!string.IsNullOrEmpty(tagHelperPrefix)) { - return descriptors.Select(descriptor => - new TagHelperDescriptor - { - Prefix = tagHelperPrefix, - TagName = descriptor.TagName, - TypeName = descriptor.TypeName, - AssemblyName = descriptor.AssemblyName, - Attributes = descriptor.Attributes, - RequiredAttributes = descriptor.RequiredAttributes, - AllowedChildren = descriptor.AllowedChildren, - RequiredParent = descriptor.RequiredParent, - TagStructure = descriptor.TagStructure, - DesignTimeDescriptor = descriptor.DesignTimeDescriptor - }); + return descriptors.Select(descriptor => new TagHelperDescriptor(descriptor) + { + Prefix = tagHelperPrefix + }); } return descriptors; diff --git a/src/Microsoft.AspNetCore.Razor/Compilation/TagHelpers/TagHelperDescriptor.cs b/src/Microsoft.AspNetCore.Razor/Compilation/TagHelpers/TagHelperDescriptor.cs index ad8df46691..b3188dcc33 100644 --- a/src/Microsoft.AspNetCore.Razor/Compilation/TagHelpers/TagHelperDescriptor.cs +++ b/src/Microsoft.AspNetCore.Razor/Compilation/TagHelpers/TagHelperDescriptor.cs @@ -23,6 +23,36 @@ namespace Microsoft.AspNetCore.Razor.Compilation.TagHelpers private IEnumerable _requiredAttributes = Enumerable.Empty(); + /// + /// Creates a new . + /// + public TagHelperDescriptor() + { + } + + /// + /// Creates a shallow copy of the given . + /// + /// The to copy. + public TagHelperDescriptor (TagHelperDescriptor descriptor) + { + Prefix = descriptor.Prefix; + TagName = descriptor.TagName; + TypeName = descriptor.TypeName; + AssemblyName = descriptor.AssemblyName; + Attributes = descriptor.Attributes; + RequiredAttributes = descriptor.RequiredAttributes; + AllowedChildren = descriptor.AllowedChildren; + RequiredParent = descriptor.RequiredParent; + TagStructure = descriptor.TagStructure; + DesignTimeDescriptor = descriptor.DesignTimeDescriptor; + + foreach (var property in descriptor.PropertyBag) + { + PropertyBag.Add(property.Key, property.Value); + } + } + /// /// Text used as a required prefix when matching HTML start and end tags in the Razor source to available /// tag helpers. @@ -219,4 +249,4 @@ namespace Microsoft.AspNetCore.Razor.Compilation.TagHelpers } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNetCore.Razor.Test/Compilation/TagHelpers/TagHelperDescriptorTest.cs b/test/Microsoft.AspNetCore.Razor.Test/Compilation/TagHelpers/TagHelperDescriptorTest.cs index 10d28cd559..aec70ce4f7 100644 --- a/test/Microsoft.AspNetCore.Razor.Test/Compilation/TagHelpers/TagHelperDescriptorTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Test/Compilation/TagHelpers/TagHelperDescriptorTest.cs @@ -12,6 +12,49 @@ namespace Microsoft.AspNetCore.Razor.Compilation.TagHelpers { public class TagHelperDescriptorTest { + [Fact] + public void Constructor_CorrectlyCreatesCopy() + { + // Arrange + var descriptor = new TagHelperDescriptor + { + Prefix = "prefix", + TagName = "tag-name", + TypeName = "TypeName", + AssemblyName = "AsssemblyName", + Attributes = new List + { + new TagHelperAttributeDescriptor + { + Name = "test-attribute", + PropertyName = "TestAttribute", + TypeName = "string" + } + }, + RequiredAttributes = new List + { + new TagHelperRequiredAttributeDescriptor + { + Name = "test-required-attribute" + } + }, + AllowedChildren = new[] { "child" }, + RequiredParent = "required parent", + TagStructure = TagStructure.NormalOrSelfClosing, + DesignTimeDescriptor = new TagHelperDesignTimeDescriptor() + }; + + descriptor.PropertyBag.Add("foo", "bar"); + + // Act + var copyDescriptor = new TagHelperDescriptor(descriptor); + + // Assert + Assert.Equal(descriptor, copyDescriptor, CaseSensitiveTagHelperDescriptorComparer.Default); + Assert.Same(descriptor.Attributes, copyDescriptor.Attributes); + Assert.Same(descriptor.RequiredAttributes, copyDescriptor.RequiredAttributes); + } + [Fact] public void TagHelperDescriptor_CanBeSerialized() {