Add hook to add TagHelperDirectiveDescriptors.
- Also added a test to validate that you can hook into the TagHelperDescriptorResolutionContext. #214
This commit is contained in:
parent
c67ec264ed
commit
62e07305cf
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue