public override void VisitTemplateBlock(TemplateBlockChunkGenerator chunkGenerator, Block block)
            {
                var templateNode = new TemplateIntermediateNode();

                _builder.Push(templateNode);

                VisitDefault(block);

                _builder.Pop();

                if (templateNode.Children.Count > 0)
                {
                    var sourceRangeStart = templateNode
                                           .Children
                                           .FirstOrDefault(child => child.Source != null)
                                           ?.Source;

                    if (sourceRangeStart != null)
                    {
                        var contentLength = templateNode.Children.Sum(child => child.Source?.Length ?? 0);

                        templateNode.Source = new SourceSpan(
                            sourceRangeStart.Value.FilePath ?? FilePath,
                            sourceRangeStart.Value.AbsoluteIndex,
                            sourceRangeStart.Value.LineIndex,
                            sourceRangeStart.Value.CharacterIndex,
                            contentLength);
                    }
                }
            }
Exemple #2
0
            public override void VisitCSharpTemplateBlock(CSharpTemplateBlockSyntax node)
            {
                var templateNode = new TemplateIntermediateNode();

                _builder.Push(templateNode);

                base.VisitCSharpTemplateBlock(node);

                _builder.Pop();

                if (templateNode.Children.Count > 0)
                {
                    var sourceRangeStart = templateNode
                                           .Children
                                           .FirstOrDefault(child => child.Source != null)
                                           ?.Source;

                    if (sourceRangeStart != null)
                    {
                        var contentLength = templateNode.Children.Sum(child => child.Source?.Length ?? 0);

                        templateNode.Source = new SourceSpan(
                            sourceRangeStart.Value.FilePath ?? SourceDocument.FilePath,
                            sourceRangeStart.Value.AbsoluteIndex,
                            sourceRangeStart.Value.LineIndex,
                            sourceRangeStart.Value.CharacterIndex,
                            contentLength);
                    }
                }
            }
Exemple #3
0
    public void WriteTemplate(CodeRenderingContext context, TemplateIntermediateNode node)
    {
        const string ItemParameterName  = "item";
        const string TemplateWriterName = "__razor_template_writer";

        context.CodeWriter
        .Write(ItemParameterName).Write(" => ")
        .WriteStartNewObject(TemplateTypeName);

        using (context.CodeWriter.BuildAsyncLambda(TemplateWriterName))
        {
            context.NodeWriter.BeginWriterScope(context, TemplateWriterName);

            context.RenderChildren(node);

            context.NodeWriter.EndWriterScope(context);
        }

        context.CodeWriter.WriteEndMethodInvocation(endLine: false);
    }
Exemple #4
0
    public void WriteTemplate_WritesTemplateCode()
    {
        // Arrange
        var node = new TemplateIntermediateNode()
        {
            Children =
            {
                new CSharpExpressionIntermediateNode()
            }
        };
        var extension = new TemplateTargetExtension()
        {
            TemplateTypeName = "global::TestTemplate"
        };

        var nodeWriter = new RuntimeNodeWriter()
        {
            PushWriterMethod = "TestPushWriter",
            PopWriterMethod  = "TestPopWriter"
        };

        var context = TestCodeRenderingContext.CreateRuntime(nodeWriter: nodeWriter);

        // Act
        extension.WriteTemplate(context, node);

        // Assert
        var expected = @"item => new global::TestTemplate(async(__razor_template_writer) => {
    TestPushWriter(__razor_template_writer);
    Render Children
    TestPopWriter();
}
)";

        var output = context.CodeWriter.GenerateCode();

        Assert.Equal(expected, output);
    }
 public abstract void WriteTemplate(CodeRenderingContext context, TemplateIntermediateNode node);
 public void WriteTemplate(CodeRenderingContext context, TemplateIntermediateNode node)
 {
     // This is OK because this will only be plugged in by the component code target
     // not globally.
     ((ComponentNodeWriter)context.NodeWriter).WriteTemplate(context, node);
 }
 public void WriteTemplate(CodeRenderingContext context, TemplateIntermediateNode node)
 {
     ((BlazorNodeWriter)context.NodeWriter).WriteTemplate(context, node);
 }