// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Razor.Generator.Compiler; using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.Parser.SyntaxTree; using Microsoft.AspNet.Razor.Parser.TagHelpers; using Microsoft.AspNet.Razor.TagHelpers; namespace Microsoft.AspNet.Mvc.Razor { /// /// A subtype of that uses to support inheritance of tag /// helpers from _viewstart files. /// public class MvcRazorParser : RazorParser { private readonly IReadOnlyList _viewStartChunks; /// /// Initializes a new instance of . /// /// The to copy properties from. /// The of s that are inherited /// by parsed pages from _ViewStart files. public MvcRazorParser(RazorParser parser, IReadOnlyList viewStartChunks) : base(parser) { _viewStartChunks = viewStartChunks; } /// protected override IEnumerable GetTagHelperDescriptors([NotNull] Block documentRoot) { // Grab all the @addtaghelper chunks from view starts and construct TagHelperDirectiveDescriptors var directiveDescriptors = _viewStartChunks.OfType() .Select(chunk => new TagHelperDirectiveDescriptor( chunk.LookupText, TagHelperDirectiveType.AddTagHelper)); var visitor = new ViewStartAddRemoveTagHelperVisitor(TagHelperDescriptorResolver, directiveDescriptors); var descriptors = visitor.GetDescriptors(documentRoot); return descriptors; } private class ViewStartAddRemoveTagHelperVisitor : AddOrRemoveTagHelperSpanVisitor { private readonly IEnumerable _viewStartDirectiveDescriptors; public ViewStartAddRemoveTagHelperVisitor( ITagHelperDescriptorResolver descriptorResolver, IEnumerable viewStartDirectiveDescriptors) : base(descriptorResolver) { _viewStartDirectiveDescriptors = viewStartDirectiveDescriptors; } protected override TagHelperDescriptorResolutionContext GetTagHelperDescriptorResolutionContext( IEnumerable descriptors) { return base.GetTagHelperDescriptorResolutionContext( _viewStartDirectiveDescriptors.Concat(descriptors)); } } } }