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); } } }
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); } } }
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); }
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); }