// 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));
}
}
}
}