private void WriteBlock(BlockContext block) { // Mark the end of generated code if it hasn't been already block.MarkEndGeneratedCode(); // Don't render block if: // * It contains Markup AND it is design-time // * It is a Directive block if ((!DesignTimeMode || (block.BlockType != BlockType.Markup)) && block.BlockType != BlockType.Directive) { if (block.BlockType == BlockType.Functions) { GeneratedClass.Members.Add(CreateTypeMember(block)); } else if (!InHelper) { GeneratedExecuteMethod.Statements.Add(CreateStatement(block)); } else { WriteBlockToHelperContent(block); } } block.ResetBuffer(); }
protected virtual void WriteHelperTrailer(BlockContext block, HelperFooterSpan endSequenceSpan) { CurrentHelper.TrailerWritten = true; // Write the helper trailer if (CurrentHelper.WroteHelperPrefix) { block.SourceCodeStart = null; block.Writer.WriteEndLambdaDelegate(); block.Writer.WriteEndConstructor(); block.Writer.WriteEndStatement(); WriteBlockToHelperContent(block); block.ResetBuffer(); } if (endSequenceSpan != null) { block.VisitSpan(endSequenceSpan); } // If block contains end sequence, write it, otherwise get the code writer to do it if (endSequenceSpan != null) { block.WriteLinePragma = DesignTimeMode; block.MarkStartGeneratedCode(); block.Writer.WriteSnippet(endSequenceSpan.Content); block.MarkEndGeneratedCode(); block.Writer.InnerWriter.WriteLine(); } else { block.Writer.WriteHelperTrailer(); } }
// Called before the start of a sub-block of the specified block protected virtual void SuspendBlock(BlockContext currentBlock, BlockContext nextBlock) { currentBlock.MarkEndGeneratedCode(); if (nextBlock.BlockType == BlockType.Template) { if (!Host.GeneratedClassContext.AllowTemplates) { throw new InvalidOperationException(RazorResources.CodeGenerator_TemplatesNotSupported); } currentBlock.Writer.WriteStartLambdaExpression("item"); currentBlock.Writer.WriteStartConstructor(Host.GeneratedClassContext.TemplateTypeName); currentBlock.Writer.WriteStartLambdaDelegate(TemplateWriterName); } WriteBlock(currentBlock); }
// Called at the end of the specified block protected virtual void EndBlock(BlockContext block) { block.MarkEndGeneratedCode(); switch (block.BlockType) { case BlockType.Section: if (InSection) { CurrentBlock.Writer.WriteEndLambdaDelegate(); CurrentBlock.Writer.WriteEndMethodInvoke(); CurrentBlock.Writer.WriteEndStatement(); } InSection = false; break; case BlockType.Template: InTemplate = false; break; case BlockType.Expression: if (!DesignTimeMode) { block.Writer.WriteEndMethodInvoke(); } block.Writer.WriteEndStatement(); break; case BlockType.Helper: if (!CurrentHelper.TrailerWritten) { WriteHelperTrailer(block); } WriteBlockToHelperContent(block); block.ResetBuffer(); // Dump the helper WriteHelper(); break; } if (block.BlockType != BlockType.Template) { WriteBlock(CurrentBlock); } }