Add AssemblyName to TagHelperDescriptor.

- TagHelperDescriptor's need a way to showcase where they came from so tooling can reverse look them up.
- Update tests to specify TagHelperDescriptor assembly names.

#214
This commit is contained in:
N. Taylor Mullen 2014-10-30 14:33:52 -07:00
parent 8d4bdbdb84
commit 2200f7dc3a
10 changed files with 97 additions and 29 deletions

View File

@ -30,10 +30,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var typeName = type.FullName;
var attributeDescriptors = GetAttributeDescriptors(type);
var contentBehavior = GetContentBehavior(type);
var assemblyName = type.GetTypeInfo().Assembly.GetName().Name;
return tagNames.Select(tagName =>
new TagHelperDescriptor(tagName,
typeName,
assemblyName,
contentBehavior,
attributeDescriptors));
}

View File

@ -19,12 +19,18 @@ namespace Microsoft.AspNet.Razor.TagHelpers
/// <param name="tagName">The tag name that the tag helper targets. '*' indicates a catch-all
/// <see cref="TagHelperDescriptor"/> which applies to every HTML tag.</param>
/// <param name="tagHelperName">The full name of the tag helper class.</param>
/// <param name="tagHelperAssemblyName">The name of the assembly the tag helper was resolved from.</param>
/// <param name="contentBehavior">The <see cref="TagHelpers.ContentBehavior"/>
/// of the tag helper.</param>
public TagHelperDescriptor([NotNull] string tagName,
[NotNull] string tagHelperName,
[NotNull] string tagHelperAssemblyName,
ContentBehavior contentBehavior)
: this(tagName, tagHelperName, contentBehavior, Enumerable.Empty<TagHelperAttributeDescriptor>())
: this(tagName,
tagHelperName,
tagHelperAssemblyName,
contentBehavior,
Enumerable.Empty<TagHelperAttributeDescriptor>())
{
}
@ -36,6 +42,7 @@ namespace Microsoft.AspNet.Razor.TagHelpers
/// <see cref="TagHelperDescriptor"/> which applies to every HTML tag.</param>
/// <param name="tagHelperName">The code class used to render the tag helper. Corresponds to
/// the tag helper's <see cref="Type.FullName"/>.</param>
/// <param name="tagHelperAssemblyName">The name of the assembly the tag helper was resolved from.</param>
/// <param name="contentBehavior">The <see cref="TagHelpers.ContentBehavior"/>
/// of the tag helper.</param>
/// <param name="attributes">
@ -43,11 +50,13 @@ namespace Microsoft.AspNet.Razor.TagHelpers
/// </param>
public TagHelperDescriptor([NotNull] string tagName,
[NotNull] string tagHelperName,
[NotNull] string tagHelperAssemblyName,
ContentBehavior contentBehavior,
[NotNull] IEnumerable<TagHelperAttributeDescriptor> attributes)
{
TagName = tagName;
TagHelperName = tagHelperName;
AssemblyName = tagHelperAssemblyName;
ContentBehavior = contentBehavior;
Attributes = new List<TagHelperAttributeDescriptor>(attributes);
}
@ -62,6 +71,11 @@ namespace Microsoft.AspNet.Razor.TagHelpers
/// </summary>
public string TagHelperName { get; private set; }
/// <summary>
/// The name of the assembly the tag helper was resolved from.
/// </summary>
public string AssemblyName { get; private set; }
/// <summary>
/// The <see cref="TagHelpers.ContentBehavior"/> of the tag helper.
/// </summary>

View File

@ -35,6 +35,7 @@ namespace Microsoft.AspNet.Razor.TagHelpers
{
return string.Equals(descriptorX.TagHelperName, descriptorY.TagHelperName, StringComparison.Ordinal) &&
string.Equals(descriptorX.TagName, descriptorY.TagName, StringComparison.OrdinalIgnoreCase) &&
string.Equals(descriptorX.AssemblyName, descriptorY.AssemblyName, StringComparison.Ordinal) &&
descriptorX.ContentBehavior == descriptorY.ContentBehavior;
}
@ -48,6 +49,7 @@ namespace Microsoft.AspNet.Razor.TagHelpers
return HashCodeCombiner.Start()
.Add(descriptor.TagName, StringComparer.OrdinalIgnoreCase)
.Add(descriptor.TagHelperName, StringComparer.Ordinal)
.Add(descriptor.AssemblyName, StringComparer.Ordinal)
.Add(descriptor.ContentBehavior)
.CombinedHash;
}

