Formalize Component node types
This change cleans up the intermediate node types that we have so far
for components and changes the naming, visibility, etc to match our
existing nodes.
The next change will integrate these types with the IR lowering process.
\n\nCommit migrated from 34cf523c0d
This commit is contained in:
parent
51d19d1745
commit
45ad1c0ae8
|
|
@ -262,7 +262,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
};
|
||||
|
||||
if (parent is HtmlElementIntermediateNode)
|
||||
if (parent is MarkupElementIntermediateNode)
|
||||
{
|
||||
var valueNode = new HtmlAttributeIntermediateNode()
|
||||
{
|
||||
|
|
@ -303,7 +303,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
else
|
||||
{
|
||||
var valueNode = new ComponentAttributeExtensionNode(node)
|
||||
var valueNode = new ComponentAttributeIntermediateNode(node)
|
||||
{
|
||||
AttributeName = valueAttributeName,
|
||||
BoundAttribute = valueAttribute, // Might be null if it doesn't match a component attribute
|
||||
|
|
@ -319,7 +319,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
valueNode.Children[0].Children.Add(valueExpressionTokens[i]);
|
||||
}
|
||||
|
||||
var changeNode = new ComponentAttributeExtensionNode(node)
|
||||
var changeNode = new ComponentAttributeIntermediateNode(node)
|
||||
{
|
||||
AttributeName = changeAttributeName,
|
||||
BoundAttribute = changeAttribute, // Might be null if it doesn't match a component attribute
|
||||
|
|
@ -412,7 +412,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
changeAttributeName = node.TagHelper.GetChangeAttributeName() ?? changeAttributeName;
|
||||
|
||||
// We expect 0-1 components per-node.
|
||||
var componentTagHelper = (parent as ComponentExtensionNode)?.Component;
|
||||
var componentTagHelper = (parent as ComponentIntermediateNode)?.Component;
|
||||
if (componentTagHelper == null)
|
||||
{
|
||||
// If it's not a component node then there isn't too much else to figure out.
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
|
||||
private static readonly string DesignTimeVariable = "__o";
|
||||
|
||||
public override void WriteHtmlBlock(CodeRenderingContext context, HtmlBlockIntermediateNode node)
|
||||
public override void WriteHtmlBlock(CodeRenderingContext context, MarkupBlockIntermediateNode node)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
|
|
@ -32,7 +32,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
// Do nothing
|
||||
}
|
||||
|
||||
public override void WriteHtmlElement(CodeRenderingContext context, HtmlElementIntermediateNode node)
|
||||
public override void WriteHtmlElement(CodeRenderingContext context, MarkupElementIntermediateNode node)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
|
|
@ -329,7 +329,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
.WriteParameterSeparator();
|
||||
}
|
||||
|
||||
public override void WriteComponent(CodeRenderingContext context, ComponentExtensionNode node)
|
||||
public override void WriteComponent(CodeRenderingContext context, ComponentIntermediateNode node)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
|
|
@ -459,7 +459,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
}
|
||||
|
||||
public override void WriteComponentAttribute(CodeRenderingContext context, ComponentAttributeExtensionNode node)
|
||||
public override void WriteComponentAttribute(CodeRenderingContext context, ComponentAttributeIntermediateNode node)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
|
|
@ -483,7 +483,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
context.CodeWriter.WriteLine();
|
||||
}
|
||||
|
||||
private void WriteComponentAttributeInnards(CodeRenderingContext context, ComponentAttributeExtensionNode node, bool canTypeCheck)
|
||||
private void WriteComponentAttributeInnards(CodeRenderingContext context, ComponentAttributeIntermediateNode node, bool canTypeCheck)
|
||||
{
|
||||
// We limit component attributes to simple cases. However there is still a lot of complexity
|
||||
// to handle here, since there are a few different cases for how an attribute might be structured.
|
||||
|
|
@ -567,12 +567,12 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
}
|
||||
|
||||
bool NeedsTypeCheck(ComponentAttributeExtensionNode n)
|
||||
bool NeedsTypeCheck(ComponentAttributeIntermediateNode n)
|
||||
{
|
||||
return n.BoundAttribute != null && !n.BoundAttribute.IsWeaklyTyped();
|
||||
}
|
||||
|
||||
IReadOnlyList<IntermediateToken> GetCSharpTokens(ComponentAttributeExtensionNode attribute)
|
||||
IReadOnlyList<IntermediateToken> GetCSharpTokens(ComponentAttributeIntermediateNode attribute)
|
||||
{
|
||||
// We generally expect all children to be CSharp, this is here just in case.
|
||||
return attribute.FindDescendantNodes<IntermediateToken>().Where(t => t.IsCSharp).ToArray();
|
||||
|
|
@ -623,7 +623,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
_scopeStack.CloseScope(context);
|
||||
}
|
||||
|
||||
public override void WriteComponentTypeArgument(CodeRenderingContext context, ComponentTypeArgumentExtensionNode node)
|
||||
public override void WriteComponentTypeArgument(CodeRenderingContext context, ComponentTypeArgumentIntermediateNode node)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
|
|
@ -651,7 +651,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
context.CodeWriter.Write(");");
|
||||
context.CodeWriter.WriteLine();
|
||||
|
||||
IReadOnlyList<IntermediateToken> GetCSharpTokens(ComponentTypeArgumentExtensionNode arg)
|
||||
IReadOnlyList<IntermediateToken> GetCSharpTokens(ComponentTypeArgumentIntermediateNode arg)
|
||||
{
|
||||
// We generally expect all children to be CSharp, this is here just in case.
|
||||
return arg.FindDescendantNodes<IntermediateToken>().Where(t => t.IsCSharp).ToArray();
|
||||
|
|
@ -678,7 +678,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
_scopeStack.CloseScope(context);
|
||||
}
|
||||
|
||||
public override void WriteReferenceCapture(CodeRenderingContext context, RefExtensionNode node)
|
||||
public override void WriteReferenceCapture(CodeRenderingContext context, ReferenceCaptureIntermediateNode node)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
|
|
@ -696,7 +696,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
WriteReferenceCaptureInnards(context, node, shouldTypeCheck: true);
|
||||
}
|
||||
|
||||
protected override void WriteReferenceCaptureInnards(CodeRenderingContext context, RefExtensionNode node, bool shouldTypeCheck)
|
||||
protected override void WriteReferenceCaptureInnards(CodeRenderingContext context, ReferenceCaptureIntermediateNode node, bool shouldTypeCheck)
|
||||
{
|
||||
// We specialize this code based on whether or not we can type check. When we're calling into
|
||||
// a type-inferenced component, we can't do the type check. See the comments in WriteTypeInferenceMethod.
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
builder.Features.Add(new ComplexAttributeContentPass());
|
||||
builder.Features.Add(new ComponentLoweringPass());
|
||||
builder.Features.Add(new EventHandlerLoweringPass());
|
||||
builder.Features.Add(new RefLoweringPass());
|
||||
builder.Features.Add(new ReferenceCaptureLoweringPass());
|
||||
builder.Features.Add(new BindLoweringPass());
|
||||
builder.Features.Add(new TemplateDiagnosticPass());
|
||||
builder.Features.Add(new GenericComponentPass());
|
||||
|
|
|
|||
|
|
@ -14,21 +14,21 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
{
|
||||
public abstract void BeginWriteAttribute(CodeWriter codeWriter, string key);
|
||||
|
||||
public abstract void WriteComponent(CodeRenderingContext context, ComponentExtensionNode node);
|
||||
public abstract void WriteComponent(CodeRenderingContext context, ComponentIntermediateNode node);
|
||||
|
||||
public abstract void WriteComponentAttribute(CodeRenderingContext context, ComponentAttributeExtensionNode node);
|
||||
public abstract void WriteComponentAttribute(CodeRenderingContext context, ComponentAttributeIntermediateNode node);
|
||||
|
||||
public abstract void WriteComponentChildContent(CodeRenderingContext context, ComponentChildContentIntermediateNode node);
|
||||
|
||||
public abstract void WriteComponentTypeArgument(CodeRenderingContext context, ComponentTypeArgumentExtensionNode node);
|
||||
public abstract void WriteComponentTypeArgument(CodeRenderingContext context, ComponentTypeArgumentIntermediateNode node);
|
||||
|
||||
public abstract void WriteHtmlElement(CodeRenderingContext context, HtmlElementIntermediateNode node);
|
||||
public abstract void WriteHtmlElement(CodeRenderingContext context, MarkupElementIntermediateNode node);
|
||||
|
||||
public abstract void WriteHtmlBlock(CodeRenderingContext context, HtmlBlockIntermediateNode node);
|
||||
public abstract void WriteHtmlBlock(CodeRenderingContext context, MarkupBlockIntermediateNode node);
|
||||
|
||||
public abstract void WriteReferenceCapture(CodeRenderingContext context, RefExtensionNode node);
|
||||
public abstract void WriteReferenceCapture(CodeRenderingContext context, ReferenceCaptureIntermediateNode node);
|
||||
|
||||
protected abstract void WriteReferenceCaptureInnards(CodeRenderingContext context, RefExtensionNode node, bool shouldTypeCheck);
|
||||
protected abstract void WriteReferenceCaptureInnards(CodeRenderingContext context, ReferenceCaptureIntermediateNode node, bool shouldTypeCheck);
|
||||
|
||||
public abstract void WriteTemplate(CodeRenderingContext context, TemplateIntermediateNode node);
|
||||
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
}
|
||||
|
||||
public override void WriteHtmlBlock(CodeRenderingContext context, HtmlBlockIntermediateNode node)
|
||||
public override void WriteHtmlBlock(CodeRenderingContext context, MarkupBlockIntermediateNode node)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
|
|
@ -165,7 +165,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
.WriteEndMethodInvocation();
|
||||
}
|
||||
|
||||
public override void WriteHtmlElement(CodeRenderingContext context, HtmlElementIntermediateNode node)
|
||||
public override void WriteHtmlElement(CodeRenderingContext context, MarkupElementIntermediateNode node)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
|
|
@ -278,7 +278,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
context.CodeWriter.WriteUsing(node.Content, endLine: true);
|
||||
}
|
||||
|
||||
public override void WriteComponent(CodeRenderingContext context, ComponentExtensionNode node)
|
||||
public override void WriteComponent(CodeRenderingContext context, ComponentIntermediateNode node)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
}
|
||||
|
||||
public override void WriteComponentAttribute(CodeRenderingContext context, ComponentAttributeExtensionNode node)
|
||||
public override void WriteComponentAttribute(CodeRenderingContext context, ComponentAttributeIntermediateNode node)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
|
|
@ -440,7 +440,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
context.CodeWriter.WriteLine();
|
||||
}
|
||||
|
||||
private void WriteComponentAttributeInnards(CodeRenderingContext context, ComponentAttributeExtensionNode node, bool canTypeCheck)
|
||||
private void WriteComponentAttributeInnards(CodeRenderingContext context, ComponentAttributeIntermediateNode node, bool canTypeCheck)
|
||||
{
|
||||
if (node.AttributeStructure == AttributeStructure.Minimized)
|
||||
{
|
||||
|
|
@ -505,7 +505,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
}
|
||||
|
||||
IReadOnlyList<IntermediateToken> GetCSharpTokens(ComponentAttributeExtensionNode attribute)
|
||||
IReadOnlyList<IntermediateToken> GetCSharpTokens(ComponentAttributeIntermediateNode attribute)
|
||||
{
|
||||
// We generally expect all children to be CSharp, this is here just in case.
|
||||
return attribute.FindDescendantNodes<IntermediateToken>().Where(t => t.IsCSharp).ToArray();
|
||||
|
|
@ -517,7 +517,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
return html.FindDescendantNodes<IntermediateToken>().Where(t => t.IsHtml).ToArray();
|
||||
}
|
||||
|
||||
bool NeedsTypeCheck(ComponentAttributeExtensionNode n)
|
||||
bool NeedsTypeCheck(ComponentAttributeIntermediateNode n)
|
||||
{
|
||||
return node.BoundAttribute != null && !node.BoundAttribute.IsWeaklyTyped();
|
||||
}
|
||||
|
|
@ -567,7 +567,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
_scopeStack.CloseScope(context);
|
||||
}
|
||||
|
||||
public override void WriteComponentTypeArgument(CodeRenderingContext context, ComponentTypeArgumentExtensionNode node)
|
||||
public override void WriteComponentTypeArgument(CodeRenderingContext context, ComponentTypeArgumentIntermediateNode node)
|
||||
{
|
||||
// We can skip type arguments during runtime codegen, they are handled in the
|
||||
// type/parameter declarations.
|
||||
|
|
@ -593,7 +593,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
_scopeStack.CloseScope(context);
|
||||
}
|
||||
|
||||
public override void WriteReferenceCapture(CodeRenderingContext context, RefExtensionNode node)
|
||||
public override void WriteReferenceCapture(CodeRenderingContext context, ReferenceCaptureIntermediateNode node)
|
||||
{
|
||||
// Looks like:
|
||||
//
|
||||
|
|
@ -615,7 +615,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
codeWriter.WriteEndMethodInvocation();
|
||||
}
|
||||
|
||||
protected override void WriteReferenceCaptureInnards(CodeRenderingContext context, RefExtensionNode node, bool shouldTypeCheck)
|
||||
protected override void WriteReferenceCaptureInnards(CodeRenderingContext context, ReferenceCaptureIntermediateNode node, bool shouldTypeCheck)
|
||||
{
|
||||
// Looks like:
|
||||
//
|
||||
|
|
|
|||
|
|
@ -19,9 +19,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
visitor.Visit(documentNode);
|
||||
}
|
||||
|
||||
private class Visitor : IntermediateNodeWalker, IExtensionIntermediateNodeVisitor<ComponentExtensionNode>, IExtensionIntermediateNodeVisitor<ComponentChildContentIntermediateNode>
|
||||
private class Visitor : IntermediateNodeWalker
|
||||
{
|
||||
public void VisitExtension(ComponentExtensionNode node)
|
||||
public override void VisitComponent(ComponentIntermediateNode node)
|
||||
{
|
||||
// Check for properties that are set by both element contents (body) and the attribute itself.
|
||||
foreach (var childContent in node.ChildContents)
|
||||
|
|
@ -40,7 +40,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
base.VisitDefault(node);
|
||||
}
|
||||
|
||||
public void VisitExtension(ComponentChildContentIntermediateNode node)
|
||||
public override void VisitComponentChildContent(ComponentChildContentIntermediateNode node)
|
||||
{
|
||||
// Check that each child content has a unique parameter name within its scope. This is important
|
||||
// because the parameter name can be implicit, and it doesn't work well when nested.
|
||||
|
|
@ -58,9 +58,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
node.Diagnostics.Add(ComponentDiagnosticFactory.Create_ChildContentRepeatedParameterName(
|
||||
node.Source,
|
||||
node,
|
||||
(ComponentExtensionNode)Ancestors[0], // Enclosing component
|
||||
(ComponentIntermediateNode)Ancestors[0], // Enclosing component
|
||||
ancestor, // conflicting child content node
|
||||
(ComponentExtensionNode)Ancestors[i + 1])); // Enclosing component of conflicting child content node
|
||||
(ComponentIntermediateNode)Ancestors[i + 1])); // Enclosing component of conflicting child content node
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -217,7 +217,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
"following top-level items: {1}.",
|
||||
RazorDiagnosticSeverity.Error);
|
||||
|
||||
public static RazorDiagnostic Create_ChildContentMixedWithExplicitChildContent(SourceSpan? source, ComponentExtensionNode component)
|
||||
public static RazorDiagnostic Create_ChildContentMixedWithExplicitChildContent(SourceSpan? source, ComponentIntermediateNode component)
|
||||
{
|
||||
var supportedElements = string.Join(", ", component.Component.GetChildContentProperties().Select(p => $"'{p.Name}'"));
|
||||
return RazorDiagnostic.Create(ChildContentMixedWithExplicitChildContent, source ?? SourceSpan.Undefined, component.TagName, supportedElements);
|
||||
|
|
@ -255,9 +255,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
public static RazorDiagnostic Create_ChildContentRepeatedParameterName(
|
||||
SourceSpan? source,
|
||||
ComponentChildContentIntermediateNode childContent1,
|
||||
ComponentExtensionNode component1,
|
||||
ComponentIntermediateNode component1,
|
||||
ComponentChildContentIntermediateNode childContent2,
|
||||
ComponentExtensionNode component2)
|
||||
ComponentIntermediateNode component2)
|
||||
{
|
||||
Debug.Assert(childContent1.ParameterName == childContent2.ParameterName);
|
||||
Debug.Assert(childContent1.IsParameterized);
|
||||
|
|
@ -281,7 +281,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
|
||||
public static RazorDiagnostic Create_GenericComponentMissingTypeArgument(
|
||||
SourceSpan? source,
|
||||
ComponentExtensionNode component,
|
||||
ComponentIntermediateNode component,
|
||||
IEnumerable<BoundAttributeDescriptor> attributes)
|
||||
{
|
||||
Debug.Assert(component.Component.IsGenericTypedComponent());
|
||||
|
|
@ -299,7 +299,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
|
||||
public static RazorDiagnostic Create_GenericComponentTypeInferenceUnderspecified(
|
||||
SourceSpan? source,
|
||||
ComponentExtensionNode component,
|
||||
ComponentIntermediateNode component,
|
||||
IEnumerable<BoundAttributeDescriptor> attributes)
|
||||
{
|
||||
Debug.Assert(component.Component.IsGenericTypedComponent());
|
||||
|
|
|
|||
|
|
@ -1,107 +0,0 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.AspNetCore.Razor.Language;
|
||||
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
|
||||
using Microsoft.AspNetCore.Razor.Language.Intermediate;
|
||||
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Components
|
||||
{
|
||||
internal class ComponentExtensionNode : ExtensionIntermediateNode
|
||||
{
|
||||
public IEnumerable<ComponentAttributeExtensionNode> Attributes => Children.OfType<ComponentAttributeExtensionNode>();
|
||||
|
||||
public IEnumerable<RefExtensionNode> Captures => Children.OfType<RefExtensionNode>();
|
||||
|
||||
public IEnumerable<ComponentChildContentIntermediateNode> ChildContents => Children.OfType<ComponentChildContentIntermediateNode>();
|
||||
|
||||
public override IntermediateNodeCollection Children { get; } = new IntermediateNodeCollection();
|
||||
|
||||
public TagHelperDescriptor Component { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the child content parameter name (null if unset) that was applied at the component level.
|
||||
/// </summary>
|
||||
public string ChildContentParameterName { get; set; }
|
||||
|
||||
public IEnumerable<ComponentTypeArgumentExtensionNode> TypeArguments => Children.OfType<ComponentTypeArgumentExtensionNode>();
|
||||
|
||||
public string TagName { get; set; }
|
||||
|
||||
// An optional type inference node. This will be populated (and point to a different part of the tree)
|
||||
// if this component call site requires type inference.
|
||||
public ComponentTypeInferenceMethodIntermediateNode TypeInferenceNode { get; set; }
|
||||
|
||||
public string TypeName { get; set; }
|
||||
|
||||
public override void Accept(IntermediateNodeVisitor visitor)
|
||||
{
|
||||
if (visitor == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(visitor));
|
||||
}
|
||||
|
||||
AcceptExtensionNode<ComponentExtensionNode>(this, visitor);
|
||||
}
|
||||
|
||||
public override void WriteNode(CodeTarget target, CodeRenderingContext context)
|
||||
{
|
||||
if (target == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(target));
|
||||
}
|
||||
|
||||
if (context == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(context));
|
||||
}
|
||||
|
||||
var writer = (BlazorNodeWriter)context.NodeWriter;
|
||||
writer.WriteComponent(context, this);
|
||||
}
|
||||
|
||||
private string DebuggerDisplay
|
||||
{
|
||||
get
|
||||
{
|
||||
var builder = new StringBuilder();
|
||||
builder.Append("Component: ");
|
||||
builder.Append("<");
|
||||
builder.Append(TagName);
|
||||
|
||||
foreach (var attribute in Attributes)
|
||||
{
|
||||
builder.Append(" ");
|
||||
builder.Append(attribute.AttributeName);
|
||||
builder.Append("=\"...\"");
|
||||
}
|
||||
|
||||
foreach (var capture in Captures)
|
||||
{
|
||||
builder.Append(" ");
|
||||
builder.Append("ref");
|
||||
builder.Append("=\"...\"");
|
||||
}
|
||||
|
||||
foreach (var typeArgument in TypeArguments)
|
||||
{
|
||||
builder.Append(" ");
|
||||
builder.Append(typeArgument.TypeParameterName);
|
||||
builder.Append("=\"...\"");
|
||||
}
|
||||
|
||||
builder.Append(">");
|
||||
builder.Append(ChildContents.Any() ? "..." : string.Empty);
|
||||
builder.Append("</");
|
||||
builder.Append(TagName);
|
||||
builder.Append(">");
|
||||
|
||||
return builder.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -60,9 +60,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
}
|
||||
|
||||
private ComponentExtensionNode RewriteAsComponent(TagHelperIntermediateNode node, TagHelperDescriptor tagHelper)
|
||||
private ComponentIntermediateNode RewriteAsComponent(TagHelperIntermediateNode node, TagHelperDescriptor tagHelper)
|
||||
{
|
||||
var component = new ComponentExtensionNode()
|
||||
var component = new ComponentIntermediateNode()
|
||||
{
|
||||
Component = tagHelper,
|
||||
Source = node.Source,
|
||||
|
|
@ -88,9 +88,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
return component;
|
||||
}
|
||||
|
||||
private HtmlElementIntermediateNode RewriteAsElement(TagHelperIntermediateNode node)
|
||||
private MarkupElementIntermediateNode RewriteAsElement(TagHelperIntermediateNode node)
|
||||
{
|
||||
var result = new HtmlElementIntermediateNode()
|
||||
var result = new MarkupElementIntermediateNode()
|
||||
{
|
||||
Source = node.Source,
|
||||
TagName = node.TagName,
|
||||
|
|
@ -109,10 +109,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
|
||||
private class ComponentRewriteVisitor : IntermediateNodeWalker
|
||||
{
|
||||
private readonly ComponentExtensionNode _component;
|
||||
private readonly ComponentIntermediateNode _component;
|
||||
private readonly IntermediateNodeCollection _children;
|
||||
|
||||
public ComponentRewriteVisitor(ComponentExtensionNode component)
|
||||
public ComponentRewriteVisitor(ComponentIntermediateNode component)
|
||||
{
|
||||
_component = component;
|
||||
_children = component.Children;
|
||||
|
|
@ -290,7 +290,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
|
||||
public override void VisitTagHelperHtmlAttribute(TagHelperHtmlAttributeIntermediateNode node)
|
||||
{
|
||||
var attribute = new ComponentAttributeExtensionNode(node);
|
||||
var attribute = new ComponentAttributeIntermediateNode(node);
|
||||
_children.Add(attribute);
|
||||
|
||||
// Since we don't support complex content, we can rewrite the inside of this
|
||||
|
|
@ -348,7 +348,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
// that get passed to the component, it needs special code generation support.
|
||||
if (node.TagHelper.IsGenericTypedComponent() && node.BoundAttribute.IsTypeParameterProperty())
|
||||
{
|
||||
_children.Add(new ComponentTypeArgumentExtensionNode(node));
|
||||
_children.Add(new ComponentTypeArgumentIntermediateNode(node));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -371,7 +371,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
return;
|
||||
}
|
||||
|
||||
_children.Add(new ComponentAttributeExtensionNode(node));
|
||||
_children.Add(new ComponentAttributeIntermediateNode(node));
|
||||
}
|
||||
|
||||
public override void VisitDefault(IntermediateNode node)
|
||||
|
|
@ -476,7 +476,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
// Each 'tag helper property' belongs to a specific tag helper. We want to handle
|
||||
// the cases for components, but leave others alone. This allows our other passes
|
||||
// to handle those cases.
|
||||
_children.Add(node.TagHelper.IsComponentTagHelper() ? (IntermediateNode)new ComponentAttributeExtensionNode(node) : node);
|
||||
_children.Add(node.TagHelper.IsComponentTagHelper() ? (IntermediateNode)new ComponentAttributeIntermediateNode(node) : node);
|
||||
}
|
||||
|
||||
public override void VisitDefault(IntermediateNode node)
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
{
|
||||
for (var j = 0; j < parent.Children.Count; j++)
|
||||
{
|
||||
var componentAttribute = parent.Children[j] as ComponentAttributeExtensionNode;
|
||||
var componentAttribute = parent.Children[j] as ComponentAttributeIntermediateNode;
|
||||
if (componentAttribute != null &&
|
||||
componentAttribute.TagHelper != null &&
|
||||
componentAttribute.TagHelper.IsComponentTagHelper() &&
|
||||
|
|
@ -142,7 +142,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
tokens.Insert(i + 1, original[i]);
|
||||
}
|
||||
|
||||
if (parent is HtmlElementIntermediateNode)
|
||||
if (parent is MarkupElementIntermediateNode)
|
||||
{
|
||||
var result = new HtmlAttributeIntermediateNode()
|
||||
{
|
||||
|
|
@ -168,7 +168,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
else
|
||||
{
|
||||
var result = new ComponentAttributeExtensionNode(node);
|
||||
var result = new ComponentAttributeIntermediateNode(node);
|
||||
|
||||
result.Children.Clear();
|
||||
result.Children.Add(new CSharpExpressionIntermediateNode());
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
visitor.Visit(documentNode);
|
||||
}
|
||||
|
||||
private class Visitor : IntermediateNodeWalker, IExtensionIntermediateNodeVisitor<ComponentExtensionNode>
|
||||
private class Visitor : IntermediateNodeWalker
|
||||
{
|
||||
private readonly TypeNameFeature _typeNameFeature;
|
||||
|
||||
|
|
@ -42,7 +42,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
_typeNameFeature = typeNameFeature;
|
||||
}
|
||||
|
||||
public void VisitExtension(ComponentExtensionNode node)
|
||||
public override void VisitComponent(ComponentIntermediateNode node)
|
||||
{
|
||||
if (node.Component.IsGenericTypedComponent())
|
||||
{
|
||||
|
|
@ -53,7 +53,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
base.VisitDefault(node);
|
||||
}
|
||||
|
||||
private void Process(ComponentExtensionNode node)
|
||||
private void Process(ComponentIntermediateNode node)
|
||||
{
|
||||
// First collect all of the information we have about each type parameter
|
||||
//
|
||||
|
|
@ -157,12 +157,12 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
CreateTypeInferenceMethod(documentNode, node);
|
||||
}
|
||||
|
||||
private string GetContent(ComponentTypeArgumentExtensionNode node)
|
||||
private string GetContent(ComponentTypeArgumentIntermediateNode node)
|
||||
{
|
||||
return string.Join(string.Empty, node.FindDescendantNodes<IntermediateToken>().Where(t => t.IsCSharp).Select(t => t.Content));
|
||||
}
|
||||
|
||||
private static bool ValidateTypeArguments(ComponentExtensionNode node, Dictionary<string, Binding> bindings)
|
||||
private static bool ValidateTypeArguments(ComponentIntermediateNode node, Dictionary<string, Binding> bindings)
|
||||
{
|
||||
var missing = new List<BoundAttributeDescriptor>();
|
||||
foreach (var binding in bindings)
|
||||
|
|
@ -185,7 +185,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
return true;
|
||||
}
|
||||
|
||||
private void RewriteTypeNames(TypeNameRewriter rewriter, ComponentExtensionNode node)
|
||||
private void RewriteTypeNames(TypeNameRewriter rewriter, ComponentIntermediateNode node)
|
||||
{
|
||||
// Rewrite the component type name
|
||||
node.TypeName = rewriter.Rewrite(node.TypeName);
|
||||
|
|
@ -243,7 +243,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
}
|
||||
|
||||
private void CreateTypeInferenceMethod(DocumentIntermediateNode documentNode, ComponentExtensionNode node)
|
||||
private void CreateTypeInferenceMethod(DocumentIntermediateNode documentNode, ComponentIntermediateNode node)
|
||||
{
|
||||
var @namespace = documentNode.FindPrimaryNamespace().Content;
|
||||
@namespace = string.IsNullOrEmpty(@namespace) ? "__Blazor" : "__Blazor." + @namespace;
|
||||
|
|
@ -308,7 +308,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
|
||||
public string Content { get; set; }
|
||||
|
||||
public ComponentTypeArgumentExtensionNode Node { get; set; }
|
||||
public ComponentTypeArgumentIntermediateNode Node { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
length--;
|
||||
}
|
||||
|
||||
reference.Parent.Children.Insert(start, new HtmlBlockIntermediateNode()
|
||||
reference.Parent.Children.Insert(start, new MarkupBlockIntermediateNode()
|
||||
{
|
||||
Content = rewriteVisitor.Builder.ToString(),
|
||||
});
|
||||
|
|
@ -116,7 +116,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
// the a from the list.
|
||||
private class FindHtmlTreeVisitor :
|
||||
IntermediateNodeWalker,
|
||||
IExtensionIntermediateNodeVisitor<HtmlElementIntermediateNode>
|
||||
IExtensionIntermediateNodeVisitor<MarkupElementIntermediateNode>
|
||||
{
|
||||
private bool _foundNonHtml;
|
||||
|
||||
|
|
@ -129,7 +129,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
base.VisitDefault(node);
|
||||
}
|
||||
|
||||
public void VisitExtension(HtmlElementIntermediateNode node)
|
||||
public void VisitExtension(MarkupElementIntermediateNode node)
|
||||
{
|
||||
// We need to restore the state after processing this node.
|
||||
// We might have found a leaf-block of HTML, but that shouldn't
|
||||
|
|
@ -228,7 +228,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
|
||||
private class RewriteVisitor :
|
||||
IntermediateNodeWalker,
|
||||
IExtensionIntermediateNodeVisitor<HtmlElementIntermediateNode>
|
||||
IExtensionIntermediateNodeVisitor<MarkupElementIntermediateNode>
|
||||
{
|
||||
private readonly StringBuilder _encodingBuilder;
|
||||
|
||||
|
|
@ -243,7 +243,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
|
||||
public StringBuilder Builder { get; } = new StringBuilder();
|
||||
|
||||
public void VisitExtension(HtmlElementIntermediateNode node)
|
||||
public void VisitExtension(MarkupElementIntermediateNode node)
|
||||
{
|
||||
for (var i = 0; i < _trees.Count; i++)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Razor.Language.Intermediate;
|
|||
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Components
|
||||
{
|
||||
internal class RefLoweringPass : IntermediateNodePassBase, IRazorOptimizationPass
|
||||
internal class ReferenceCaptureLoweringPass : IntermediateNodePassBase, IRazorOptimizationPass
|
||||
{
|
||||
// Run after component lowering pass
|
||||
public override int Order => 50;
|
||||
|
|
@ -46,14 +46,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
|
||||
// Determine whether this is an element capture or a component capture, and
|
||||
// if applicable the type name that will appear in the resulting capture code
|
||||
var componentTagHelper = (parent as ComponentExtensionNode)?.Component;
|
||||
var componentTagHelper = (parent as ComponentIntermediateNode)?.Component;
|
||||
if (componentTagHelper != null)
|
||||
{
|
||||
return new RefExtensionNode(identifierToken, componentTagHelper.GetTypeName());
|
||||
return new ReferenceCaptureIntermediateNode(identifierToken, componentTagHelper.GetTypeName());
|
||||
}
|
||||
else
|
||||
{
|
||||
return new RefExtensionNode(identifierToken);
|
||||
return new ReferenceCaptureIntermediateNode(identifierToken);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -22,9 +22,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
visitor.Visit(documentNode);
|
||||
}
|
||||
|
||||
private class Visitor : IntermediateNodeWalker, IExtensionIntermediateNodeVisitor<HtmlElementIntermediateNode>
|
||||
private class Visitor : IntermediateNodeWalker, IExtensionIntermediateNodeVisitor<MarkupElementIntermediateNode>
|
||||
{
|
||||
public void VisitExtension(HtmlElementIntermediateNode node)
|
||||
public void VisitExtension(MarkupElementIntermediateNode node)
|
||||
{
|
||||
// Disallow <script> in components as per #552
|
||||
if (string.Equals(node.TagName, "script", StringComparison.OrdinalIgnoreCase))
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
ancestor is HtmlAttributeIntermediateNode ||
|
||||
|
||||
// Inside component attribute
|
||||
ancestor is ComponentAttributeExtensionNode ||
|
||||
ancestor is ComponentAttributeIntermediateNode ||
|
||||
|
||||
// Inside malformed ref attribute
|
||||
ancestor is TagHelperPropertyIntermediateNode)
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
shouldContinueIteration = shouldRemoveNode;
|
||||
break;
|
||||
|
||||
case HtmlElementIntermediateNode _:
|
||||
case MarkupElementIntermediateNode _:
|
||||
case CSharpExpressionIntermediateNode _:
|
||||
case TagHelperIntermediateNode _:
|
||||
// These node types may produce non-whitespace output at runtime
|
||||
|
|
|
|||
|
|
@ -2,19 +2,18 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.AspNetCore.Razor.Language;
|
||||
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
|
||||
using Microsoft.AspNetCore.Razor.Language.Intermediate;
|
||||
using Microsoft.AspNetCore.Razor.Language.Components;
|
||||
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Components
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||
{
|
||||
internal class ComponentAttributeExtensionNode : ExtensionIntermediateNode
|
||||
public sealed class ComponentAttributeIntermediateNode : IntermediateNode
|
||||
{
|
||||
public ComponentAttributeExtensionNode()
|
||||
public ComponentAttributeIntermediateNode()
|
||||
{
|
||||
}
|
||||
|
||||
public ComponentAttributeExtensionNode(TagHelperHtmlAttributeIntermediateNode attributeNode)
|
||||
public ComponentAttributeIntermediateNode(TagHelperHtmlAttributeIntermediateNode attributeNode)
|
||||
{
|
||||
if (attributeNode == null)
|
||||
{
|
||||
|
|
@ -36,7 +35,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
}
|
||||
|
||||
public ComponentAttributeExtensionNode(TagHelperPropertyIntermediateNode propertyNode)
|
||||
public ComponentAttributeIntermediateNode(TagHelperPropertyIntermediateNode propertyNode)
|
||||
{
|
||||
if (propertyNode == null)
|
||||
{
|
||||
|
|
@ -62,36 +61,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
}
|
||||
}
|
||||
|
||||
public ComponentAttributeExtensionNode(ComponentAttributeExtensionNode attributeNode)
|
||||
{
|
||||
if (attributeNode == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(attributeNode));
|
||||
}
|
||||
|
||||
AttributeName = attributeNode.AttributeName;
|
||||
AttributeStructure = attributeNode.AttributeStructure;
|
||||
BoundAttribute = attributeNode.BoundAttribute;
|
||||
PropertyName = attributeNode.BoundAttribute.GetPropertyName();
|
||||
Source = attributeNode.Source;
|
||||
TagHelper = attributeNode.TagHelper;
|
||||
TypeName = attributeNode.BoundAttribute.IsWeaklyTyped() ? null : attributeNode.BoundAttribute.TypeName;
|
||||
|
||||
for (var i = 0; i < attributeNode.Children.Count; i++)
|
||||
{
|
||||
Children.Add(attributeNode.Children[i]);
|
||||
}
|
||||
|
||||
for (var i = 0; i < attributeNode.Diagnostics.Count; i++)
|
||||
{
|
||||
Diagnostics.Add(attributeNode.Diagnostics[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public override IntermediateNodeCollection Children { get; } = new IntermediateNodeCollection();
|
||||
|
||||
public string AttributeName { get; set; }
|
||||
|
||||
|
||||
public AttributeStructure AttributeStructure { get; set; }
|
||||
|
||||
public BoundAttributeDescriptor BoundAttribute { get; set; }
|
||||
|
|
@ -109,23 +82,24 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
throw new ArgumentNullException(nameof(visitor));
|
||||
}
|
||||
|
||||
AcceptExtensionNode<ComponentAttributeExtensionNode>(this, visitor);
|
||||
visitor.VisitComponentAttribute(this);
|
||||
}
|
||||
|
||||
public override void WriteNode(CodeTarget target, CodeRenderingContext context)
|
||||
public override void FormatNode(IntermediateNodeFormatter formatter)
|
||||
{
|
||||
if (target == null)
|
||||
if (formatter == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(target));
|
||||
throw new ArgumentNullException(nameof(formatter));
|
||||
}
|
||||
|
||||
formatter.WriteContent(AttributeName);
|
||||
|
||||
if (context == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(context));
|
||||
}
|
||||
|
||||
var writer = (BlazorNodeWriter)context.NodeWriter;
|
||||
writer.WriteComponentAttribute(context, this);
|
||||
formatter.WriteProperty(nameof(AttributeName), AttributeName);
|
||||
formatter.WriteProperty(nameof(AttributeStructure), AttributeStructure.ToString());
|
||||
formatter.WriteProperty(nameof(BoundAttribute), BoundAttribute?.DisplayName);
|
||||
formatter.WriteProperty(nameof(PropertyName), PropertyName);
|
||||
formatter.WriteProperty(nameof(TagHelper), TagHelper?.DisplayName);
|
||||
formatter.WriteProperty(nameof(TypeName), TypeName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3,11 +3,11 @@
|
|||
|
||||
using System;
|
||||
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
|
||||
using Microsoft.AspNetCore.Razor.Language.Intermediate;
|
||||
using Microsoft.AspNetCore.Razor.Language.Components;
|
||||
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Components
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||
{
|
||||
internal class ComponentChildContentIntermediateNode : ExtensionIntermediateNode
|
||||
public sealed class ComponentChildContentIntermediateNode : IntermediateNode
|
||||
{
|
||||
public string AttributeName => BoundAttribute?.Name ?? ComponentsApi.RenderTreeBuilder.ChildContent;
|
||||
|
||||
|
|
@ -28,23 +28,22 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
throw new ArgumentNullException(nameof(visitor));
|
||||
}
|
||||
|
||||
AcceptExtensionNode<ComponentChildContentIntermediateNode>(this, visitor);
|
||||
visitor.VisitComponentChildContent(this);
|
||||
}
|
||||
|
||||
public override void WriteNode(CodeTarget target, CodeRenderingContext context)
|
||||
public override void FormatNode(IntermediateNodeFormatter formatter)
|
||||
{
|
||||
if (target == null)
|
||||
if (formatter == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(target));
|
||||
throw new ArgumentNullException(nameof(formatter));
|
||||
}
|
||||
|
||||
if (context == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(context));
|
||||
}
|
||||
|
||||
var writer = (BlazorNodeWriter)context.NodeWriter;
|
||||
writer.WriteComponentChildContent(context, this);
|
||||
|
||||
formatter.WriteContent(AttributeName);
|
||||
|
||||
formatter.WriteProperty(nameof(AttributeName), AttributeName);
|
||||
formatter.WriteProperty(nameof(BoundAttribute), BoundAttribute?.DisplayName);
|
||||
formatter.WriteProperty(nameof(ParameterName), ParameterName);
|
||||
formatter.WriteProperty(nameof(TypeName), TypeName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
|
||||
using Microsoft.AspNetCore.Razor.Language.Components;
|
||||
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||
{
|
||||
public sealed class ComponentIntermediateNode : IntermediateNode
|
||||
{
|
||||
public IEnumerable<ComponentAttributeIntermediateNode> Attributes => Children.OfType<ComponentAttributeIntermediateNode>();
|
||||
|
||||
public IEnumerable<ReferenceCaptureIntermediateNode> Captures => Children.OfType<ReferenceCaptureIntermediateNode>();
|
||||
|
||||
public IEnumerable<ComponentChildContentIntermediateNode> ChildContents => Children.OfType<ComponentChildContentIntermediateNode>();
|
||||
|
||||
public override IntermediateNodeCollection Children { get; } = new IntermediateNodeCollection();
|
||||
|
||||
public TagHelperDescriptor Component { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the child content parameter name (null if unset) that was applied at the component level.
|
||||
/// </summary>
|
||||
public string ChildContentParameterName { get; set; }
|
||||
|
||||
public IEnumerable<ComponentTypeArgumentIntermediateNode> TypeArguments => Children.OfType<ComponentTypeArgumentIntermediateNode>();
|
||||
|
||||
public string TagName { get; set; }
|
||||
|
||||
// An optional type inference node. This will be populated (and point to a different part of the tree)
|
||||
// if this component call site requires type inference.
|
||||
public ComponentTypeInferenceMethodIntermediateNode TypeInferenceNode { get; set; }
|
||||
|
||||
public string TypeName { get; set; }
|
||||
|
||||
public override void Accept(IntermediateNodeVisitor visitor)
|
||||
{
|
||||
if (visitor == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(visitor));
|
||||
}
|
||||
|
||||
visitor.VisitComponent(this);
|
||||
}
|
||||
|
||||
public override void FormatNode(IntermediateNodeFormatter formatter)
|
||||
{
|
||||
formatter.WriteContent(TagName);
|
||||
|
||||
formatter.WriteProperty(nameof(Component), Component?.DisplayName);
|
||||
formatter.WriteProperty(nameof(TagName), TagName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,15 +2,14 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.AspNetCore.Razor.Language;
|
||||
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
|
||||
using Microsoft.AspNetCore.Razor.Language.Intermediate;
|
||||
using Microsoft.AspNetCore.Razor.Language.Components;
|
||||
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Components
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||
{
|
||||
internal class ComponentTypeArgumentExtensionNode : ExtensionIntermediateNode
|
||||
public sealed class ComponentTypeArgumentIntermediateNode : IntermediateNode
|
||||
{
|
||||
public ComponentTypeArgumentExtensionNode(TagHelperPropertyIntermediateNode propertyNode)
|
||||
public ComponentTypeArgumentIntermediateNode(TagHelperPropertyIntermediateNode propertyNode)
|
||||
{
|
||||
if (propertyNode == null)
|
||||
{
|
||||
|
|
@ -47,23 +46,20 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
throw new ArgumentNullException(nameof(visitor));
|
||||
}
|
||||
|
||||
AcceptExtensionNode<ComponentTypeArgumentExtensionNode>(this, visitor);
|
||||
visitor.VisitComponentTypeArgument(this);
|
||||
}
|
||||
|
||||
public override void WriteNode(CodeTarget target, CodeRenderingContext context)
|
||||
public override void FormatNode(IntermediateNodeFormatter formatter)
|
||||
{
|
||||
if (target == null)
|
||||
if (formatter == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(target));
|
||||
throw new ArgumentNullException(nameof(formatter));
|
||||
}
|
||||
|
||||
if (context == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(context));
|
||||
}
|
||||
|
||||
var writer = (BlazorNodeWriter)context.NodeWriter;
|
||||
writer.WriteComponentTypeArgument(context, this);
|
||||
|
||||
formatter.WriteContent(TypeParameterName);
|
||||
|
||||
formatter.WriteProperty(nameof(BoundAttribute), BoundAttribute?.DisplayName);
|
||||
formatter.WriteProperty(nameof(TagHelper), TagHelper?.DisplayName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,23 +2,22 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
|
||||
using Microsoft.AspNetCore.Razor.Language.Intermediate;
|
||||
using Microsoft.AspNetCore.Razor.Language.Components;
|
||||
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Components
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a type-inference thunk that is used by the generated component code.
|
||||
/// </summary>
|
||||
internal class ComponentTypeInferenceMethodIntermediateNode : ExtensionIntermediateNode
|
||||
public sealed class ComponentTypeInferenceMethodIntermediateNode : IntermediateNode
|
||||
{
|
||||
public override IntermediateNodeCollection Children => IntermediateNodeCollection.ReadOnly;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the component usage linked to this type inference method.
|
||||
/// </summary>
|
||||
public ComponentExtensionNode Component { get; set; }
|
||||
public ComponentIntermediateNode Component { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the full type name of the generated class containing this method.
|
||||
|
|
@ -37,23 +36,21 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
throw new ArgumentNullException(nameof(visitor));
|
||||
}
|
||||
|
||||
AcceptExtensionNode<ComponentTypeInferenceMethodIntermediateNode>(this, visitor);
|
||||
visitor.VisitComponentTypeInferenceMethod(this);
|
||||
}
|
||||
|
||||
public override void WriteNode(CodeTarget target, CodeRenderingContext context)
|
||||
public override void FormatNode(IntermediateNodeFormatter formatter)
|
||||
{
|
||||
if (target == null)
|
||||
if (formatter == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(target));
|
||||
throw new ArgumentNullException(nameof(formatter));
|
||||
}
|
||||
|
||||
if (context == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(context));
|
||||
}
|
||||
|
||||
var writer = (BlazorNodeWriter)context.NodeWriter;
|
||||
writer.WriteComponentTypeInferenceMethod(context, this);
|
||||
formatter.WriteContent(Component?.TagName);
|
||||
|
||||
formatter.WriteProperty(nameof(Component), Component?.Component?.DisplayName);
|
||||
formatter.WriteProperty(nameof(FullTypeName), FullTypeName);
|
||||
formatter.WriteProperty(nameof(MethodName), MethodName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -128,5 +128,35 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
|||
{
|
||||
VisitDefault(node);
|
||||
}
|
||||
|
||||
public virtual void VisitComponent(ComponentIntermediateNode node)
|
||||
{
|
||||
VisitDefault(node);
|
||||
}
|
||||
|
||||
public virtual void VisitComponentAttribute(ComponentAttributeIntermediateNode node)
|
||||
{
|
||||
VisitDefault(node);
|
||||
}
|
||||
|
||||
public virtual void VisitComponentChildContent(ComponentChildContentIntermediateNode node)
|
||||
{
|
||||
VisitDefault(node);
|
||||
}
|
||||
|
||||
public virtual void VisitComponentTypeArgument(ComponentTypeArgumentIntermediateNode node)
|
||||
{
|
||||
VisitDefault(node);
|
||||
}
|
||||
|
||||
public virtual void VisitComponentTypeInferenceMethod(ComponentTypeInferenceMethodIntermediateNode node)
|
||||
{
|
||||
VisitDefault(node);
|
||||
}
|
||||
|
||||
public virtual void VisitReferenceCapture(ReferenceCaptureIntermediateNode node)
|
||||
{
|
||||
VisitDefault(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,12 +4,12 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
|
||||
using Microsoft.AspNetCore.Razor.Language.Intermediate;
|
||||
using Microsoft.AspNetCore.Razor.Language.Components;
|
||||
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Components
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||
{
|
||||
[DebuggerDisplay("{DebuggerDisplay,nq}")]
|
||||
internal class HtmlBlockIntermediateNode : ExtensionIntermediateNode
|
||||
internal class MarkupBlockIntermediateNode : ExtensionIntermediateNode
|
||||
{
|
||||
public override IntermediateNodeCollection Children { get; } = new IntermediateNodeCollection();
|
||||
|
||||
|
|
@ -22,7 +22,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
throw new ArgumentNullException(nameof(visitor));
|
||||
}
|
||||
|
||||
AcceptExtensionNode<HtmlBlockIntermediateNode>(this, visitor);
|
||||
AcceptExtensionNode<MarkupBlockIntermediateNode>(this, visitor);
|
||||
}
|
||||
|
||||
public override void WriteNode(CodeTarget target, CodeRenderingContext context)
|
||||
|
|
@ -7,22 +7,22 @@ using System.Diagnostics;
|
|||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
|
||||
using Microsoft.AspNetCore.Razor.Language.Intermediate;
|
||||
using Microsoft.AspNetCore.Razor.Language.Components;
|
||||
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Components
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||
{
|
||||
[DebuggerDisplay("{DebuggerDisplay,nq}")]
|
||||
internal class HtmlElementIntermediateNode : ExtensionIntermediateNode
|
||||
internal class MarkupElementIntermediateNode : ExtensionIntermediateNode
|
||||
{
|
||||
public IEnumerable<HtmlAttributeIntermediateNode> Attributes => Children.OfType<HtmlAttributeIntermediateNode>();
|
||||
|
||||
public IEnumerable<RefExtensionNode> Captures => Children.OfType<RefExtensionNode>();
|
||||
public IEnumerable<ReferenceCaptureIntermediateNode> Captures => Children.OfType<ReferenceCaptureIntermediateNode>();
|
||||
|
||||
public IEnumerable<IntermediateNode> Body => Children.Where(c =>
|
||||
{
|
||||
return
|
||||
c as HtmlAttributeIntermediateNode == null &&
|
||||
c as RefExtensionNode == null;
|
||||
c as ReferenceCaptureIntermediateNode == null;
|
||||
});
|
||||
|
||||
public override IntermediateNodeCollection Children { get; } = new IntermediateNodeCollection();
|
||||
|
|
@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
throw new ArgumentNullException(nameof(visitor));
|
||||
}
|
||||
|
||||
AcceptExtensionNode<HtmlElementIntermediateNode>(this, visitor);
|
||||
AcceptExtensionNode<MarkupElementIntermediateNode>(this, visitor);
|
||||
}
|
||||
|
||||
public override void WriteNode(CodeTarget target, CodeRenderingContext context)
|
||||
|
|
@ -3,19 +3,19 @@
|
|||
|
||||
using System;
|
||||
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
|
||||
using Microsoft.AspNetCore.Razor.Language.Intermediate;
|
||||
using Microsoft.AspNetCore.Razor.Language.Components;
|
||||
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Components
|
||||
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||
{
|
||||
internal class RefExtensionNode : ExtensionIntermediateNode
|
||||
public sealed class ReferenceCaptureIntermediateNode : IntermediateNode
|
||||
{
|
||||
public RefExtensionNode(IntermediateToken identifierToken)
|
||||
public ReferenceCaptureIntermediateNode(IntermediateToken identifierToken)
|
||||
{
|
||||
IdentifierToken = identifierToken ?? throw new ArgumentNullException(nameof(identifierToken));
|
||||
Source = IdentifierToken.Source;
|
||||
}
|
||||
|
||||
public RefExtensionNode(IntermediateToken identifierToken, string componentCaptureTypeName)
|
||||
public ReferenceCaptureIntermediateNode(IntermediateToken identifierToken, string componentCaptureTypeName)
|
||||
: this(identifierToken)
|
||||
{
|
||||
if (string.IsNullOrEmpty(componentCaptureTypeName))
|
||||
|
|
@ -44,23 +44,20 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
|
|||
throw new ArgumentNullException(nameof(visitor));
|
||||
}
|
||||
|
||||
AcceptExtensionNode<RefExtensionNode>(this, visitor);
|
||||
visitor.VisitReferenceCapture(this);
|
||||
}
|
||||
|
||||
public override void WriteNode(CodeTarget target, CodeRenderingContext context)
|
||||
public override void FormatNode(IntermediateNodeFormatter formatter)
|
||||
{
|
||||
if (target == null)
|
||||
if (formatter == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(target));
|
||||
throw new ArgumentNullException(nameof(formatter));
|
||||
}
|
||||
|
||||
if (context == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(context));
|
||||
}
|
||||
|
||||
var writer = (BlazorNodeWriter)context.NodeWriter;
|
||||
writer.WriteReferenceCapture(context, this);
|
||||
|
||||
formatter.WriteContent(IdentifierToken?.Content);
|
||||
|
||||
formatter.WriteProperty(nameof(IdentifierToken), IdentifierToken?.Content);
|
||||
formatter.WriteProperty(nameof(ComponentCaptureTypeName), ComponentCaptureTypeName);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue