public override SyntaxNode VisitCSharpTransition(CSharpTransitionSyntax node) { if (!_tryParseResult.IsBoundNonStringAttribute) { return(base.VisitCSharpTransition(node)); } // For bound non-string attributes, we'll only allow a transition span to appear at the very // beginning of the attribute expression. All later transitions would appear as code so that // they are part of the generated output. E.g. // key="@value" -> MyTagHelper.key = value // key=" @value" -> MyTagHelper.key = @value // key="1 + @case" -> MyTagHelper.key = 1 + @case // key="@int + @case" -> MyTagHelper.key = int + @case // key="@(a + b) -> MyTagHelper.key = a + b // key="4 + @(a + b)" -> MyTagHelper.key = 4 + @(a + b) if (_rewriteAsMarkup) { // Change to a MarkupChunkGenerator so that the '@' \ parenthesis is generated as part of the output. var context = node.GetSpanContext(); var newContext = new SpanContext(new MarkupChunkGenerator(), context.EditHandler); var expression = SyntaxFactory.CSharpExpressionLiteral(new SyntaxList <SyntaxToken>(node.Transition)).WithSpanContext(newContext); return(base.VisitCSharpExpressionLiteral(expression)); } _rewriteAsMarkup = true; return(base.VisitCSharpTransition(node)); }
public override SyntaxNode VisitCSharpExplicitExpression(CSharpExplicitExpressionSyntax node) { CSharpTransitionSyntax transition = null; var builder = SyntaxListBuilder <RazorSyntaxNode> .Create(); if (_rewriteAsMarkup) { // Convert transition. // Change to a MarkupChunkGenerator so that the '@' \ parenthesis is generated as part of the output. var context = node.GetSpanContext(); var newContext = new SpanContext(new MarkupChunkGenerator(), context?.EditHandler ?? SpanEditHandler.CreateDefault((content) => Enumerable.Empty <Syntax.InternalSyntax.SyntaxToken>())); var expression = SyntaxFactory.CSharpExpressionLiteral(new SyntaxList <SyntaxToken>(node.Transition.Transition)).WithSpanContext(newContext); expression = (CSharpExpressionLiteralSyntax)VisitCSharpExpressionLiteral(expression); builder.Add(expression); // Since the original transition is part of the body, we need something to take it's place. transition = SyntaxFactory.CSharpTransition(SyntaxFactory.MissingToken(SyntaxKind.Transition)); var body = (CSharpExplicitExpressionBodySyntax)node.Body; var rewrittenOpenParen = (RazorSyntaxNode)VisitRazorMetaCode(body.OpenParen); var rewrittenBody = (CSharpCodeBlockSyntax)VisitCSharpCodeBlock(body.CSharpCode); var rewrittenCloseParen = (RazorSyntaxNode)VisitRazorMetaCode(body.CloseParen); builder.Add(rewrittenOpenParen); builder.AddRange(rewrittenBody.Children); builder.Add(rewrittenCloseParen); } else { // This is the first expression of a non-string attribute like attr=@(a + b) // Below code converts this to an implicit expression to make the parens // part of the expression so that it is rendered. transition = (CSharpTransitionSyntax)Visit(node.Transition); var body = (CSharpExplicitExpressionBodySyntax)node.Body; var rewrittenOpenParen = (RazorSyntaxNode)VisitRazorMetaCode(body.OpenParen); var rewrittenBody = (CSharpCodeBlockSyntax)VisitCSharpCodeBlock(body.CSharpCode); var rewrittenCloseParen = (RazorSyntaxNode)VisitRazorMetaCode(body.CloseParen); builder.Add(rewrittenOpenParen); builder.AddRange(rewrittenBody.Children); builder.Add(rewrittenCloseParen); } var rewrittenCodeBlock = SyntaxFactory.CSharpCodeBlock(builder.ToList()); return(SyntaxFactory.CSharpImplicitExpression(transition, SyntaxFactory.CSharpImplicitExpressionBody(rewrittenCodeBlock))); }
public override void VisitCSharpTransition(CSharpTransitionSyntax node) { WriteNode(node, isHtml: false, base.VisitCSharpTransition); }
public override void VisitCSharpTransition(CSharpTransitionSyntax node) { WriteSpan(node, FormattingSpanKind.Transition); base.VisitCSharpTransition(node); }
public override void VisitCSharpTransition(CSharpTransitionSyntax node) { WriteSpan(node, SpanKindInternal.Transition); base.VisitCSharpTransition(node); }
public override void VisitCSharpTransition(CSharpTransitionSyntax node) { AddSemanticRange(node, RazorSemanticTokensLegend.RazorTransition); }