Exemplo n.º 1
0
 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();
 }
Exemplo n.º 2
0
        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();
            }
        }
Exemplo n.º 3
0
 // 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);
 }
Exemplo n.º 4
0
        // 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);
            }
        }