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

@ -68,6 +68,46 @@ namespace Microsoft.AspNet.Razor.TagHelpers
TagHelperDirectiveDescriptorComparer.Default); 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);
}
[Fact] [Fact]
public void GetDescriptors_LocatesAddTagHelperCodeGenerator() public void GetDescriptors_LocatesAddTagHelperCodeGenerator()
{ {
@ -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);
}
}
} }
} }