Add hook to add TagHelperDirectiveDescriptors.

- Also added a test to validate that you can hook into the TagHelperDescriptorResolutionContext.

#214
This commit is contained in:
N. Taylor Mullen 2014-11-18 15:01:42 -08:00
parent c67ec264ed
commit 62e07305cf
2 changed files with 75 additions and 9 deletions

View File

@ -32,12 +32,19 @@ namespace Microsoft.AspNet.Razor.Parser.TagHelpers
// This will recurse through the syntax tree. // This will recurse through the syntax tree.
VisitBlock(root); VisitBlock(root);
var resolutionContext = new TagHelperDescriptorResolutionContext(_directiveDescriptors); var resolutionContext = GetTagHelperDescriptorResolutionContext(_directiveDescriptors);
var descriptors = _descriptorResolver.Resolve(resolutionContext); var descriptors = _descriptorResolver.Resolve(resolutionContext);
return descriptors; return descriptors;
} }
// Allows MVC a chance to override the TagHelperDescriptorResolutionContext
protected virtual TagHelperDescriptorResolutionContext GetTagHelperDescriptorResolutionContext(
[NotNull] IEnumerable<TagHelperDirectiveDescriptor> descriptors)
{
return new TagHelperDescriptorResolutionContext(descriptors);
}
public override void VisitSpan(Span span) public override void VisitSpan(Span span)
{ {
// We're only interested in spans with an AddOrRemoveTagHelperCodeGenerator. // We're only interested in spans with an AddOrRemoveTagHelperCodeGenerator.

View File

@ -63,8 +63,48 @@ namespace Microsoft.AspNet.Razor.TagHelpers
addOrRemoveTagHelperSpanVisitor.GetDescriptors(document); addOrRemoveTagHelperSpanVisitor.GetDescriptors(document);
// Assert // Assert
Assert.Equal(expectedRegistrations, Assert.Equal(expectedRegistrations,
resolver.DirectiveDescriptors, resolver.DirectiveDescriptors,
TagHelperDirectiveDescriptorComparer.Default);
}
[Fact]
public void GetDescriptors_CanOverrideResolutionContext()
{
// Arrange
var resolver = new TestTagHelperDescriptorResolver();
var expectedInitialDirectiveDescriptors = new TagHelperDirectiveDescriptor[]
{
new TagHelperDirectiveDescriptor("one", TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("two", TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor("three", TagHelperDirectiveType.RemoveTagHelper),
};
var expectedEndDirectiveDescriptors = new TagHelperDirectiveDescriptor[]
{
new TagHelperDirectiveDescriptor("custom", TagHelperDirectiveType.AddTagHelper)
};
var addOrRemoveTagHelperSpanVisitor = new CustomAddOrRemoveTagHelperSpanVisitor(
resolver,
(descriptors) =>
{
Assert.Equal(expectedInitialDirectiveDescriptors,
descriptors,
TagHelperDirectiveDescriptorComparer.Default);
return new TagHelperDescriptorResolutionContext(expectedEndDirectiveDescriptors);
});
var document = new MarkupBlock(
Factory.Code("\"one\"").AsAddTagHelper("one"),
Factory.Code("\"two\"").AsRemoveTagHelper("two"),
Factory.Code("\"three\"").AsRemoveTagHelper("three"));
// Act
addOrRemoveTagHelperSpanVisitor.GetDescriptors(document);
// Assert
Assert.Equal(expectedEndDirectiveDescriptors,
resolver.DirectiveDescriptors,
TagHelperDirectiveDescriptorComparer.Default); TagHelperDirectiveDescriptorComparer.Default);
} }
@ -81,7 +121,7 @@ namespace Microsoft.AspNet.Razor.TagHelpers
.Accepts(AcceptedCharacters.None), .Accepts(AcceptedCharacters.None),
Factory.Code("\"something\"").AsAddTagHelper("something")) Factory.Code("\"something\"").AsAddTagHelper("something"))
); );
var expectedRegistration = var expectedRegistration =
new TagHelperDirectiveDescriptor("something", TagHelperDirectiveType.AddTagHelper); new TagHelperDirectiveDescriptor("something", TagHelperDirectiveType.AddTagHelper);
// Act // Act
@ -105,7 +145,7 @@ namespace Microsoft.AspNet.Razor.TagHelpers
.Accepts(AcceptedCharacters.None), .Accepts(AcceptedCharacters.None),
Factory.Code("\"something\"").AsRemoveTagHelper("something")) Factory.Code("\"something\"").AsRemoveTagHelper("something"))
); );
var expectedRegistration = var expectedRegistration =
new TagHelperDirectiveDescriptor("something", TagHelperDirectiveType.RemoveTagHelper); new TagHelperDirectiveDescriptor("something", TagHelperDirectiveType.RemoveTagHelper);
// Act // Act
@ -120,7 +160,7 @@ namespace Microsoft.AspNet.Razor.TagHelpers
public void GetDescriptors_RemoveTagHelperNotInDocument_DoesNotThrow() public void GetDescriptors_RemoveTagHelperNotInDocument_DoesNotThrow()
{ {
// Arrange // Arrange
var addOrRemoveTagHelperSpanVisitor = var addOrRemoveTagHelperSpanVisitor =
new AddOrRemoveTagHelperSpanVisitor( new AddOrRemoveTagHelperSpanVisitor(
new TestTagHelperDescriptorResolver()); new TestTagHelperDescriptorResolver());
var document = new MarkupBlock(Factory.Markup("Hello World")); var document = new MarkupBlock(Factory.Markup("Hello World"));
@ -155,11 +195,11 @@ namespace Microsoft.AspNet.Razor.TagHelpers
{ {
} }
public bool Equals(TagHelperDirectiveDescriptor directiveDescriptorX, public bool Equals(TagHelperDirectiveDescriptor directiveDescriptorX,
TagHelperDirectiveDescriptor directiveDescriptorY) TagHelperDirectiveDescriptor directiveDescriptorY)
{ {
return string.Equals(directiveDescriptorX.LookupText, return string.Equals(directiveDescriptorX.LookupText,
directiveDescriptorY.LookupText, directiveDescriptorY.LookupText,
StringComparison.Ordinal) && StringComparison.Ordinal) &&
directiveDescriptorX.DirectiveType == directiveDescriptorY.DirectiveType; directiveDescriptorX.DirectiveType == directiveDescriptorY.DirectiveType;
} }
@ -173,5 +213,24 @@ namespace Microsoft.AspNet.Razor.TagHelpers
.CombinedHash; .CombinedHash;
} }
} }
private class CustomAddOrRemoveTagHelperSpanVisitor : AddOrRemoveTagHelperSpanVisitor
{
private Func<IEnumerable<TagHelperDirectiveDescriptor>, TagHelperDescriptorResolutionContext> _replacer;
public CustomAddOrRemoveTagHelperSpanVisitor(
ITagHelperDescriptorResolver descriptorResolver,
Func<IEnumerable<TagHelperDirectiveDescriptor>, TagHelperDescriptorResolutionContext> replacer)
: base(descriptorResolver)
{
_replacer = replacer;
}
protected override TagHelperDescriptorResolutionContext GetTagHelperDescriptorResolutionContext(
IEnumerable<TagHelperDirectiveDescriptor> descriptors)
{
return _replacer(descriptors);
}
}
} }
} }