public override SyntaxNode VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node) { // Move the prefix to be part of the actual value. var builder = SyntaxListBuilder <RazorSyntaxNode> .Create(); if (node.Prefix != null) { builder.Add(node.Prefix); } if (node.Value?.Children != null) { builder.AddRange(node.Value.Children); } var rewrittenValue = SyntaxFactory.MarkupBlock(builder.ToList()); return(base.VisitMarkupBlock(rewrittenValue)); }
// Example // <input checked="hello-world `@false`"/> // Prefix= (space) // Children will contain a token for @false. public override void VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node) { var containsExpression = false; var descendantNodes = node.DescendantNodes(n => { // Don't go into sub block. They may contain expressions but we only care about the top level. return(!(n.Parent is CSharpCodeBlockSyntax)); }); foreach (var child in descendantNodes) { if (child is CSharpImplicitExpressionSyntax || child is CSharpExplicitExpressionSyntax) { containsExpression = true; } } if (containsExpression) { _builder.Push(new CSharpExpressionAttributeValueIntermediateNode() { Prefix = node.Prefix?.GetContent() ?? string.Empty, Source = BuildSourceSpanFromNode(node), }); } else { _builder.Push(new CSharpCodeAttributeValueIntermediateNode() { Prefix = node.Prefix?.GetContent() ?? string.Empty, Source = BuildSourceSpanFromNode(node), }); } Visit(node.Value); _builder.Pop(); }
public override void VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node) { WriteBlock(node, FormattingBlockKind.Markup, base.VisitMarkupDynamicAttributeValue); }
public override void VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node) { WriteBlock(node, BlockKindInternal.Markup, base.VisitMarkupDynamicAttributeValue); }