Added `TagHelper` support for `enum`s.
- If a `TagHelper` attribute is an `enum` then you no longer need to provide the `enum` name. To override this functionality you can add the `@` symbol. - Added code generation tests. - Added `TagHelperDescriptorFactoryTest`s that double for Precompilation tests. #196
This commit is contained in:
parent
8466119bc7
commit
22ecf85f88
|
|
@ -60,6 +60,9 @@ namespace Microsoft.AspNet.Razor.Runtime.Precompilation
|
|||
/// </summary>
|
||||
public ITypeSymbol TypeSymbol => _type;
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool IsEnum => _type.TypeKind == TypeKind.Enum;
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool IsAbstract => _type.IsAbstract;
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
|||
/// </remarks>
|
||||
IEnumerable<IPropertyInfo> Properties { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether the type is an <see cref="Enum"/>.
|
||||
/// </summary>
|
||||
bool IsEnum { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether the type is public.
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -50,6 +50,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
|||
/// <inheritdoc />
|
||||
public string FullName => TypeInfo.FullName;
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool IsEnum => TypeInfo.IsEnum;
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool IsAbstract => TypeInfo.IsAbstract;
|
||||
|
||||
|
|
|
|||
|
|
@ -719,6 +719,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
|||
{
|
||||
Name = attributeName,
|
||||
PropertyName = property.Name,
|
||||
IsEnum = property.PropertyType.IsEnum,
|
||||
TypeName = typeName,
|
||||
IsStringProperty = isStringProperty,
|
||||
IsIndexer = isIndexer,
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ namespace Microsoft.AspNet.Razor.Test.Internal
|
|||
Assert.Equal(descriptorX.Name, descriptorY.Name, StringComparer.Ordinal);
|
||||
Assert.Equal(descriptorX.PropertyName, descriptorY.PropertyName, StringComparer.Ordinal);
|
||||
Assert.Equal(descriptorX.TypeName, descriptorY.TypeName, StringComparer.Ordinal);
|
||||
Assert.Equal(descriptorX.IsEnum, descriptorY.IsEnum);
|
||||
Assert.Equal(descriptorX.IsStringProperty, descriptorY.IsStringProperty);
|
||||
|
||||
return TagHelperAttributeDesignTimeDescriptorComparer.Default.Equals(
|
||||
|
|
@ -45,6 +46,7 @@ namespace Microsoft.AspNet.Razor.Test.Internal
|
|||
hashCodeCombiner.Add(descriptor.Name, StringComparer.Ordinal);
|
||||
hashCodeCombiner.Add(descriptor.PropertyName, StringComparer.Ordinal);
|
||||
hashCodeCombiner.Add(descriptor.TypeName, StringComparer.Ordinal);
|
||||
hashCodeCombiner.Add(descriptor.IsEnum);
|
||||
hashCodeCombiner.Add(descriptor.IsStringProperty);
|
||||
hashCodeCombiner.Add(TagHelperAttributeDesignTimeDescriptorComparer.Default.GetHashCode(
|
||||
descriptor.DesignTimeDescriptor));
|
||||
|
|
|
|||
|
|
@ -413,9 +413,9 @@ namespace Microsoft.AspNet.Razor.CodeGenerators
|
|||
_writer.WriteStartAssignment(valueAccessor);
|
||||
lineMapper.MarkLineMappingStart();
|
||||
|
||||
// Write out bare expression for this attribute value. Property is not a string.
|
||||
// Write out code expression for this attribute value. Property is not a string.
|
||||
// So quoting or buffering are not helpful.
|
||||
RenderRawAttributeValue(attributeValueChunk, attributeDescriptor, isPlainTextValue);
|
||||
RenderCodeAttributeValue(attributeValueChunk, attributeDescriptor, isPlainTextValue);
|
||||
|
||||
// End the assignment to the attribute.
|
||||
lineMapper.MarkLineMappingEnd();
|
||||
|
|
@ -580,7 +580,7 @@ namespace Microsoft.AspNet.Razor.CodeGenerators
|
|||
complexValue: false);
|
||||
}
|
||||
|
||||
private void RenderRawAttributeValue(
|
||||
private void RenderCodeAttributeValue(
|
||||
Chunk attributeValueChunk,
|
||||
TagHelperAttributeDescriptor attributeDescriptor,
|
||||
bool isPlainTextValue)
|
||||
|
|
@ -589,6 +589,12 @@ namespace Microsoft.AspNet.Razor.CodeGenerators
|
|||
attributeDescriptor,
|
||||
valueRenderer: (writer) =>
|
||||
{
|
||||
if (attributeDescriptor.IsEnum && isPlainTextValue)
|
||||
{
|
||||
writer.Write(attributeDescriptor.TypeName)
|
||||
.Write(".");
|
||||
}
|
||||
|
||||
var visitor =
|
||||
new CSharpTagHelperAttributeValueVisitor(writer, _context, attributeDescriptor.TypeName);
|
||||
visitor.Accept(attributeValueChunk);
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
Name = name;
|
||||
PropertyName = propertyInfo.Name;
|
||||
TypeName = propertyInfo.PropertyType.FullName;
|
||||
IsEnum = propertyInfo.PropertyType.GetTypeInfo().IsEnum;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -45,6 +46,11 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
/// </remarks>
|
||||
public bool IsIndexer { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets an indication whether this property is an <see cref="Enum"/>.
|
||||
/// </summary>
|
||||
public bool IsEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets an indication whether this property is of type <see cref="string"/> or, if
|
||||
/// <see cref="IsIndexer"/> is <c>true</c>, whether the indexer's value is of type <see cref="string"/>.
|
||||
|
|
|
|||
|
|
@ -19,6 +19,93 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
|||
|
||||
protected static readonly string AssemblyName = TagHelperDescriptorFactoryTestAssembly.Name;
|
||||
|
||||
public static TheoryData IsEnumData
|
||||
{
|
||||
get
|
||||
{
|
||||
var attributeDescriptors = new[]
|
||||
{
|
||||
new TagHelperAttributeDescriptor
|
||||
{
|
||||
Name = "non-enum-property",
|
||||
PropertyName = nameof(EnumTagHelper.NonEnumProperty),
|
||||
TypeName = typeof(int).FullName
|
||||
},
|
||||
new TagHelperAttributeDescriptor
|
||||
{
|
||||
Name = "enum-property",
|
||||
PropertyName = nameof(EnumTagHelper.EnumProperty),
|
||||
TypeName = typeof(CustomEnum).FullName,
|
||||
IsEnum = true
|
||||
},
|
||||
};
|
||||
|
||||
// tagHelperType, expectedDescriptors
|
||||
return new TheoryData<Type, TagHelperDescriptor[]>
|
||||
{
|
||||
{
|
||||
typeof(EnumTagHelper),
|
||||
new[]
|
||||
{
|
||||
new TagHelperDescriptor
|
||||
{
|
||||
TagName = "enum",
|
||||
TypeName = typeof(EnumTagHelper).FullName,
|
||||
AssemblyName = AssemblyName,
|
||||
Attributes = attributeDescriptors
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
typeof(MultiEnumTagHelper),
|
||||
new[]
|
||||
{
|
||||
new TagHelperDescriptor
|
||||
{
|
||||
TagName = "input",
|
||||
TypeName = typeof(MultiEnumTagHelper).FullName,
|
||||
AssemblyName = AssemblyName,
|
||||
Attributes = attributeDescriptors
|
||||
},
|
||||
new TagHelperDescriptor
|
||||
{
|
||||
TagName = "p",
|
||||
TypeName = typeof(MultiEnumTagHelper).FullName,
|
||||
AssemblyName = AssemblyName,
|
||||
Attributes = attributeDescriptors
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(IsEnumData))]
|
||||
public void CreateDescriptors_IsEnumIsSetCorrectly(
|
||||
Type tagHelperType,
|
||||
TagHelperDescriptor[] expectedDescriptors)
|
||||
{
|
||||
// Arrange
|
||||
var errorSink = new ErrorSink();
|
||||
|
||||
// Act
|
||||
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
|
||||
AssemblyName,
|
||||
GetTypeInfo(tagHelperType),
|
||||
designTime: false,
|
||||
errorSink: errorSink);
|
||||
|
||||
// Assert
|
||||
Assert.Empty(errorSink.Errors);
|
||||
|
||||
// We don't care about order. Mono returns reflected attributes differently so we need to ensure order
|
||||
// doesn't matter by sorting.
|
||||
descriptors = descriptors.OrderBy(descriptor => descriptor.TagName);
|
||||
|
||||
Assert.Equal(expectedDescriptors, descriptors, CaseSensitiveTagHelperDescriptorComparer.Default);
|
||||
}
|
||||
|
||||
public static TheoryData RequiredParentData
|
||||
{
|
||||
get
|
||||
|
|
|
|||
|
|
@ -9,6 +9,25 @@ using Microsoft.AspNet.Razor.TagHelpers;
|
|||
|
||||
namespace Microsoft.AspNet.Razor.TagHelpers
|
||||
{
|
||||
public enum CustomEnum
|
||||
{
|
||||
FirstValue,
|
||||
SecondValue
|
||||
}
|
||||
|
||||
public class EnumTagHelper : TagHelper
|
||||
{
|
||||
public int NonEnumProperty { get; set; }
|
||||
|
||||
public CustomEnum EnumProperty { get; set; }
|
||||
}
|
||||
|
||||
[HtmlTargetElement("p")]
|
||||
[HtmlTargetElement("input")]
|
||||
public class MultiEnumTagHelper : EnumTagHelper
|
||||
{
|
||||
}
|
||||
|
||||
[HtmlTargetElement("input", ParentTag = "div")]
|
||||
public class RequiredParentTagHelper : TagHelper
|
||||
{
|
||||
|
|
|
|||
|
|
@ -34,6 +34,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
|
|||
}
|
||||
}
|
||||
|
||||
public bool IsEnum
|
||||
{
|
||||
get
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
public bool ImplementsInterface(ITypeInfo other)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
|
|
|
|||
|
|
@ -21,6 +21,48 @@ namespace Microsoft.AspNet.Razor.Test.Generator
|
|||
private static IEnumerable<TagHelperDescriptor> PrefixedPAndInputTagHelperDescriptors { get; }
|
||||
= BuildPAndInputTagHelperDescriptors(prefix: "THS");
|
||||
|
||||
private static IEnumerable<TagHelperDescriptor> EnumTagHelperDescriptors
|
||||
{
|
||||
get
|
||||
{
|
||||
return new[]
|
||||
{
|
||||
new TagHelperDescriptor
|
||||
{
|
||||
TagName = "*",
|
||||
TypeName = "CatchAllTagHelper",
|
||||
AssemblyName = "SomeAssembly",
|
||||
Attributes = new[]
|
||||
{
|
||||
new TagHelperAttributeDescriptor
|
||||
{
|
||||
Name = "catch-all",
|
||||
PropertyName = "CatchAll",
|
||||
IsEnum = true,
|
||||
TypeName = typeof(MyEnum).FullName
|
||||
},
|
||||
}
|
||||
},
|
||||
new TagHelperDescriptor
|
||||
{
|
||||
TagName = "input",
|
||||
TypeName = "InputTagHelper",
|
||||
AssemblyName = "SomeAssembly",
|
||||
Attributes = new[]
|
||||
{
|
||||
new TagHelperAttributeDescriptor
|
||||
{
|
||||
Name = "value",
|
||||
PropertyName = "Value",
|
||||
IsEnum = true,
|
||||
TypeName = typeof(MyEnum).FullName
|
||||
},
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private static IEnumerable<TagHelperDescriptor> SymbolBoundTagHelperDescriptors
|
||||
{
|
||||
get
|
||||
|
|
@ -1588,6 +1630,83 @@ namespace Microsoft.AspNet.Razor.Test.Generator
|
|||
generatedCharacterOffsetIndex: 29,
|
||||
contentLength: 13),
|
||||
}
|
||||
},
|
||||
{
|
||||
"EnumTagHelpers",
|
||||
"EnumTagHelpers.DesignTime",
|
||||
EnumTagHelperDescriptors,
|
||||
new[]
|
||||
{
|
||||
BuildLineMapping(
|
||||
documentAbsoluteIndex: 14,
|
||||
documentLineIndex: 0,
|
||||
generatedAbsoluteIndex: 419,
|
||||
generatedLineIndex: 14,
|
||||
characterOffsetIndex: 14,
|
||||
contentLength: 17),
|
||||
BuildLineMapping(
|
||||
documentAbsoluteIndex: 37,
|
||||
documentLineIndex: 2,
|
||||
generatedAbsoluteIndex: 892,
|
||||
generatedLineIndex: 33,
|
||||
characterOffsetIndex: 2,
|
||||
contentLength: 39),
|
||||
BuildLineMapping(
|
||||
documentAbsoluteIndex: 96,
|
||||
documentLineIndex: 6,
|
||||
documentCharacterOffsetIndex: 15,
|
||||
generatedAbsoluteIndex: 1162,
|
||||
generatedLineIndex: 42,
|
||||
generatedCharacterOffsetIndex: 25,
|
||||
contentLength: 14),
|
||||
BuildLineMapping(
|
||||
documentAbsoluteIndex: 131,
|
||||
documentLineIndex: 7,
|
||||
generatedAbsoluteIndex: 1398,
|
||||
generatedLineIndex: 49,
|
||||
characterOffsetIndex: 15,
|
||||
contentLength: 20),
|
||||
BuildLineMapping(
|
||||
documentAbsoluteIndex: 171,
|
||||
documentLineIndex: 8,
|
||||
documentCharacterOffsetIndex: 14,
|
||||
generatedAbsoluteIndex: 1695,
|
||||
generatedLineIndex: 56,
|
||||
generatedCharacterOffsetIndex: 70,
|
||||
contentLength: 7),
|
||||
BuildLineMapping(
|
||||
documentAbsoluteIndex: 198,
|
||||
documentLineIndex: 9,
|
||||
documentCharacterOffsetIndex: 14,
|
||||
generatedAbsoluteIndex: 1980,
|
||||
generatedLineIndex: 63,
|
||||
generatedCharacterOffsetIndex: 70,
|
||||
contentLength: 13),
|
||||
BuildLineMapping(
|
||||
documentAbsoluteIndex: 224,
|
||||
documentLineIndex: 9,
|
||||
documentCharacterOffsetIndex: 40,
|
||||
generatedAbsoluteIndex: 2146,
|
||||
generatedLineIndex: 68,
|
||||
generatedCharacterOffsetIndex: 85,
|
||||
contentLength: 7),
|
||||
BuildLineMapping(
|
||||
documentAbsoluteIndex: 251,
|
||||
documentLineIndex: 10,
|
||||
documentCharacterOffsetIndex: 15,
|
||||
generatedAbsoluteIndex: 2386,
|
||||
generatedLineIndex: 75,
|
||||
generatedCharacterOffsetIndex: 25,
|
||||
contentLength: 9),
|
||||
BuildLineMapping(
|
||||
documentAbsoluteIndex: 274,
|
||||
documentLineIndex: 10,
|
||||
documentCharacterOffsetIndex: 38,
|
||||
generatedAbsoluteIndex: 2500,
|
||||
generatedLineIndex: 80,
|
||||
generatedCharacterOffsetIndex: 37,
|
||||
contentLength: 9),
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
@ -1640,6 +1759,7 @@ namespace Microsoft.AspNet.Razor.Test.Generator
|
|||
{ "TransitionsInTagHelperAttributes", null, DefaultPAndInputTagHelperDescriptors },
|
||||
{ "NestedScriptTagTagHelpers", null, DefaultPAndInputTagHelperDescriptors },
|
||||
{ "SymbolBoundAttributes", null, SymbolBoundTagHelperDescriptors },
|
||||
{ "EnumTagHelpers", null, EnumTagHelperDescriptors },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -1793,4 +1913,10 @@ namespace Microsoft.AspNet.Razor.Test.Generator
|
|||
public string BoundProperty { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
public enum MyEnum
|
||||
{
|
||||
MyValue,
|
||||
MySecondValue
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,7 +73,8 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
{
|
||||
Name = "attribute one",
|
||||
PropertyName = "property name",
|
||||
TypeName = "property type name"
|
||||
TypeName = "property type name",
|
||||
IsEnum = true,
|
||||
},
|
||||
new TagHelperAttributeDescriptor
|
||||
{
|
||||
|
|
@ -94,12 +95,14 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
$"\"{ nameof(TagHelperDescriptor.AssemblyName) }\":\"assembly name\"," +
|
||||
$"\"{ nameof(TagHelperDescriptor.Attributes) }\":[" +
|
||||
$"{{\"{ nameof(TagHelperAttributeDescriptor.IsIndexer) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsEnum) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsStringProperty) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.Name) }\":\"attribute one\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.PropertyName) }\":\"property name\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.TypeName) }\":\"property type name\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.DesignTimeDescriptor) }\":null}}," +
|
||||
$"{{\"{ nameof(TagHelperAttributeDescriptor.IsIndexer) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsEnum) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsStringProperty) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.Name) }\":\"attribute two\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.PropertyName) }\":\"property name\"," +
|
||||
|
|
@ -135,7 +138,8 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
Name = "attribute one",
|
||||
PropertyName = "property name",
|
||||
TypeName = "property type name",
|
||||
IsIndexer = true
|
||||
IsIndexer = true,
|
||||
IsEnum = true,
|
||||
},
|
||||
new TagHelperAttributeDescriptor
|
||||
{
|
||||
|
|
@ -143,6 +147,7 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
PropertyName = "property name",
|
||||
TypeName = typeof(string).FullName,
|
||||
IsIndexer = true,
|
||||
IsEnum = false,
|
||||
IsStringProperty = true
|
||||
},
|
||||
},
|
||||
|
|
@ -158,12 +163,14 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
$"\"{ nameof(TagHelperDescriptor.AssemblyName) }\":\"assembly name\"," +
|
||||
$"\"{ nameof(TagHelperDescriptor.Attributes) }\":[" +
|
||||
$"{{\"{ nameof(TagHelperAttributeDescriptor.IsIndexer) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsEnum) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsStringProperty) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.Name) }\":\"attribute one\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.PropertyName) }\":\"property name\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.TypeName) }\":\"property type name\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.DesignTimeDescriptor) }\":null}}," +
|
||||
$"{{\"{ nameof(TagHelperAttributeDescriptor.IsIndexer) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsEnum) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsStringProperty) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.Name) }\":\"attribute two\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.PropertyName) }\":\"property name\"," +
|
||||
|
|
@ -249,12 +256,14 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
$"\"{ nameof(TagHelperDescriptor.AssemblyName) }\":\"assembly name\"," +
|
||||
$"\"{ nameof(TagHelperDescriptor.Attributes) }\":[" +
|
||||
$"{{\"{ nameof(TagHelperAttributeDescriptor.IsIndexer) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsEnum) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsStringProperty) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.Name) }\":\"attribute one\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.PropertyName) }\":\"property name\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.TypeName) }\":\"property type name\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.DesignTimeDescriptor) }\":null}}," +
|
||||
$"{{\"{ nameof(TagHelperAttributeDescriptor.IsIndexer) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsEnum) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsStringProperty) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.Name) }\":\"attribute two\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.PropertyName) }\":\"property name\"," +
|
||||
|
|
@ -277,13 +286,15 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
{
|
||||
Name = "attribute one",
|
||||
PropertyName = "property name",
|
||||
TypeName = "property type name"
|
||||
TypeName = "property type name",
|
||||
IsEnum = true,
|
||||
},
|
||||
new TagHelperAttributeDescriptor
|
||||
{
|
||||
Name = "attribute two",
|
||||
PropertyName = "property name",
|
||||
TypeName = typeof(string).FullName,
|
||||
IsEnum = false,
|
||||
IsStringProperty = true
|
||||
},
|
||||
},
|
||||
|
|
@ -316,12 +327,14 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
$"\"{ nameof(TagHelperDescriptor.AssemblyName) }\":\"assembly name\"," +
|
||||
$"\"{ nameof(TagHelperDescriptor.Attributes) }\":[" +
|
||||
$"{{\"{ nameof(TagHelperAttributeDescriptor.IsIndexer) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsEnum) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsStringProperty) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.Name) }\":\"attribute one\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.PropertyName) }\":\"property name\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.TypeName) }\":\"property type name\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.DesignTimeDescriptor) }\":null}}," +
|
||||
$"{{\"{ nameof(TagHelperAttributeDescriptor.IsIndexer) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsEnum) }\":false," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.IsStringProperty) }\":true," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.Name) }\":\"attribute two\"," +
|
||||
$"\"{ nameof(TagHelperAttributeDescriptor.PropertyName) }\":\"property name\"," +
|
||||
|
|
@ -345,7 +358,8 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
Name = "attribute one",
|
||||
PropertyName = "property name",
|
||||
TypeName = "property type name",
|
||||
IsIndexer = true
|
||||
IsIndexer = true,
|
||||
IsEnum = true,
|
||||
},
|
||||
new TagHelperAttributeDescriptor
|
||||
{
|
||||
|
|
@ -353,6 +367,7 @@ namespace Microsoft.AspNet.Razor.Compilation.TagHelpers
|
|||
PropertyName = "property name",
|
||||
TypeName = typeof(string).FullName,
|
||||
IsIndexer = true,
|
||||
IsEnum = false,
|
||||
IsStringProperty = true
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,88 @@
|
|||
namespace TestOutput
|
||||
{
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
public class EnumTagHelpers
|
||||
{
|
||||
private static object @__o;
|
||||
private void @__RazorDesignTimeHelpers__()
|
||||
{
|
||||
#pragma warning disable 219
|
||||
string __tagHelperDirectiveSyntaxHelper = null;
|
||||
__tagHelperDirectiveSyntaxHelper =
|
||||
#line 1 "EnumTagHelpers.cshtml"
|
||||
"something, nice"
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
;
|
||||
#pragma warning restore 219
|
||||
}
|
||||
#line hidden
|
||||
private InputTagHelper __InputTagHelper = null;
|
||||
private CatchAllTagHelper __CatchAllTagHelper = null;
|
||||
#line hidden
|
||||
public EnumTagHelpers()
|
||||
{
|
||||
}
|
||||
|
||||
#pragma warning disable 1998
|
||||
public override async Task ExecuteAsync()
|
||||
{
|
||||
#line 3 "EnumTagHelpers.cshtml"
|
||||
|
||||
var enumValue = MyEnum.MyValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
|
||||
__InputTagHelper = CreateTagHelper<InputTagHelper>();
|
||||
__CatchAllTagHelper = CreateTagHelper<CatchAllTagHelper>();
|
||||
#line 7 "EnumTagHelpers.cshtml"
|
||||
__InputTagHelper.Value = MyEnum.MyValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
__InputTagHelper = CreateTagHelper<InputTagHelper>();
|
||||
__CatchAllTagHelper = CreateTagHelper<CatchAllTagHelper>();
|
||||
#line 8 "EnumTagHelpers.cshtml"
|
||||
__o = MyEnum.MySecondValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
__InputTagHelper = CreateTagHelper<InputTagHelper>();
|
||||
__CatchAllTagHelper = CreateTagHelper<CatchAllTagHelper>();
|
||||
#line 9 "EnumTagHelpers.cshtml"
|
||||
__InputTagHelper.Value = Microsoft.AspNet.Razor.Test.Generator.MyEnum.MyValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
__InputTagHelper = CreateTagHelper<InputTagHelper>();
|
||||
__CatchAllTagHelper = CreateTagHelper<CatchAllTagHelper>();
|
||||
#line 10 "EnumTagHelpers.cshtml"
|
||||
__InputTagHelper.Value = Microsoft.AspNet.Razor.Test.Generator.MyEnum.MySecondValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
#line 10 "EnumTagHelpers.cshtml"
|
||||
__CatchAllTagHelper.CatchAll = Microsoft.AspNet.Razor.Test.Generator.MyEnum.MyValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
__InputTagHelper = CreateTagHelper<InputTagHelper>();
|
||||
__CatchAllTagHelper = CreateTagHelper<CatchAllTagHelper>();
|
||||
#line 11 "EnumTagHelpers.cshtml"
|
||||
__InputTagHelper.Value = enumValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
#line 11 "EnumTagHelpers.cshtml"
|
||||
__CatchAllTagHelper.CatchAll = enumValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
}
|
||||
#pragma warning restore 1998
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,163 @@
|
|||
#pragma checksum "EnumTagHelpers.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "57102d182f8d5da659bb113653552ea18f42bb76"
|
||||
namespace TestOutput
|
||||
{
|
||||
using Microsoft.AspNet.Razor.TagHelpers;
|
||||
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
public class EnumTagHelpers
|
||||
{
|
||||
#line hidden
|
||||
#pragma warning disable 0414
|
||||
private TagHelperContent __tagHelperStringValueBuffer = null;
|
||||
#pragma warning restore 0414
|
||||
private TagHelperExecutionContext __tagHelperExecutionContext = null;
|
||||
private TagHelperRunner __tagHelperRunner = null;
|
||||
private TagHelperScopeManager __tagHelperScopeManager = new TagHelperScopeManager();
|
||||
private InputTagHelper __InputTagHelper = null;
|
||||
private CatchAllTagHelper __CatchAllTagHelper = null;
|
||||
#line hidden
|
||||
public EnumTagHelpers()
|
||||
{
|
||||
}
|
||||
|
||||
#pragma warning disable 1998
|
||||
public override async Task ExecuteAsync()
|
||||
{
|
||||
__tagHelperRunner = __tagHelperRunner ?? new TagHelperRunner();
|
||||
Instrumentation.BeginContext(33, 2, true);
|
||||
WriteLiteral("\r\n");
|
||||
Instrumentation.EndContext();
|
||||
#line 3 "EnumTagHelpers.cshtml"
|
||||
|
||||
var enumValue = MyEnum.MyValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
|
||||
Instrumentation.BeginContext(79, 2, true);
|
||||
WriteLiteral("\r\n");
|
||||
Instrumentation.EndContext();
|
||||
__tagHelperExecutionContext = __tagHelperScopeManager.Begin("input", TagMode.SelfClosing, "test", async() => {
|
||||
}
|
||||
, StartTagHelperWritingScope, EndTagHelperWritingScope);
|
||||
__InputTagHelper = CreateTagHelper<InputTagHelper>();
|
||||
__tagHelperExecutionContext.Add(__InputTagHelper);
|
||||
__CatchAllTagHelper = CreateTagHelper<CatchAllTagHelper>();
|
||||
__tagHelperExecutionContext.Add(__CatchAllTagHelper);
|
||||
#line 7 "EnumTagHelpers.cshtml"
|
||||
__InputTagHelper.Value = MyEnum.MyValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
__tagHelperExecutionContext.AddTagHelperAttribute("value", __InputTagHelper.Value);
|
||||
__tagHelperExecutionContext.Output = await __tagHelperRunner.RunAsync(__tagHelperExecutionContext);
|
||||
Instrumentation.BeginContext(81, 33, false);
|
||||
await WriteTagHelperAsync(__tagHelperExecutionContext);
|
||||
Instrumentation.EndContext();
|
||||
__tagHelperExecutionContext = __tagHelperScopeManager.End();
|
||||
Instrumentation.BeginContext(114, 2, true);
|
||||
WriteLiteral("\r\n");
|
||||
Instrumentation.EndContext();
|
||||
__tagHelperExecutionContext = __tagHelperScopeManager.Begin("input", TagMode.SelfClosing, "test", async() => {
|
||||
}
|
||||
, StartTagHelperWritingScope, EndTagHelperWritingScope);
|
||||
__InputTagHelper = CreateTagHelper<InputTagHelper>();
|
||||
__tagHelperExecutionContext.Add(__InputTagHelper);
|
||||
__CatchAllTagHelper = CreateTagHelper<CatchAllTagHelper>();
|
||||
__tagHelperExecutionContext.Add(__CatchAllTagHelper);
|
||||
BeginAddHtmlAttributeValues(__tagHelperExecutionContext, "class", 1);
|
||||
#line 8 "EnumTagHelpers.cshtml"
|
||||
AddHtmlAttributeValue("", 130, MyEnum.MySecondValue, 130, 21, false);
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
EndAddHtmlAttributeValues(__tagHelperExecutionContext);
|
||||
__tagHelperExecutionContext.Output = await __tagHelperRunner.RunAsync(__tagHelperExecutionContext);
|
||||
Instrumentation.BeginContext(116, 39, false);
|
||||
await WriteTagHelperAsync(__tagHelperExecutionContext);
|
||||
Instrumentation.EndContext();
|
||||
__tagHelperExecutionContext = __tagHelperScopeManager.End();
|
||||
Instrumentation.BeginContext(155, 2, true);
|
||||
WriteLiteral("\r\n");
|
||||
Instrumentation.EndContext();
|
||||
__tagHelperExecutionContext = __tagHelperScopeManager.Begin("input", TagMode.SelfClosing, "test", async() => {
|
||||
}
|
||||
, StartTagHelperWritingScope, EndTagHelperWritingScope);
|
||||
__InputTagHelper = CreateTagHelper<InputTagHelper>();
|
||||
__tagHelperExecutionContext.Add(__InputTagHelper);
|
||||
__CatchAllTagHelper = CreateTagHelper<CatchAllTagHelper>();
|
||||
__tagHelperExecutionContext.Add(__CatchAllTagHelper);
|
||||
#line 9 "EnumTagHelpers.cshtml"
|
||||
__InputTagHelper.Value = Microsoft.AspNet.Razor.Test.Generator.MyEnum.MyValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
__tagHelperExecutionContext.AddTagHelperAttribute("value", __InputTagHelper.Value);
|
||||
__tagHelperExecutionContext.Output = await __tagHelperRunner.RunAsync(__tagHelperExecutionContext);
|
||||
Instrumentation.BeginContext(157, 25, false);
|
||||
await WriteTagHelperAsync(__tagHelperExecutionContext);
|
||||
Instrumentation.EndContext();
|
||||
__tagHelperExecutionContext = __tagHelperScopeManager.End();
|
||||
Instrumentation.BeginContext(182, 2, true);
|
||||
WriteLiteral("\r\n");
|
||||
Instrumentation.EndContext();
|
||||
__tagHelperExecutionContext = __tagHelperScopeManager.Begin("input", TagMode.SelfClosing, "test", async() => {
|
||||
}
|
||||
, StartTagHelperWritingScope, EndTagHelperWritingScope);
|
||||
__InputTagHelper = CreateTagHelper<InputTagHelper>();
|
||||
__tagHelperExecutionContext.Add(__InputTagHelper);
|
||||
__CatchAllTagHelper = CreateTagHelper<CatchAllTagHelper>();
|
||||
__tagHelperExecutionContext.Add(__CatchAllTagHelper);
|
||||
#line 10 "EnumTagHelpers.cshtml"
|
||||
__InputTagHelper.Value = Microsoft.AspNet.Razor.Test.Generator.MyEnum.MySecondValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
__tagHelperExecutionContext.AddTagHelperAttribute("value", __InputTagHelper.Value);
|
||||
#line 10 "EnumTagHelpers.cshtml"
|
||||
__CatchAllTagHelper.CatchAll = Microsoft.AspNet.Razor.Test.Generator.MyEnum.MyValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
__tagHelperExecutionContext.AddTagHelperAttribute("catch-all", __CatchAllTagHelper.CatchAll);
|
||||
__tagHelperExecutionContext.Output = await __tagHelperRunner.RunAsync(__tagHelperExecutionContext);
|
||||
Instrumentation.BeginContext(184, 50, false);
|
||||
await WriteTagHelperAsync(__tagHelperExecutionContext);
|
||||
Instrumentation.EndContext();
|
||||
__tagHelperExecutionContext = __tagHelperScopeManager.End();
|
||||
Instrumentation.BeginContext(234, 2, true);
|
||||
WriteLiteral("\r\n");
|
||||
Instrumentation.EndContext();
|
||||
__tagHelperExecutionContext = __tagHelperScopeManager.Begin("input", TagMode.SelfClosing, "test", async() => {
|
||||
}
|
||||
, StartTagHelperWritingScope, EndTagHelperWritingScope);
|
||||
__InputTagHelper = CreateTagHelper<InputTagHelper>();
|
||||
__tagHelperExecutionContext.Add(__InputTagHelper);
|
||||
__CatchAllTagHelper = CreateTagHelper<CatchAllTagHelper>();
|
||||
__tagHelperExecutionContext.Add(__CatchAllTagHelper);
|
||||
#line 11 "EnumTagHelpers.cshtml"
|
||||
__InputTagHelper.Value = enumValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
__tagHelperExecutionContext.AddTagHelperAttribute("value", __InputTagHelper.Value);
|
||||
#line 11 "EnumTagHelpers.cshtml"
|
||||
__CatchAllTagHelper.CatchAll = enumValue;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
__tagHelperExecutionContext.AddTagHelperAttribute("catch-all", __CatchAllTagHelper.CatchAll);
|
||||
__tagHelperExecutionContext.Output = await __tagHelperRunner.RunAsync(__tagHelperExecutionContext);
|
||||
Instrumentation.BeginContext(236, 51, false);
|
||||
await WriteTagHelperAsync(__tagHelperExecutionContext);
|
||||
Instrumentation.EndContext();
|
||||
__tagHelperExecutionContext = __tagHelperScopeManager.End();
|
||||
Instrumentation.BeginContext(287, 2, true);
|
||||
WriteLiteral("\r\n");
|
||||
Instrumentation.EndContext();
|
||||
}
|
||||
#pragma warning restore 1998
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
@addTagHelper "something, nice"
|
||||
|
||||
@{
|
||||
var enumValue = MyEnum.MyValue;
|
||||
}
|
||||
|
||||
<input value="@MyEnum.MyValue" />
|
||||
<input class="@MyEnum.MySecondValue" />
|
||||
<input value="MyValue" />
|
||||
<input value="MySecondValue" catch-all="MyValue"/>
|
||||
<input value="@enumValue" catch-all="@enumValue" />
|
||||
Loading…
Reference in New Issue