private TagHelperDescriptor CreateChildContentDescriptor(ComponentSymbols symbols, TagHelperDescriptor component, BoundAttributeDescriptor attribute) { var typeName = component.GetTypeName() + "." + attribute.Name; var assemblyName = component.AssemblyName; var builder = TagHelperDescriptorBuilder.Create(ComponentMetadata.ChildContent.TagHelperKind, typeName, assemblyName); builder.SetTypeName(typeName); builder.CaseSensitive = true; // This opts out this 'component' tag helper for any processing that's specific to the default // Razor ITagHelper runtime. builder.Metadata[TagHelperMetadata.Runtime.Name] = ComponentMetadata.ChildContent.RuntimeName; // Opt out of processing as a component. We'll process this specially as part of the component's body. builder.Metadata[ComponentMetadata.SpecialKindKey] = ComponentMetadata.ChildContent.TagHelperKind; var xml = attribute.Documentation; if (!string.IsNullOrEmpty(xml)) { builder.Documentation = xml; } // Child content matches the property name, but only as a direct child of the component. builder.TagMatchingRule(r => { r.TagName = attribute.Name; r.ParentTag = component.TagMatchingRules.First().TagName; }); if (attribute.IsParameterizedChildContentProperty()) { // For child content attributes with a parameter, synthesize an attribute that allows you to name // the parameter. CreateContextParameter(builder, attribute.Name); } if (component.IsComponentFullyQualifiedNameMatch()) { builder.Metadata[ComponentMetadata.Component.NameMatchKey] = ComponentMetadata.Component.FullyQualifiedNameMatch; } var descriptor = builder.Build(); return(descriptor); }