Cache XML file information when creating design time based `TagHelperDescriptor`s.
- Prior to this change we'd hit the disk every time we'd create a `TagHelperDesignTimeDescriptor` to locate an assemblies XML files. - Did not want to tie the XML cache to a static member in-case a user updates their XML information between parses. Therefore, changed `TagHelperDescriptorFactory` and `TagHelperDesignTimeDescriptorFactory` to no longer be static. - Put the same `TagHeleprDescriptorFactory` extensibility point as we had for its counterpart `TagHelperTypeResolver` to stay consistent. This involved making `CreateDescriptors` virtual and allowing it to be provided in the `TagHelperDescriptorResolver` constructor. #630
This commit is contained in:
parent
392871beb6
commit
dbe4ce06f2
|
|
@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Factory for <see cref="TagHelperDescriptor"/>s from <see cref="ITypeInfo"/>s.
|
/// Factory for <see cref="TagHelperDescriptor"/>s from <see cref="ITypeInfo"/>s.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class TagHelperDescriptorFactory
|
public class TagHelperDescriptorFactory
|
||||||
{
|
{
|
||||||
private const string DataDashPrefix = "data-";
|
private const string DataDashPrefix = "data-";
|
||||||
private const string TagHelperNameEnding = "TagHelper";
|
private const string TagHelperNameEnding = "TagHelper";
|
||||||
|
|
@ -33,29 +33,49 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
|
|
||||||
private static readonly ITypeInfo StringTypeInfo = new RuntimeTypeInfo(typeof(string).GetTypeInfo());
|
private static readonly ITypeInfo StringTypeInfo = new RuntimeTypeInfo(typeof(string).GetTypeInfo());
|
||||||
|
|
||||||
|
#if !DOTNET5_4
|
||||||
|
private readonly TagHelperDesignTimeDescriptorFactory _designTimeDescriptorFactory;
|
||||||
|
#endif
|
||||||
|
private readonly bool _designTime;
|
||||||
|
|
||||||
// TODO: Investigate if we should cache TagHelperDescriptors for types:
|
// TODO: Investigate if we should cache TagHelperDescriptors for types:
|
||||||
// https://github.com/aspnet/Razor/issues/165
|
// https://github.com/aspnet/Razor/issues/165
|
||||||
|
|
||||||
public static ICollection<char> InvalidNonWhitespaceNameCharacters { get; } = new HashSet<char>(
|
public static ICollection<char> InvalidNonWhitespaceNameCharacters { get; } = new HashSet<char>(
|
||||||
new[] { '@', '!', '<', '/', '?', '[', '>', ']', '=', '"', '\'', '*' });
|
new[] { '@', '!', '<', '/', '?', '[', '>', ']', '=', '"', '\'', '*' });
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Instantiates a new <see cref="TagHelperDescriptorFactory"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="designTime">
|
||||||
|
/// Indicates if <see cref="TagHelperDescriptor"/>s should be created for design time.
|
||||||
|
/// </param>
|
||||||
|
public TagHelperDescriptorFactory(bool designTime)
|
||||||
|
{
|
||||||
|
#if !DOTNET5_4
|
||||||
|
if (designTime)
|
||||||
|
{
|
||||||
|
_designTimeDescriptorFactory = new TagHelperDesignTimeDescriptorFactory();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_designTime = designTime;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a <see cref="TagHelperDescriptor"/> from the given <paramref name="typeInfo"/>.
|
/// Creates a <see cref="TagHelperDescriptor"/> from the given <paramref name="typeInfo"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="assemblyName">The assembly name that contains <paramref name="type"/>.</param>
|
/// <param name="assemblyName">The assembly name that contains <paramref name="type"/>.</param>
|
||||||
/// <param name="typeInfo">The <see cref="ITypeInfo"/> to create a <see cref="TagHelperDescriptor"/> from.
|
/// <param name="typeInfo">The <see cref="ITypeInfo"/> to create a <see cref="TagHelperDescriptor"/> from.
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <param name="designTime">Indicates if the returned <see cref="TagHelperDescriptor"/>s should include
|
|
||||||
/// design time specific information.</param>
|
|
||||||
/// <param name="errorSink">The <see cref="ErrorSink"/> used to collect <see cref="RazorError"/>s encountered
|
/// <param name="errorSink">The <see cref="ErrorSink"/> used to collect <see cref="RazorError"/>s encountered
|
||||||
/// when creating <see cref="TagHelperDescriptor"/>s for the given <paramref name="typeInfo"/>.</param>
|
/// when creating <see cref="TagHelperDescriptor"/>s for the given <paramref name="typeInfo"/>.</param>
|
||||||
/// <returns>
|
/// <returns>
|
||||||
/// A collection of <see cref="TagHelperDescriptor"/>s that describe the given <paramref name="typeInfo"/>.
|
/// A collection of <see cref="TagHelperDescriptor"/>s that describe the given <paramref name="typeInfo"/>.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
public static IEnumerable<TagHelperDescriptor> CreateDescriptors(
|
public virtual IEnumerable<TagHelperDescriptor> CreateDescriptors(
|
||||||
string assemblyName,
|
string assemblyName,
|
||||||
ITypeInfo typeInfo,
|
ITypeInfo typeInfo,
|
||||||
bool designTime,
|
|
||||||
ErrorSink errorSink)
|
ErrorSink errorSink)
|
||||||
{
|
{
|
||||||
if (typeInfo == null)
|
if (typeInfo == null)
|
||||||
|
|
@ -68,12 +88,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
throw new ArgumentNullException(nameof(errorSink));
|
throw new ArgumentNullException(nameof(errorSink));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ShouldSkipDescriptorCreation(designTime, typeInfo))
|
if (ShouldSkipDescriptorCreation(typeInfo))
|
||||||
{
|
{
|
||||||
return Enumerable.Empty<TagHelperDescriptor>();
|
return Enumerable.Empty<TagHelperDescriptor>();
|
||||||
}
|
}
|
||||||
|
|
||||||
var attributeDescriptors = GetAttributeDescriptors(typeInfo, designTime, errorSink);
|
var attributeDescriptors = GetAttributeDescriptors(typeInfo, errorSink);
|
||||||
var targetElementAttributes = GetValidHtmlTargetElementAttributes(typeInfo, errorSink);
|
var targetElementAttributes = GetValidHtmlTargetElementAttributes(typeInfo, errorSink);
|
||||||
var allowedChildren = GetAllowedChildren(typeInfo, errorSink);
|
var allowedChildren = GetAllowedChildren(typeInfo, errorSink);
|
||||||
|
|
||||||
|
|
@ -83,8 +103,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
assemblyName,
|
assemblyName,
|
||||||
attributeDescriptors,
|
attributeDescriptors,
|
||||||
targetElementAttributes,
|
targetElementAttributes,
|
||||||
allowedChildren,
|
allowedChildren);
|
||||||
designTime);
|
|
||||||
|
|
||||||
return tagHelperDescriptors.Distinct(TagHelperDescriptorComparer.Default);
|
return tagHelperDescriptors.Distinct(TagHelperDescriptorComparer.Default);
|
||||||
}
|
}
|
||||||
|
|
@ -99,24 +118,23 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
attribute => ValidHtmlTargetElementAttributeNames(attribute, errorSink));
|
attribute => ValidHtmlTargetElementAttributeNames(attribute, errorSink));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IEnumerable<TagHelperDescriptor> BuildTagHelperDescriptors(
|
private IEnumerable<TagHelperDescriptor> BuildTagHelperDescriptors(
|
||||||
ITypeInfo typeInfo,
|
ITypeInfo typeInfo,
|
||||||
string assemblyName,
|
string assemblyName,
|
||||||
IEnumerable<TagHelperAttributeDescriptor> attributeDescriptors,
|
IEnumerable<TagHelperAttributeDescriptor> attributeDescriptors,
|
||||||
IEnumerable<HtmlTargetElementAttribute> targetElementAttributes,
|
IEnumerable<HtmlTargetElementAttribute> targetElementAttributes,
|
||||||
IEnumerable<string> allowedChildren,
|
IEnumerable<string> allowedChildren)
|
||||||
bool designTime)
|
|
||||||
{
|
{
|
||||||
TagHelperDesignTimeDescriptor typeDesignTimeDescriptor = null;
|
TagHelperDesignTimeDescriptor typeDesignTimeDescriptor = null;
|
||||||
|
|
||||||
#if !DOTNET5_4
|
#if !DOTNET5_4
|
||||||
if (designTime)
|
if (_designTime)
|
||||||
{
|
{
|
||||||
var runtimeTypeInfo = typeInfo as RuntimeTypeInfo;
|
var runtimeTypeInfo = typeInfo as RuntimeTypeInfo;
|
||||||
if (runtimeTypeInfo != null)
|
if (runtimeTypeInfo != null)
|
||||||
{
|
{
|
||||||
typeDesignTimeDescriptor =
|
typeDesignTimeDescriptor =
|
||||||
TagHelperDesignTimeDescriptorFactory.CreateDescriptor(runtimeTypeInfo.TypeInfo.AsType());
|
_designTimeDescriptorFactory.CreateDescriptor(runtimeTypeInfo.TypeInfo.AsType());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -387,10 +405,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
return validName;
|
return validName;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IEnumerable<TagHelperAttributeDescriptor> GetAttributeDescriptors(
|
private IEnumerable<TagHelperAttributeDescriptor> GetAttributeDescriptors(ITypeInfo type, ErrorSink errorSink)
|
||||||
ITypeInfo type,
|
|
||||||
bool designTime,
|
|
||||||
ErrorSink errorSink)
|
|
||||||
{
|
{
|
||||||
var attributeDescriptors = new List<TagHelperAttributeDescriptor>();
|
var attributeDescriptors = new List<TagHelperAttributeDescriptor>();
|
||||||
|
|
||||||
|
|
@ -400,7 +415,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
var accessibleProperties = type.Properties.Where(IsAccessibleProperty);
|
var accessibleProperties = type.Properties.Where(IsAccessibleProperty);
|
||||||
foreach (var property in accessibleProperties)
|
foreach (var property in accessibleProperties)
|
||||||
{
|
{
|
||||||
if (ShouldSkipDescriptorCreation(designTime, property))
|
if (ShouldSkipDescriptorCreation(property))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -415,7 +430,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
TagHelperAttributeDescriptor mainDescriptor = null;
|
TagHelperAttributeDescriptor mainDescriptor = null;
|
||||||
if (property.HasPublicSetter)
|
if (property.HasPublicSetter)
|
||||||
{
|
{
|
||||||
mainDescriptor = ToAttributeDescriptor(property, attributeName, designTime);
|
mainDescriptor = ToAttributeDescriptor(property, attributeName);
|
||||||
if (!ValidateTagHelperAttributeDescriptor(mainDescriptor, type, errorSink))
|
if (!ValidateTagHelperAttributeDescriptor(mainDescriptor, type, errorSink))
|
||||||
{
|
{
|
||||||
// HtmlAttributeNameAttribute.Name is invalid. Ignore this property completely.
|
// HtmlAttributeNameAttribute.Name is invalid. Ignore this property completely.
|
||||||
|
|
@ -443,7 +458,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
parentType: type,
|
parentType: type,
|
||||||
errorSink: errorSink,
|
errorSink: errorSink,
|
||||||
defaultPrefix: attributeName + "-",
|
defaultPrefix: attributeName + "-",
|
||||||
designTime: designTime,
|
|
||||||
isInvalid: out isInvalid);
|
isInvalid: out isInvalid);
|
||||||
if (indexerDescriptor != null &&
|
if (indexerDescriptor != null &&
|
||||||
!ValidateTagHelperAttributeDescriptor(indexerDescriptor, type, errorSink))
|
!ValidateTagHelperAttributeDescriptor(indexerDescriptor, type, errorSink))
|
||||||
|
|
@ -509,9 +523,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
nameOrPrefix);
|
nameOrPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool ShouldSkipDescriptorCreation(bool designTime, IMemberInfo memberInfo)
|
private bool ShouldSkipDescriptorCreation(IMemberInfo memberInfo)
|
||||||
{
|
{
|
||||||
if (designTime)
|
if (_designTime)
|
||||||
{
|
{
|
||||||
var editorBrowsableAttribute = memberInfo
|
var editorBrowsableAttribute = memberInfo
|
||||||
.GetCustomAttributes<EditorBrowsableAttribute>()
|
.GetCustomAttributes<EditorBrowsableAttribute>()
|
||||||
|
|
@ -594,27 +608,22 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
return isValid;
|
return isValid;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TagHelperAttributeDescriptor ToAttributeDescriptor(
|
private TagHelperAttributeDescriptor ToAttributeDescriptor(IPropertyInfo property, string attributeName)
|
||||||
IPropertyInfo property,
|
|
||||||
string attributeName,
|
|
||||||
bool designTime)
|
|
||||||
{
|
{
|
||||||
return ToAttributeDescriptor(
|
return ToAttributeDescriptor(
|
||||||
property,
|
property,
|
||||||
attributeName,
|
attributeName,
|
||||||
property.PropertyType.FullName,
|
property.PropertyType.FullName,
|
||||||
isIndexer: false,
|
isIndexer: false,
|
||||||
isStringProperty: StringTypeInfo.Equals(property.PropertyType),
|
isStringProperty: StringTypeInfo.Equals(property.PropertyType));
|
||||||
designTime: designTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TagHelperAttributeDescriptor ToIndexerAttributeDescriptor(
|
private TagHelperAttributeDescriptor ToIndexerAttributeDescriptor(
|
||||||
IPropertyInfo property,
|
IPropertyInfo property,
|
||||||
HtmlAttributeNameAttribute attributeNameAttribute,
|
HtmlAttributeNameAttribute attributeNameAttribute,
|
||||||
ITypeInfo parentType,
|
ITypeInfo parentType,
|
||||||
ErrorSink errorSink,
|
ErrorSink errorSink,
|
||||||
string defaultPrefix,
|
string defaultPrefix,
|
||||||
bool designTime,
|
|
||||||
out bool isInvalid)
|
out bool isInvalid)
|
||||||
{
|
{
|
||||||
isInvalid = false;
|
isInvalid = false;
|
||||||
|
|
@ -689,28 +698,26 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
attributeName: prefix,
|
attributeName: prefix,
|
||||||
typeName: dictionaryTypeArguments[1].FullName,
|
typeName: dictionaryTypeArguments[1].FullName,
|
||||||
isIndexer: true,
|
isIndexer: true,
|
||||||
isStringProperty: StringTypeInfo.Equals(dictionaryTypeArguments[1]),
|
isStringProperty: StringTypeInfo.Equals(dictionaryTypeArguments[1]));
|
||||||
designTime: designTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TagHelperAttributeDescriptor ToAttributeDescriptor(
|
private TagHelperAttributeDescriptor ToAttributeDescriptor(
|
||||||
IPropertyInfo property,
|
IPropertyInfo property,
|
||||||
string attributeName,
|
string attributeName,
|
||||||
string typeName,
|
string typeName,
|
||||||
bool isIndexer,
|
bool isIndexer,
|
||||||
bool isStringProperty,
|
bool isStringProperty)
|
||||||
bool designTime)
|
|
||||||
{
|
{
|
||||||
TagHelperAttributeDesignTimeDescriptor propertyDesignTimeDescriptor = null;
|
TagHelperAttributeDesignTimeDescriptor propertyDesignTimeDescriptor = null;
|
||||||
|
|
||||||
#if !DOTNET5_4
|
#if !DOTNET5_4
|
||||||
if (designTime)
|
if (_designTime)
|
||||||
{
|
{
|
||||||
var runtimeProperty = property as RuntimePropertyInfo;
|
var runtimeProperty = property as RuntimePropertyInfo;
|
||||||
if (runtimeProperty != null)
|
if (runtimeProperty != null)
|
||||||
{
|
{
|
||||||
propertyDesignTimeDescriptor =
|
propertyDesignTimeDescriptor =
|
||||||
TagHelperDesignTimeDescriptorFactory.CreateAttributeDescriptor(runtimeProperty.Property);
|
_designTimeDescriptorFactory.CreateAttributeDescriptor(runtimeProperty.Property);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly TagHelperTypeResolver _typeResolver;
|
private readonly TagHelperTypeResolver _typeResolver;
|
||||||
private readonly bool _designTime;
|
private readonly TagHelperDescriptorFactory _descriptorFactory;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Instantiates a new instance of the <see cref="TagHelperDescriptorResolver"/> class.
|
/// Instantiates a new instance of the <see cref="TagHelperDescriptorResolver"/> class.
|
||||||
|
|
@ -32,7 +32,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
/// <param name="designTime">Indicates whether resolved <see cref="TagHelperDescriptor"/>s should include
|
/// <param name="designTime">Indicates whether resolved <see cref="TagHelperDescriptor"/>s should include
|
||||||
/// design time specific information.</param>
|
/// design time specific information.</param>
|
||||||
public TagHelperDescriptorResolver(bool designTime)
|
public TagHelperDescriptorResolver(bool designTime)
|
||||||
: this(new TagHelperTypeResolver(), designTime)
|
: this(new TagHelperTypeResolver(), new TagHelperDescriptorFactory(designTime))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -41,12 +41,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
/// specified <paramref name="typeResolver"/>.
|
/// specified <paramref name="typeResolver"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="typeResolver">The <see cref="TagHelperTypeResolver"/>.</param>
|
/// <param name="typeResolver">The <see cref="TagHelperTypeResolver"/>.</param>
|
||||||
/// <param name="designTime">Indicates whether resolved <see cref="TagHelperDescriptor"/>s should include
|
/// <param name="descriptorFactory">The <see cref="TagHelperDescriptorFactory"/>.</param>
|
||||||
/// design time specific information.</param>
|
public TagHelperDescriptorResolver(
|
||||||
public TagHelperDescriptorResolver(TagHelperTypeResolver typeResolver, bool designTime)
|
TagHelperTypeResolver typeResolver,
|
||||||
|
TagHelperDescriptorFactory descriptorFactory)
|
||||||
{
|
{
|
||||||
_typeResolver = typeResolver;
|
_typeResolver = typeResolver;
|
||||||
_designTime = designTime;
|
_descriptorFactory = descriptorFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|
@ -137,7 +138,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
|
|
||||||
// Convert types to TagHelperDescriptors
|
// Convert types to TagHelperDescriptors
|
||||||
var descriptors = tagHelperTypes.SelectMany(
|
var descriptors = tagHelperTypes.SelectMany(
|
||||||
type => TagHelperDescriptorFactory.CreateDescriptors(assemblyName, type, _designTime, errorSink));
|
type => _descriptorFactory.CreateDescriptors(assemblyName, type, errorSink));
|
||||||
|
|
||||||
return descriptors;
|
return descriptors;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#if !DOTNET5_4 // Cannot accurately resolve the location of the documentation XML file in coreclr.
|
#if !DOTNET5_4 // Cannot accurately resolve the location of the documentation XML file in coreclr.
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
@ -10,6 +11,7 @@ using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Microsoft.AspNet.Razor.Compilation.TagHelpers;
|
using Microsoft.AspNet.Razor.Compilation.TagHelpers;
|
||||||
using Microsoft.AspNet.Razor.TagHelpers;
|
using Microsoft.AspNet.Razor.TagHelpers;
|
||||||
|
using Microsoft.Extensions.Internal;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
|
|
@ -17,8 +19,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
/// Factory for providing <see cref="TagHelperDesignTimeDescriptor"/>s from <see cref="Type"/>s and
|
/// Factory for providing <see cref="TagHelperDesignTimeDescriptor"/>s from <see cref="Type"/>s and
|
||||||
/// <see cref="TagHelperAttributeDesignTimeDescriptor"/>s from <see cref="PropertyInfo"/>s.
|
/// <see cref="TagHelperAttributeDesignTimeDescriptor"/>s from <see cref="PropertyInfo"/>s.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class TagHelperDesignTimeDescriptorFactory
|
public class TagHelperDesignTimeDescriptorFactory
|
||||||
{
|
{
|
||||||
|
private readonly ConcurrentDictionary<int, XmlDocumentationProvider> _documentationProviderCache =
|
||||||
|
new ConcurrentDictionary<int, XmlDocumentationProvider>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a <see cref="TagHelperDesignTimeDescriptor"/> from the given <paramref name="type"/>.
|
/// Creates a <see cref="TagHelperDesignTimeDescriptor"/> from the given <paramref name="type"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -27,7 +32,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <returns>A <see cref="TagHelperDesignTimeDescriptor"/> that describes design time specific information
|
/// <returns>A <see cref="TagHelperDesignTimeDescriptor"/> that describes design time specific information
|
||||||
/// for the given <paramref name="type"/>.</returns>
|
/// for the given <paramref name="type"/>.</returns>
|
||||||
public static TagHelperDesignTimeDescriptor CreateDescriptor(Type type)
|
public TagHelperDesignTimeDescriptor CreateDescriptor(Type type)
|
||||||
{
|
{
|
||||||
if (type == null)
|
if (type == null)
|
||||||
{
|
{
|
||||||
|
|
@ -66,8 +71,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <returns>A <see cref="TagHelperAttributeDesignTimeDescriptor"/> that describes design time specific
|
/// <returns>A <see cref="TagHelperAttributeDesignTimeDescriptor"/> that describes design time specific
|
||||||
/// information for the given <paramref name="propertyInfo"/>.</returns>
|
/// information for the given <paramref name="propertyInfo"/>.</returns>
|
||||||
public static TagHelperAttributeDesignTimeDescriptor CreateAttributeDescriptor(
|
public TagHelperAttributeDesignTimeDescriptor CreateAttributeDescriptor(PropertyInfo propertyInfo)
|
||||||
PropertyInfo propertyInfo)
|
|
||||||
{
|
{
|
||||||
if (propertyInfo == null)
|
if (propertyInfo == null)
|
||||||
{
|
{
|
||||||
|
|
@ -77,7 +81,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
var id = XmlDocumentationProvider.GetId(propertyInfo);
|
var id = XmlDocumentationProvider.GetId(propertyInfo);
|
||||||
var declaringAssembly = propertyInfo.DeclaringType.Assembly;
|
var declaringAssembly = propertyInfo.DeclaringType.Assembly;
|
||||||
var documentationDescriptor = CreateDocumentationDescriptor(declaringAssembly, id);
|
var documentationDescriptor = CreateDocumentationDescriptor(declaringAssembly, id);
|
||||||
|
|
||||||
if (documentationDescriptor != null)
|
if (documentationDescriptor != null)
|
||||||
{
|
{
|
||||||
return new TagHelperAttributeDesignTimeDescriptor
|
return new TagHelperAttributeDesignTimeDescriptor
|
||||||
|
|
@ -90,31 +93,51 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DocumentationDescriptor CreateDocumentationDescriptor(Assembly assembly, string id)
|
private XmlDocumentationProvider GetXmlDocumentationProvider(Assembly assembly)
|
||||||
{
|
{
|
||||||
var assemblyLocation = assembly.Location;
|
var hashCodeCombiner = HashCodeCombiner.Start();
|
||||||
|
hashCodeCombiner.Add(assembly);
|
||||||
|
hashCodeCombiner.Add(CultureInfo.CurrentCulture);
|
||||||
|
var cacheKey = hashCodeCombiner.CombinedHash;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(assemblyLocation) && !string.IsNullOrEmpty(assembly.CodeBase))
|
var documentationProvider = _documentationProviderCache.GetOrAdd(cacheKey, valueFactory: _ =>
|
||||||
{
|
{
|
||||||
var uri = new UriBuilder(assembly.CodeBase);
|
var assemblyLocation = assembly.Location;
|
||||||
|
|
||||||
// Normalize the path to a UNC path. This will remove things like file:// from start of the uri.Path.
|
if (string.IsNullOrEmpty(assemblyLocation) && !string.IsNullOrEmpty(assembly.CodeBase))
|
||||||
assemblyLocation = Uri.UnescapeDataString(uri.Path);
|
{
|
||||||
}
|
var uri = new UriBuilder(assembly.CodeBase);
|
||||||
|
|
||||||
|
// Normalize the path to UNC path. This will remove things like file:// from start of uri.Path.
|
||||||
|
assemblyLocation = Uri.UnescapeDataString(uri.Path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Couldn't resolve a valid assemblyLocation.
|
||||||
|
if (string.IsNullOrEmpty(assemblyLocation))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var xmlDocumentationFile = GetXmlDocumentationFile(assembly, assemblyLocation);
|
||||||
|
|
||||||
|
// Only want to process the file if it exists.
|
||||||
|
if (xmlDocumentationFile != null)
|
||||||
|
{
|
||||||
|
return new XmlDocumentationProvider(xmlDocumentationFile.FullName);
|
||||||
|
}
|
||||||
|
|
||||||
// Couldn't resolve a valid assemblyLocation.
|
|
||||||
if (string.IsNullOrEmpty(assemblyLocation))
|
|
||||||
{
|
|
||||||
return null;
|
return null;
|
||||||
}
|
});
|
||||||
|
|
||||||
var xmlDocumentationFile = GetXmlDocumentationFile(assembly, assemblyLocation);
|
return documentationProvider;
|
||||||
|
}
|
||||||
|
|
||||||
// Only want to process the file if it exists.
|
private DocumentationDescriptor CreateDocumentationDescriptor(Assembly assembly, string id)
|
||||||
if (xmlDocumentationFile != null)
|
{
|
||||||
|
var documentationProvider = GetXmlDocumentationProvider(assembly);
|
||||||
|
|
||||||
|
if (documentationProvider != null)
|
||||||
{
|
{
|
||||||
var documentationProvider = new XmlDocumentationProvider(xmlDocumentationFile.FullName);
|
|
||||||
|
|
||||||
var summary = documentationProvider.GetSummary(id);
|
var summary = documentationProvider.GetSummary(id);
|
||||||
var remarks = documentationProvider.GetRemarks(id);
|
var remarks = documentationProvider.GetRemarks(id);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,12 @@
|
||||||
"frameworkAssemblies": {
|
"frameworkAssemblies": {
|
||||||
"System.Xml": "4.0.0.0",
|
"System.Xml": "4.0.0.0",
|
||||||
"System.Xml.Linq": "4.0.0.0"
|
"System.Xml.Linq": "4.0.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.HashCodeCombiner.Sources": {
|
||||||
|
"type": "build",
|
||||||
|
"version": "1.0.0-*"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dotnet5.4": {
|
"dotnet5.4": {
|
||||||
|
|
|
||||||
|
|
@ -37,12 +37,12 @@ namespace Microsoft.AspNet.Razor.Runtime.Precompilation
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(tagHelperType),
|
GetTypeInfo(tagHelperType),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
var objectAssemblyName = typeof(object).GetTypeInfo().Assembly.GetName().Name;
|
var objectAssemblyName = typeof(object).GetTypeInfo().Assembly.GetName().Name;
|
||||||
var expectedDescriptor =
|
var expectedDescriptor =
|
||||||
CreateTagHelperDescriptor("object", "System.Object", objectAssemblyName);
|
CreateTagHelperDescriptor("object", "System.Object", objectAssemblyName);
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
objectAssemblyName,
|
objectAssemblyName,
|
||||||
GetTypeInfo(typeof(object)),
|
GetTypeInfo(typeof(object)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -48,12 +48,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(tagHelperType),
|
GetTypeInfo(tagHelperType),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -137,12 +137,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: true);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(tagHelperType),
|
GetTypeInfo(tagHelperType),
|
||||||
designTime: true,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
|
||||||
|
|
@ -88,12 +88,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(tagHelperType),
|
GetTypeInfo(tagHelperType),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -177,12 +177,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(tagHelperType),
|
GetTypeInfo(tagHelperType),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -262,12 +262,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(tagHelperType),
|
GetTypeInfo(tagHelperType),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -351,12 +351,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(tagHelperType),
|
GetTypeInfo(tagHelperType),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -587,12 +587,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(tagHelperType),
|
GetTypeInfo(tagHelperType),
|
||||||
designTime,
|
|
||||||
errorSink);
|
errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -789,12 +789,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(tagHelperType),
|
GetTypeInfo(tagHelperType),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -838,12 +838,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(tagHelperType),
|
GetTypeInfo(tagHelperType),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -875,12 +875,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
CreateTagHelperAttributeDescriptor("Something-Else", validProperty2)
|
CreateTagHelperAttributeDescriptor("Something-Else", validProperty2)
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(OverriddenAttributeTagHelper)),
|
GetTypeInfo(typeof(OverriddenAttributeTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -909,12 +909,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
CreateTagHelperAttributeDescriptor("Something-Else", validProperty2)
|
CreateTagHelperAttributeDescriptor("Something-Else", validProperty2)
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(InheritedOverriddenAttributeTagHelper)),
|
GetTypeInfo(typeof(InheritedOverriddenAttributeTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -943,12 +943,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
CreateTagHelperAttributeDescriptor("Something-Else", validProperty2)
|
CreateTagHelperAttributeDescriptor("Something-Else", validProperty2)
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(InheritedNotOverriddenAttributeTagHelper)),
|
GetTypeInfo(typeof(InheritedNotOverriddenAttributeTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Empty(errorSink.Errors);
|
Assert.Empty(errorSink.Errors);
|
||||||
|
|
@ -973,12 +973,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
TypeName = typeof(int).FullName
|
TypeName = typeof(int).FullName
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(InheritedSingleAttributeTagHelper)),
|
GetTypeInfo(typeof(InheritedSingleAttributeTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -1001,12 +1001,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
CreateTagHelperAttributeDescriptor("int-attribute", intProperty)
|
CreateTagHelperAttributeDescriptor("int-attribute", intProperty)
|
||||||
});
|
});
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(SingleAttributeTagHelper)),
|
GetTypeInfo(typeof(SingleAttributeTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: new ErrorSink());
|
errorSink: new ErrorSink());
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -1030,12 +1030,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
CreateTagHelperAttributeDescriptor("valid-attribute", validProperty)
|
CreateTagHelperAttributeDescriptor("valid-attribute", validProperty)
|
||||||
});
|
});
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(MissingAccessorTagHelper)),
|
GetTypeInfo(typeof(MissingAccessorTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -1059,12 +1059,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
CreateTagHelperAttributeDescriptor("valid-attribute", validProperty)
|
CreateTagHelperAttributeDescriptor("valid-attribute", validProperty)
|
||||||
});
|
});
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(NonPublicAccessorTagHelper)),
|
GetTypeInfo(typeof(NonPublicAccessorTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -1091,12 +1091,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
TypeName = typeof(object).FullName
|
TypeName = typeof(object).FullName
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(NotBoundAttributeTagHelper)),
|
GetTypeInfo(typeof(NotBoundAttributeTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -1110,12 +1110,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(DuplicateAttributeNameTagHelper)),
|
GetTypeInfo(typeof(DuplicateAttributeNameTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -1159,12 +1159,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(MultiTagTagHelper)),
|
GetTypeInfo(typeof(MultiTagTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -1191,12 +1191,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
CreateTagHelperAttributeDescriptor("valid-attribute", validProp)
|
CreateTagHelperAttributeDescriptor("valid-attribute", validProp)
|
||||||
});
|
});
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(InheritedMultiTagTagHelper)),
|
GetTypeInfo(typeof(InheritedMultiTagTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -1221,12 +1221,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
typeof(DuplicateTagNameTagHelper).FullName,
|
typeof(DuplicateTagNameTagHelper).FullName,
|
||||||
AssemblyName)
|
AssemblyName)
|
||||||
};
|
};
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(DuplicateTagNameTagHelper)),
|
GetTypeInfo(typeof(DuplicateTagNameTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -1251,12 +1251,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
typeof(OverrideNameTagHelper).FullName,
|
typeof(OverrideNameTagHelper).FullName,
|
||||||
AssemblyName),
|
AssemblyName),
|
||||||
};
|
};
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(typeof(OverrideNameTagHelper)),
|
GetTypeInfo(typeof(OverrideNameTagHelper)),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -1439,12 +1439,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var errorSink = new ErrorSink();
|
var errorSink = new ErrorSink();
|
||||||
|
var factory = new TagHelperDescriptorFactory(designTime: false);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
var descriptors = factory.CreateDescriptors(
|
||||||
AssemblyName,
|
AssemblyName,
|
||||||
GetTypeInfo(type),
|
GetTypeInfo(type),
|
||||||
designTime: false,
|
|
||||||
errorSink: errorSink);
|
errorSink: errorSink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
|
||||||
|
|
@ -1381,7 +1381,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
private class TestTagHelperDescriptorResolver : TagHelperDescriptorResolver
|
private class TestTagHelperDescriptorResolver : TagHelperDescriptorResolver
|
||||||
{
|
{
|
||||||
public TestTagHelperDescriptorResolver(TagHelperTypeResolver typeResolver)
|
public TestTagHelperDescriptorResolver(TagHelperTypeResolver typeResolver)
|
||||||
: base(typeResolver, designTime: false)
|
: base(typeResolver, new TagHelperDescriptorFactory(designTime: false))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -74,8 +74,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
Type tagHelperType,
|
Type tagHelperType,
|
||||||
TagHelperDesignTimeDescriptor expectedDescriptor)
|
TagHelperDesignTimeDescriptor expectedDescriptor)
|
||||||
{
|
{
|
||||||
|
// Arrange
|
||||||
|
var factory = new TagHelperDesignTimeDescriptorFactory();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var descriptors = TagHelperDesignTimeDescriptorFactory.CreateDescriptor(tagHelperType);
|
var descriptors = factory.CreateDescriptor(tagHelperType);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(expectedDescriptor, descriptors, TagHelperDesignTimeDescriptorComparer.Default);
|
Assert.Equal(expectedDescriptor, descriptors, TagHelperDesignTimeDescriptorComparer.Default);
|
||||||
|
|
@ -142,8 +145,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
Type tagHelperType,
|
Type tagHelperType,
|
||||||
TagHelperDesignTimeDescriptor expectedDesignTimeDescriptor)
|
TagHelperDesignTimeDescriptor expectedDesignTimeDescriptor)
|
||||||
{
|
{
|
||||||
|
// Arrange
|
||||||
|
var factory = new TagHelperDesignTimeDescriptorFactory();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var designTimeDescriptor = TagHelperDesignTimeDescriptorFactory.CreateDescriptor(tagHelperType);
|
var designTimeDescriptor = factory.CreateDescriptor(tagHelperType);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(expectedDesignTimeDescriptor, designTimeDescriptor, TagHelperDesignTimeDescriptorComparer.Default);
|
Assert.Equal(expectedDesignTimeDescriptor, designTimeDescriptor, TagHelperDesignTimeDescriptorComparer.Default);
|
||||||
|
|
@ -219,17 +225,59 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
TagHelperDesignTimeDescriptor designTimeDescriptor;
|
TagHelperDesignTimeDescriptor designTimeDescriptor;
|
||||||
|
var factory = new TagHelperDesignTimeDescriptorFactory();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
using (new CultureReplacer(culture))
|
using (new CultureReplacer(culture))
|
||||||
{
|
{
|
||||||
designTimeDescriptor = TagHelperDesignTimeDescriptorFactory.CreateDescriptor(tagHelperType);
|
designTimeDescriptor = factory.CreateDescriptor(tagHelperType);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(expectedDesignTimeDescriptor, designTimeDescriptor, TagHelperDesignTimeDescriptorComparer.Default);
|
Assert.Equal(expectedDesignTimeDescriptor, designTimeDescriptor, TagHelperDesignTimeDescriptorComparer.Default);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CreateDescriptor_WithLocalizedType_CachesBasedOnCulture()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var factory = new TagHelperDesignTimeDescriptorFactory();
|
||||||
|
var expectedFRDesignTimeDescriptor = new TagHelperDesignTimeDescriptor
|
||||||
|
{
|
||||||
|
Summary = "fr-FR: " + TypeSummary,
|
||||||
|
Remarks = "fr-FR: " + TypeRemarks,
|
||||||
|
OutputElementHint = "p",
|
||||||
|
};
|
||||||
|
var expectedNLBEDesignTimeDescriptor = new TagHelperDesignTimeDescriptor
|
||||||
|
{
|
||||||
|
Summary = "nl-BE: " + TypeSummary,
|
||||||
|
Remarks = "nl-BE: " + TypeRemarks,
|
||||||
|
OutputElementHint = "p",
|
||||||
|
};
|
||||||
|
var tagHelperType = CreateDocumentationTagHelperType(LocalizedDocumentedAssemblyLocation, codeBase: null);
|
||||||
|
TagHelperDesignTimeDescriptor frDesignTimeDescriptor, nlBEDesignTimeDescriptor;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
using (new CultureReplacer("fr-FR"))
|
||||||
|
{
|
||||||
|
frDesignTimeDescriptor = factory.CreateDescriptor(tagHelperType);
|
||||||
|
}
|
||||||
|
using (new CultureReplacer("nl-BE"))
|
||||||
|
{
|
||||||
|
nlBEDesignTimeDescriptor = factory.CreateDescriptor(tagHelperType);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(
|
||||||
|
expectedFRDesignTimeDescriptor,
|
||||||
|
frDesignTimeDescriptor,
|
||||||
|
TagHelperDesignTimeDescriptorComparer.Default);
|
||||||
|
Assert.Equal(
|
||||||
|
expectedNLBEDesignTimeDescriptor,
|
||||||
|
nlBEDesignTimeDescriptor,
|
||||||
|
TagHelperDesignTimeDescriptorComparer.Default);
|
||||||
|
}
|
||||||
|
|
||||||
public static TheoryData CreateAttributeDescriptor_PropertyDocumentationData
|
public static TheoryData CreateAttributeDescriptor_PropertyDocumentationData
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|
@ -374,9 +422,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
var mockPropertyInfo = new Mock<PropertyInfo>();
|
var mockPropertyInfo = new Mock<PropertyInfo>();
|
||||||
mockPropertyInfo.Setup(propertyInfo => propertyInfo.DeclaringType).Returns(tagHelperType);
|
mockPropertyInfo.Setup(propertyInfo => propertyInfo.DeclaringType).Returns(tagHelperType);
|
||||||
mockPropertyInfo.Setup(propertyInfo => propertyInfo.Name).Returns(propertyName);
|
mockPropertyInfo.Setup(propertyInfo => propertyInfo.Name).Returns(propertyName);
|
||||||
|
var factory = new TagHelperDesignTimeDescriptorFactory();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var designTimeDescriptor = TagHelperDesignTimeDescriptorFactory.CreateAttributeDescriptor(
|
var designTimeDescriptor = factory.CreateAttributeDescriptor(
|
||||||
mockPropertyInfo.Object);
|
mockPropertyInfo.Object);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -456,11 +505,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
.Setup(propertyInfo => propertyInfo.Name)
|
.Setup(propertyInfo => propertyInfo.Name)
|
||||||
.Returns(nameof(DocumentedTagHelper.RemarksAndSummaryProperty));
|
.Returns(nameof(DocumentedTagHelper.RemarksAndSummaryProperty));
|
||||||
TagHelperAttributeDesignTimeDescriptor designTimeDescriptor;
|
TagHelperAttributeDesignTimeDescriptor designTimeDescriptor;
|
||||||
|
var factory = new TagHelperDesignTimeDescriptorFactory();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
using (new CultureReplacer(culture))
|
using (new CultureReplacer(culture))
|
||||||
{
|
{
|
||||||
designTimeDescriptor = TagHelperDesignTimeDescriptorFactory.CreateAttributeDescriptor(
|
designTimeDescriptor = factory.CreateAttributeDescriptor(
|
||||||
mockPropertyInfo.Object);
|
mockPropertyInfo.Object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -471,6 +521,50 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
||||||
TagHelperAttributeDesignTimeDescriptorComparer.Default);
|
TagHelperAttributeDesignTimeDescriptorComparer.Default);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CreateDescriptor_WithLocalizedProperty_CachesBasedOnCulture()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var tagHelperType = CreateDocumentationTagHelperType(LocalizedDocumentedAssemblyLocation, codeBase: null);
|
||||||
|
var mockPropertyInfo = new Mock<PropertyInfo>();
|
||||||
|
mockPropertyInfo.Setup(propertyInfo => propertyInfo.DeclaringType).Returns(tagHelperType);
|
||||||
|
mockPropertyInfo
|
||||||
|
.Setup(propertyInfo => propertyInfo.Name)
|
||||||
|
.Returns(nameof(DocumentedTagHelper.RemarksAndSummaryProperty));
|
||||||
|
var factory = new TagHelperDesignTimeDescriptorFactory();
|
||||||
|
var expectedFRDesignTimeDescriptor = new TagHelperAttributeDesignTimeDescriptor
|
||||||
|
{
|
||||||
|
Summary = "fr-FR: " + PropertyWithSummaryAndRemarks_Summary,
|
||||||
|
Remarks = "fr-FR: " + PropertyWithSummaryAndRemarks_Remarks
|
||||||
|
};
|
||||||
|
var expectedNLBEDesignTimeDescriptor = new TagHelperAttributeDesignTimeDescriptor
|
||||||
|
{
|
||||||
|
Summary = "nl-BE: " + PropertyWithSummaryAndRemarks_Summary,
|
||||||
|
Remarks = "nl-BE: " + PropertyWithSummaryAndRemarks_Remarks
|
||||||
|
};
|
||||||
|
TagHelperAttributeDesignTimeDescriptor frDesignTimeDescriptor, nlBEDesignTimeDescriptor;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
using (new CultureReplacer("fr-FR"))
|
||||||
|
{
|
||||||
|
frDesignTimeDescriptor = factory.CreateAttributeDescriptor(mockPropertyInfo.Object);
|
||||||
|
}
|
||||||
|
using (new CultureReplacer("nl-BE"))
|
||||||
|
{
|
||||||
|
nlBEDesignTimeDescriptor = factory.CreateAttributeDescriptor(mockPropertyInfo.Object);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(
|
||||||
|
expectedFRDesignTimeDescriptor,
|
||||||
|
frDesignTimeDescriptor,
|
||||||
|
TagHelperAttributeDesignTimeDescriptorComparer.Default);
|
||||||
|
Assert.Equal(
|
||||||
|
expectedNLBEDesignTimeDescriptor,
|
||||||
|
nlBEDesignTimeDescriptor,
|
||||||
|
TagHelperAttributeDesignTimeDescriptorComparer.Default);
|
||||||
|
}
|
||||||
|
|
||||||
private static Type CreateDocumentationTagHelperType(string location, string codeBase)
|
private static Type CreateDocumentationTagHelperType(string location, string codeBase)
|
||||||
{
|
{
|
||||||
return CreateType<DocumentedTagHelper>(location, codeBase);
|
return CreateType<DocumentedTagHelper>(location, codeBase);
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,6 @@
|
||||||
"type": "build"
|
"type": "build"
|
||||||
},
|
},
|
||||||
"Microsoft.AspNet.Testing": "1.0.0-*",
|
"Microsoft.AspNet.Testing": "1.0.0-*",
|
||||||
"Microsoft.Extensions.HashCodeCombiner.Sources": {
|
|
||||||
"type": "build",
|
|
||||||
"version": "1.0.0-*"
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.WebEncoders": "1.0.0-*",
|
"Microsoft.Extensions.WebEncoders": "1.0.0-*",
|
||||||
"xunit.runner.aspnet": "2.0.0-aspnet-*"
|
"xunit.runner.aspnet": "2.0.0-aspnet-*"
|
||||||
},
|
},
|
||||||
|
|
@ -27,6 +23,13 @@
|
||||||
"Moq": "4.2.1312.1622"
|
"Moq": "4.2.1312.1622"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dnxcore50": {}
|
"dnxcore50": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.HashCodeCombiner.Sources": {
|
||||||
|
"type": "build",
|
||||||
|
"version": "1.0.0-*"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue