public override BlockState TryOpen(BlockProcessor processor) { var result = TryContinue(processor, null); if (result == BlockState.Continue) { // Save the column where we need to go back var column = processor.Column; var sourceStartPosition = processor.Start; // Unwind all indents all spaces before in order to calculate correct span processor.UnwindAllIndents(); var codeBlock = new CodeBlock(this) { Column = processor.Column, Span = new SourceSpan(processor.Start, processor.Line.End), LinesBefore = processor.UseLinesBefore(), NewLine = processor.Line.NewLine, }; var codeBlockLine = new CodeBlockLine { TriviaBefore = processor.UseTrivia(sourceStartPosition - 1) }; codeBlock.CodeBlockLines.Add(codeBlockLine); processor.NewBlocks.Push(codeBlock); // Go back to the correct column processor.GoToColumn(column); } return(result); }
public override BlockState TryContinue(BlockProcessor processor, Block?block) { if (!processor.IsCodeIndent || processor.IsBlankLine) { if (block is null || !processor.IsBlankLine) { if (block != null) { var codeBlock = (CodeBlock)block; // add trailing blank lines to blank lines stack of processor for (int i = codeBlock.Lines.Count - 1; i >= 0; i--) { var line = codeBlock.Lines.Lines[i]; if (line.Slice.IsEmpty) { codeBlock.Lines.RemoveAt(i); if (processor.TrackTrivia) { processor.LinesBefore ??= new List <StringSlice>(); processor.LinesBefore.Add(line.Slice); } } else { break; } } } return(BlockState.None); } } // If we don't have a blank line, we reset to the indent if (processor.Indent > 4) { processor.GoToCodeIndent(); } if (block != null) { block.UpdateSpanEnd(processor.Line.End); // lines var cb = (CodeBlock)block; var codeBlockLine = new CodeBlockLine(); cb.CodeBlockLines.Add(codeBlockLine); if (processor.TrackTrivia) { codeBlockLine.TriviaBefore = processor.UseTrivia(processor.Start - 1); cb.NewLine = processor.Line.NewLine; // ensure block newline is last newline } } return(BlockState.Continue); }