private ComponentChildContentIntermediateNode RewriteChildContent(BoundAttributeDescriptor attribute, SourceSpan?source, IntermediateNodeCollection children) { var childContent = new ComponentChildContentIntermediateNode() { BoundAttribute = attribute, Source = source, TypeName = attribute?.TypeName ?? ComponentsApi.RenderFragment.FullTypeName, }; // There are two cases here: // 1. Implicit child content - the children will be non-taghelper nodes, just accept them // 2. Explicit child content - the children will be various tag helper nodes, that need special processing. for (var i = 0; i < children.Count; i++) { var child = children[i]; if (child is TagHelperBodyIntermediateNode body) { // The body is all of the content we want to render, the rest of the children will // be the attributes. for (var j = 0; j < body.Children.Count; j++) { childContent.Children.Add(body.Children[j]); } } else if (child is TagHelperPropertyIntermediateNode property) { if (property.BoundAttribute.IsChildContentParameterNameProperty()) { // Check for each child content with a parameter name, that the parameter name is specified // with literal text. For instance, the following is not allowed and should generate a diagnostic. // // <MyComponent><ChildContent Context="@Foo()">...</ChildContent></MyComponent> if (TryGetAttributeStringContent(property, out var parameterName)) { childContent.ParameterName = parameterName; continue; } // The parameter name is invalid. childContent.Diagnostics.Add(ComponentDiagnosticFactory.Create_ChildContentHasInvalidParameter(property.Source, property.AttributeName, attribute.Name)); continue; } // This is an unrecognized attribute, this is possible if you try to do something like put 'ref' on a child content. childContent.Diagnostics.Add(ComponentDiagnosticFactory.Create_ChildContentHasInvalidAttribute(property.Source, property.AttributeName, attribute.Name)); } else if (child is TagHelperHtmlAttributeIntermediateNode a) { // This is an HTML attribute on a child content. childContent.Diagnostics.Add(ComponentDiagnosticFactory.Create_ChildContentHasInvalidAttribute(a.Source, a.AttributeName, attribute.Name)); } else { // This is some other kind of node (likely an implicit child content) childContent.Children.Add(child); } } return(childContent); }