private void RewriteUsage(Context context, TagHelperIntermediateNode node, TagHelperDescriptor tagHelper) { if (!tagHelper.IsViewComponentKind()) { return; } context.Add(tagHelper); // Now we need to insert a create node using the default tag helper runtime. This is similar to // code in DefaultTagHelperOptimizationPass. // // Find the body node. var i = 0; while (i < node.Children.Count && node.Children[i] is TagHelperBodyIntermediateNode) { i++; } while (i < node.Children.Count && node.Children[i] is DefaultTagHelperBodyIntermediateNode) { i++; } // Now find the last create node. while (i < node.Children.Count && node.Children[i] is DefaultTagHelperCreateIntermediateNode) { i++; } // Now i has the right insertion point. node.Children.Insert(i, new DefaultTagHelperCreateIntermediateNode() { FieldName = context.GetFieldName(tagHelper), TagHelper = tagHelper, TypeName = context.GetFullyQualifiedName(tagHelper), }); // Now we need to rewrite any set property nodes to use the default runtime. for (i = 0; i < node.Children.Count; i++) { if (node.Children[i] is TagHelperPropertyIntermediateNode propertyNode && propertyNode.TagHelper == tagHelper) { // This is a set property for this VCTH - we need to replace it with a node // that will use our field and property name. node.Children[i] = new DefaultTagHelperPropertyIntermediateNode(propertyNode) { FieldName = context.GetFieldName(tagHelper), PropertyName = propertyNode.BoundAttribute.GetPropertyName(), }; } } }