View File

@ -9,6 +9,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{
public class TagHelperDescriptorFactoryTest
{
private static readonly string AssemblyName =
typeof(TagHelperDescriptorFactoryTest).GetTypeInfo().Assembly.GetName().Name;
[Fact]
public void CreateDescriptor_OverridesAttributeNameFromAttribute()
{
@ -21,6 +24,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
new TagHelperDescriptor(
"OverriddenAttribute",
typeof(OverriddenAttributeTagHelper).FullName,
AssemblyName,
ContentBehavior.None,
new[] {
new TagHelperAttributeDescriptor("SomethingElse", validProperty1),
@ -47,6 +51,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
new TagHelperDescriptor(
"InheritedOverriddenAttribute",
typeof(InheritedOverriddenAttributeTagHelper).FullName,
AssemblyName,
ContentBehavior.None,
new[] {
new TagHelperAttributeDescriptor(nameof(InheritedOverriddenAttributeTagHelper.ValidAttribute1),
@ -74,6 +79,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
new TagHelperDescriptor(
"InheritedNotOverriddenAttribute",
typeof(InheritedNotOverriddenAttributeTagHelper).FullName,
AssemblyName,
ContentBehavior.None,
new[] {
new TagHelperAttributeDescriptor("SomethingElse", validProperty1),
@ -92,7 +98,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
public void CreateDescriptor_BuildsDescriptorsFromSimpleTypes()
{
// Arrange
var expectedDescriptor = new TagHelperDescriptor("Object", "System.Object", ContentBehavior.None);
var assemblyName = typeof(object).GetTypeInfo().Assembly.GetName().Name;
var expectedDescriptor = new TagHelperDescriptor("Object", "System.Object", assemblyName, ContentBehavior.None);
// Act
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(typeof(object));
@ -111,6 +118,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var expectedDescriptor = new TagHelperDescriptor(
"InheritedSingleAttribute",
typeof(InheritedSingleAttributeTagHelper).FullName,
AssemblyName,
ContentBehavior.None,
new[] {
new TagHelperAttributeDescriptor(nameof(InheritedSingleAttributeTagHelper.IntAttribute), intProperty)
@ -132,6 +140,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var expectedDescriptor = new TagHelperDescriptor(
"SingleAttribute",
typeof(SingleAttributeTagHelper).FullName,
AssemblyName,
ContentBehavior.None,
new[] {
new TagHelperAttributeDescriptor(nameof(SingleAttributeTagHelper.IntAttribute), intProperty)
@ -154,6 +163,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var expectedDescriptor = new TagHelperDescriptor(
"MissingAccessor",
typeof(MissingAccessorTagHelper).FullName,
AssemblyName,
ContentBehavior.None,
new[] {
new TagHelperAttributeDescriptor(nameof(MissingAccessorTagHelper.ValidAttribute), validProperty)
@ -176,6 +186,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var expectedDescriptor = new TagHelperDescriptor(
"PrivateAccessor",
typeof(PrivateAccessorTagHelper).FullName,
AssemblyName,
ContentBehavior.None,
new[] {
new TagHelperAttributeDescriptor(
@ -197,6 +208,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var expectedDescriptor = new TagHelperDescriptor(
"CustomContentBehavior",
typeof(CustomContentBehaviorTagHelper).FullName,
AssemblyName,
ContentBehavior.Append);
// Act
@ -214,6 +226,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var expectedDescriptor = new TagHelperDescriptor(
"InheritedCustomContentBehavior",
typeof(InheritedCustomContentBehaviorTagHelper).FullName,
AssemblyName,
ContentBehavior.None);
// Act
@ -234,6 +247,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
new TagHelperDescriptor(
"div",
typeof(MultiTagTagHelper).FullName,
AssemblyName,
ContentBehavior.None,
new[] {
new TagHelperAttributeDescriptor(nameof(MultiTagTagHelper.ValidAttribute), validProp)
@ -241,6 +255,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
new TagHelperDescriptor(
"p",
typeof(MultiTagTagHelper).FullName,
AssemblyName,
ContentBehavior.None,
new[] {
new TagHelperAttributeDescriptor(nameof(MultiTagTagHelper.ValidAttribute), validProp)
@ -262,6 +277,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var expectedDescriptor = new TagHelperDescriptor(
"InheritedMultiTag",
typeof(InheritedMultiTagTagHelper).FullName,
AssemblyName,
ContentBehavior.None,
new[] {
new TagHelperAttributeDescriptor(nameof(InheritedMultiTagTagHelper.ValidAttribute), validProp)
@ -280,8 +296,16 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{
// Arrange
var expectedDescriptors = new[] {
new TagHelperDescriptor("p", typeof(DuplicateTagNameTagHelper).FullName, ContentBehavior.None),
new TagHelperDescriptor("div", typeof(DuplicateTagNameTagHelper).FullName, ContentBehavior.None)
new TagHelperDescriptor(
"p",
typeof(DuplicateTagNameTagHelper).FullName,
AssemblyName,
ContentBehavior.None),
new TagHelperDescriptor(
"div",
typeof(DuplicateTagNameTagHelper).FullName,
AssemblyName,
ContentBehavior.None)
};
// Act
@ -296,8 +320,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{
// Arrange
var expectedDescriptors = new[] {
new TagHelperDescriptor("data-condition",
typeof(OverrideNameTagHelper).FullName,
new TagHelperDescriptor("data-condition",
typeof(OverrideNameTagHelper).FullName,
AssemblyName,
ContentBehavior.None),
};
@ -313,9 +338,21 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{
// Arrange
var expectedDescriptors = new[] {
new TagHelperDescriptor("span", typeof(MultipleAttributeTagHelper).FullName, ContentBehavior.None),
new TagHelperDescriptor("p", typeof(MultipleAttributeTagHelper).FullName, ContentBehavior.None),
new TagHelperDescriptor("div", typeof(MultipleAttributeTagHelper).FullName, ContentBehavior.None)
new TagHelperDescriptor(
"span",
typeof(MultipleAttributeTagHelper).FullName,
AssemblyName,
ContentBehavior.None),
new TagHelperDescriptor(
"p",
typeof(MultipleAttributeTagHelper).FullName,
AssemblyName,
ContentBehavior.None),
new TagHelperDescriptor(
"div",
typeof(MultipleAttributeTagHelper).FullName,
AssemblyName,
ContentBehavior.None)
};
// Act

View File

@ -12,6 +12,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{
public class TagHelperDescriptorResolverTest : TagHelperTypeResolverTest
{
private static readonly string AssemblyName =
typeof(TagHelperDescriptorFactoryTest).GetTypeInfo().Assembly.GetName().Name;
[Fact]
public void DescriptorResolver_DoesNotReturnInvalidTagHelpersWhenSpecified()
{
@ -63,6 +66,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var tagHelperDescriptorResolver = new TagHelperDescriptorResolver(tagHelperTypeResolver);
var expectedDescriptor = new TagHelperDescriptor("Valid_Plain",
typeof(Valid_PlainTagHelper).FullName,
AssemblyName,
ContentBehavior.None);
// Act
@ -86,6 +90,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}));
var expectedDescriptor = new TagHelperDescriptor("Valid_Plain",
typeof(Valid_PlainTagHelper).FullName,
AssemblyName,
ContentBehavior.None);
// Act
@ -110,9 +115,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{
new TagHelperDescriptor("Valid_Plain",
typeof(Valid_PlainTagHelper).FullName,
AssemblyName,
ContentBehavior.None),
new TagHelperDescriptor("Valid_Inherited",
typeof(Valid_InheritedTagHelper).FullName,
AssemblyName,
ContentBehavior.None)
};

View File

@ -22,18 +22,21 @@ namespace Microsoft.AspNet.Razor.Test.Generator
{
new TagHelperDescriptor("p",
"PTagHelper",
"SomeAssembly",
ContentBehavior.None,
new [] {
new TagHelperAttributeDescriptor("age", pAgePropertyInfo)
}),
new TagHelperDescriptor("input",
"InputTagHelper",
"SomeAssembly",
ContentBehavior.None,
new TagHelperAttributeDescriptor[] {
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo)
}),
new TagHelperDescriptor("input",
"InputTagHelper2",
"SomeAssembly",
ContentBehavior.None,
new TagHelperAttributeDescriptor[] {
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo),
@ -49,11 +52,11 @@ namespace Microsoft.AspNet.Razor.Test.Generator
{
return new[]
{
new TagHelperDescriptor("modify", "ModifyTagHelper", ContentBehavior.Modify),
new TagHelperDescriptor("none", "NoneTagHelper", ContentBehavior.None),
new TagHelperDescriptor("append", "AppendTagHelper", ContentBehavior.Append),
new TagHelperDescriptor("prepend", "PrependTagHelper", ContentBehavior.Prepend),
new TagHelperDescriptor("replace", "ReplaceTagHelper", ContentBehavior.Replace)
new TagHelperDescriptor("modify", "ModifyTagHelper", "SomeAssembly", ContentBehavior.Modify),
new TagHelperDescriptor("none", "NoneTagHelper", "SomeAssembly", ContentBehavior.None),
new TagHelperDescriptor("append", "AppendTagHelper", "SomeAssembly", ContentBehavior.Append),
new TagHelperDescriptor("prepend", "PrependTagHelper", "SomeAssembly", ContentBehavior.Prepend),
new TagHelperDescriptor("replace", "ReplaceTagHelper", "SomeAssembly", ContentBehavior.Replace)
};
}
}
@ -214,7 +217,7 @@ namespace Microsoft.AspNet.Razor.Test.Generator
RunTagHelperTest("AddTagHelperDirective",
designTimeMode: true,
tagHelperDescriptors: new[] {
new TagHelperDescriptor("p", "pTagHelper", ContentBehavior.None)
new TagHelperDescriptor("p", "pTagHelper", "SomeAssembly", ContentBehavior.None)
});
}
@ -229,12 +232,13 @@ namespace Microsoft.AspNet.Razor.Test.Generator
{
new TagHelperDescriptor("MyTagHelper",
"MyTagHelper",
"SomeAssembly",
ContentBehavior.None,
new [] {
new TagHelperAttributeDescriptor("BoundProperty",
propertyInfo)
}),
new TagHelperDescriptor("NestedTagHelper", "NestedTagHelper", ContentBehavior.Modify)
new TagHelperDescriptor("NestedTagHelper", "NestedTagHelper", "SomeAssembly", ContentBehavior.Modify)
};
// Act & Assert

View File

@ -21,15 +21,17 @@ namespace Microsoft.AspNet.Razor.Test.Generator
var checkedPropertyInfo = typeof(TestType).GetProperty("Checked");
var tagHelperDescriptors = new TagHelperDescriptor[]
{
new TagHelperDescriptor("p", "PTagHelper", ContentBehavior.None),
new TagHelperDescriptor("p", "PTagHelper", "SomeAssembly", ContentBehavior.None),
new TagHelperDescriptor("input",
"InputTagHelper",
"SomeAssembly",
ContentBehavior.None,
new TagHelperAttributeDescriptor[] {
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo)
}),
new TagHelperDescriptor("input",
"InputTagHelper2",
"SomeAssembly",
ContentBehavior.None,
new TagHelperAttributeDescriptor[] {
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo),

View File

@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Razor.TagHelpers
{
get
{
return new TagHelperDescriptor("p", "PTagHelper", ContentBehavior.None);
return new TagHelperDescriptor("p", "PTagHelper", "SomeAssembly", ContentBehavior.None);
}
}
@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Razor.TagHelpers
{
get
{
return new TagHelperDescriptor("div", "DivTagHelper", ContentBehavior.None);
return new TagHelperDescriptor("div", "DivTagHelper", "SomeAssembly", ContentBehavior.None);
}
}

View File

@ -13,8 +13,8 @@ namespace Microsoft.AspNet.Razor.Test.TagHelpers
public void TagHelperDescriptorProvider_GetTagHelpersReturnsNothingForUnregisteredTags()
{
// Arrange
var divDescriptor = new TagHelperDescriptor("div", "foo1", ContentBehavior.None);
var spanDescriptor = new TagHelperDescriptor("span", "foo2", ContentBehavior.None);
var divDescriptor = new TagHelperDescriptor("div", "foo1", "SomeAssembly", ContentBehavior.None);
var spanDescriptor = new TagHelperDescriptor("span", "foo2", "SomeAssembly", ContentBehavior.None);
var descriptors = new TagHelperDescriptor[] { divDescriptor, spanDescriptor };
var provider = new TagHelperDescriptorProvider(descriptors);
@ -29,9 +29,9 @@ namespace Microsoft.AspNet.Razor.Test.TagHelpers
public void TagHelperDescriptorProvider_GetTagHelpersDoesntReturnNonCatchAllTagsForCatchAll()
{
// Arrange
var divDescriptor = new TagHelperDescriptor("div", "foo1", ContentBehavior.None);
var spanDescriptor = new TagHelperDescriptor("span", "foo2", ContentBehavior.None);
var catchAllDescriptor = new TagHelperDescriptor("*", "foo3", ContentBehavior.None);
var divDescriptor = new TagHelperDescriptor("div", "foo1", "SomeAssembly", ContentBehavior.None);
var spanDescriptor = new TagHelperDescriptor("span", "foo2", "SomeAssembly", ContentBehavior.None);
var catchAllDescriptor = new TagHelperDescriptor("*", "foo3", "SomeAssembly", ContentBehavior.None);
var descriptors = new TagHelperDescriptor[] { divDescriptor, spanDescriptor, catchAllDescriptor };
var provider = new TagHelperDescriptorProvider(descriptors);
@ -47,9 +47,9 @@ namespace Microsoft.AspNet.Razor.Test.TagHelpers
public void TagHelperDescriptorProvider_GetTagHelpersReturnsCatchAllsWithEveryTagName()
{
// Arrange
var divDescriptor = new TagHelperDescriptor("div", "foo1", ContentBehavior.None);
var spanDescriptor = new TagHelperDescriptor("span", "foo2", ContentBehavior.None);
var catchAllDescriptor = new TagHelperDescriptor("*", "foo3", ContentBehavior.None);
var divDescriptor = new TagHelperDescriptor("div", "foo1", "SomeAssembly", ContentBehavior.None);
var spanDescriptor = new TagHelperDescriptor("span", "foo2", "SomeAssembly", ContentBehavior.None);
var catchAllDescriptor = new TagHelperDescriptor("*", "foo3", "SomeAssembly", ContentBehavior.None);
var descriptors = new TagHelperDescriptor[] { divDescriptor, spanDescriptor, catchAllDescriptor };
var provider = new TagHelperDescriptorProvider(descriptors);
@ -73,7 +73,7 @@ namespace Microsoft.AspNet.Razor.Test.TagHelpers
public void TagHelperDescriptorProvider_DuplicateDescriptorsAreNotPartOfTagHelperDescriptorPool()
{
// Arrange
var divDescriptor = new TagHelperDescriptor("div", "foo1", ContentBehavior.None);
var divDescriptor = new TagHelperDescriptor("div", "foo1", "SomeAssembly", ContentBehavior.None);
var descriptors = new TagHelperDescriptor[] { divDescriptor, divDescriptor };
var provider = new TagHelperDescriptorProvider(descriptors);

View File

@ -1175,7 +1175,7 @@ namespace Microsoft.AspNet.Razor.Test.TagHelpers
foreach (var tagName in tagNames)
{
descriptors.Add(
new TagHelperDescriptor(tagName, tagName + "taghelper", ContentBehavior.None));
new TagHelperDescriptor(tagName, tagName + "taghelper", "SomeAssembly", ContentBehavior.None));
}
return new TagHelperDescriptorProvider(descriptors);