protected override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode) { if (!IsComponentDocument(documentNode)) { return; } var @namespace = documentNode.FindPrimaryNamespace(); var @class = documentNode.FindPrimaryClass(); if (@namespace == null || @class == null) { // Nothing to do, bail. We can't function without the standard structure. return; } // For each component *usage* we need to rewrite the tag helper node to map to the relevant component // APIs. var references = documentNode.FindDescendantReferences <TagHelperIntermediateNode>(); for (var i = 0; i < references.Count; i++) { var reference = references[i]; var node = (TagHelperIntermediateNode)reference.Node; if (node.TagHelpers.Any(t => t.IsChildContentTagHelper())) { // This is a child content tag helper. This will be rewritten when we visit its parent. continue; } // The element didn't match any child content descriptors. Look for any matching component descriptors. var count = 0; for (var j = 0; j < node.TagHelpers.Count; j++) { if (node.TagHelpers[j].IsComponentTagHelper()) { // Only allow a single component tag helper per element. If there are multiple, we'll just consider // the first one and ignore the others. if (++count > 1) { node.Diagnostics.Add(ComponentDiagnosticFactory.Create_MultipleComponents(node.Source, node.TagName, node.TagHelpers)); break; } } } if (count >= 1) { reference.Replace(RewriteAsComponent(node, node.TagHelpers.First(t => t.IsComponentTagHelper()))); } else { reference.Replace(RewriteAsElement(node)); } } }