Example #1
0
            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));
            }
Example #2
0
            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)));
            }
Example #3
0
 public override void VisitCSharpTransition(CSharpTransitionSyntax node)
 {
     WriteNode(node, isHtml: false, base.VisitCSharpTransition);
 }
Example #4
0
 public override void VisitCSharpTransition(CSharpTransitionSyntax node)
 {
     WriteSpan(node, FormattingSpanKind.Transition);
     base.VisitCSharpTransition(node);
 }
Example #5
0
 public override void VisitCSharpTransition(CSharpTransitionSyntax node)
 {
     WriteSpan(node, SpanKindInternal.Transition);
     base.VisitCSharpTransition(node);
 }
 public override void VisitCSharpTransition(CSharpTransitionSyntax node)
 {
     AddSemanticRange(node, RazorSemanticTokensLegend.RazorTransition);
 }