From ab358b57888fe7bc79b74a15e7f7abfa52eae5f6 Mon Sep 17 00:00:00 2001 From: MihaZupan Date: Thu, 17 Dec 2020 10:14:17 +0100 Subject: [PATCH] Minor codegen improvements --- .../Abbreviations/AbbreviationParser.cs | 2 +- .../GenericAttributes/GenericAttributesParser.cs | 4 ++-- .../SmartyPants/SmartyPantsInlineParser.cs | 2 +- src/Markdig/Extensions/Tables/GridTableParser.cs | 13 +++++++------ src/Markdig/Extensions/Tables/PipeTableParser.cs | 2 +- src/Markdig/Extensions/Tables/TableHelper.cs | 4 ++-- .../Extensions/TaskLists/TaskListInlineParser.cs | 2 +- src/Markdig/Helpers/HtmlHelper.cs | 16 ++++++++-------- src/Markdig/Helpers/ICharIterator.cs | 13 ++++++++++++- src/Markdig/Helpers/LinkHelper.cs | 16 ++++++++-------- src/Markdig/Helpers/StringLineGroup.cs | 8 ++++++-- src/Markdig/Helpers/StringSlice.cs | 11 +++++++++++ src/Markdig/Parsers/BlockProcessor.cs | 2 +- src/Markdig/Parsers/HtmlBlockParser.cs | 2 +- .../Parsers/Inlines/EmphasisInlineParser.cs | 2 +- .../Parsers/Inlines/EscapeInlineParser.cs | 4 ++-- .../Parsers/Inlines/LineBreakInlineParser.cs | 2 +- src/Markdig/Parsers/Inlines/LinkInlineParser.cs | 8 ++++---- .../Normalize/Inlines/LiteralInlineRenderer.cs | 2 +- 19 files changed, 71 insertions(+), 44 deletions(-) diff --git a/src/Markdig/Extensions/Abbreviations/AbbreviationParser.cs b/src/Markdig/Extensions/Abbreviations/AbbreviationParser.cs index 5313e32f..d1a18069 100644 --- a/src/Markdig/Extensions/Abbreviations/AbbreviationParser.cs +++ b/src/Markdig/Extensions/Abbreviations/AbbreviationParser.cs @@ -51,7 +51,7 @@ namespace Markdig.Extensions.Abbreviations { return BlockState.None; } - slice.NextChar(); + slice.SkipChar(); slice.Trim(); diff --git a/src/Markdig/Extensions/GenericAttributes/GenericAttributesParser.cs b/src/Markdig/Extensions/GenericAttributes/GenericAttributesParser.cs index 21255a86..06a04236 100644 --- a/src/Markdig/Extensions/GenericAttributes/GenericAttributesParser.cs +++ b/src/Markdig/Extensions/GenericAttributes/GenericAttributesParser.cs @@ -107,7 +107,7 @@ namespace Markdig.Extensions.GenericAttributes if (c == '}') { isValid = true; - line.NextChar(); // skip } + line.SkipChar(); // skip } break; } @@ -191,7 +191,7 @@ namespace Markdig.Extensions.GenericAttributes } // Go to next char, skip any spaces - line.NextChar(); + line.SkipChar(); line.TrimStart(); int startValue = -1; diff --git a/src/Markdig/Extensions/SmartyPants/SmartyPantsInlineParser.cs b/src/Markdig/Extensions/SmartyPants/SmartyPantsInlineParser.cs index 033939c6..3b8dc1cf 100644 --- a/src/Markdig/Extensions/SmartyPants/SmartyPantsInlineParser.cs +++ b/src/Markdig/Extensions/SmartyPants/SmartyPantsInlineParser.cs @@ -52,7 +52,7 @@ namespace Markdig.Extensions.SmartyPants type = SmartyPantType.Quote; // We will resolve them at the end of parsing all inlines if (slice.PeekChar() == '\'') { - slice.NextChar(); + slice.SkipChar(); type = SmartyPantType.DoubleQuote; // We will resolve them at the end of parsing all inlines } break; diff --git a/src/Markdig/Extensions/Tables/GridTableParser.cs b/src/Markdig/Extensions/Tables/GridTableParser.cs index 69ee0e16..85f5b504 100644 --- a/src/Markdig/Extensions/Tables/GridTableParser.cs +++ b/src/Markdig/Extensions/Tables/GridTableParser.cs @@ -33,7 +33,7 @@ namespace Markdig.Extensions.Tables while (c == '+') { var columnStart = line.Start; - line.NextChar(); + line.SkipChar(); line.TrimStart(); // if we have reached the end of the line, exit @@ -161,15 +161,16 @@ namespace Markdig.Extensions.Tables private static bool IsRowSeperator(StringSlice slice) { - while (slice.Length > 0) + char c = slice.CurrentChar; + do { - if (slice.CurrentChar != '-' && slice.CurrentChar != '=' && slice.CurrentChar != ':') + if (c != '-' && c != '=' && c != ':') { - return false; + return c == '\0'; } - slice.NextChar(); + c = slice.NextChar(); } - return true; + while (true); } private static void TerminateCurrentRow(BlockProcessor processor, GridTableState tableState, Table gridTable, bool isLastRow) diff --git a/src/Markdig/Extensions/Tables/PipeTableParser.cs b/src/Markdig/Extensions/Tables/PipeTableParser.cs index 4caebc1d..ebd27464 100644 --- a/src/Markdig/Extensions/Tables/PipeTableParser.cs +++ b/src/Markdig/Extensions/Tables/PipeTableParser.cs @@ -112,7 +112,7 @@ namespace Markdig.Extensions.Tables } tableState.LineHasPipe = true; tableState.LineIndex = localLineIndex; - slice.NextChar(); // Skip the `|` character + slice.SkipChar(); // Skip the `|` character tableState.ColumnAndLineDelimiters.Add(processor.Inline); } diff --git a/src/Markdig/Extensions/Tables/TableHelper.cs b/src/Markdig/Extensions/Tables/TableHelper.cs index aff49cce..3526e1e2 100644 --- a/src/Markdig/Extensions/Tables/TableHelper.cs +++ b/src/Markdig/Extensions/Tables/TableHelper.cs @@ -60,7 +60,7 @@ namespace Markdig.Extensions.Tables if (c == ':') { hasLeft = true; - slice.NextChar(); + slice.SkipChar(); } slice.TrimStart(); @@ -91,7 +91,7 @@ namespace Markdig.Extensions.Tables if (c == ':') { hasRight = true; - slice.NextChar(); + slice.SkipChar(); } slice.TrimStart(); diff --git a/src/Markdig/Extensions/TaskLists/TaskListInlineParser.cs b/src/Markdig/Extensions/TaskLists/TaskListInlineParser.cs index e4d3441f..87c8dc83 100644 --- a/src/Markdig/Extensions/TaskLists/TaskListInlineParser.cs +++ b/src/Markdig/Extensions/TaskLists/TaskListInlineParser.cs @@ -56,7 +56,7 @@ namespace Markdig.Extensions.TaskLists return false; } // Skip last ] - slice.NextChar(); + slice.SkipChar(); // Create the TaskList var taskItem = new TaskList() diff --git a/src/Markdig/Helpers/HtmlHelper.cs b/src/Markdig/Helpers/HtmlHelper.cs index 4d385ad3..0f72f26a 100644 --- a/src/Markdig/Helpers/HtmlHelper.cs +++ b/src/Markdig/Helpers/HtmlHelper.cs @@ -127,7 +127,7 @@ namespace Markdig.Helpers case '\0': return false; case '>': - text.NextChar(); + text.SkipChar(); builder.Append(c); return true; case '/': @@ -137,7 +137,7 @@ namespace Markdig.Helpers { return false; } - text.NextChar(); + text.SkipChar(); builder.Append('>'); return true; case '=': @@ -269,7 +269,7 @@ namespace Markdig.Helpers if (c == '>') { - text.NextChar(); + text.SkipChar(); builder.Append('>'); return true; } @@ -304,7 +304,7 @@ namespace Markdig.Helpers if (c == '>') { builder.Append('>'); - text.NextChar(); + text.SkipChar(); return true; } @@ -337,7 +337,7 @@ namespace Markdig.Helpers c = text.NextChar(); if (c == '>') { - text.NextChar(); + text.SkipChar(); builder.Append('>'); return true; } @@ -392,7 +392,7 @@ namespace Markdig.Helpers if (c == '>') { builder.Append('>'); - text.NextChar(); + text.SkipChar(); return true; } return false; @@ -417,7 +417,7 @@ namespace Markdig.Helpers if (c == '>' && prevChar == '?') { builder.Append('>'); - text.NextChar(); + text.SkipChar(); return true; } prevChar = c; @@ -532,7 +532,7 @@ namespace Markdig.Helpers c = slice.PeekChar(); if (c == 'x' || c == 'X') { - c = slice.NextChar(); // skip # + slice.SkipChar(); // skip # // expect 1-6 hex digits starting from pos+3 while (c != '\0') { diff --git a/src/Markdig/Helpers/ICharIterator.cs b/src/Markdig/Helpers/ICharIterator.cs index 2ea1f32f..cb11ad1a 100644 --- a/src/Markdig/Helpers/ICharIterator.cs +++ b/src/Markdig/Helpers/ICharIterator.cs @@ -31,12 +31,23 @@ namespace Markdig.Helpers /// The next character. `\0` is end of the iteration. char NextChar(); + /// + /// Goes to the next character, incrementing the position. + /// + void SkipChar(); + + /// + /// Peeks at the next character, without incrementing the position. + /// + /// The next character. `\0` is end of the iteration. + char PeekChar(); + /// /// Peeks at the next character, without incrementing the position. /// /// /// The next character. `\0` is end of the iteration. - char PeekChar(int offset = 1); + char PeekChar(int offset); /// /// Gets a value indicating whether this instance is empty. diff --git a/src/Markdig/Helpers/LinkHelper.cs b/src/Markdig/Helpers/LinkHelper.cs index 22296e9b..53931e7c 100644 --- a/src/Markdig/Helpers/LinkHelper.cs +++ b/src/Markdig/Helpers/LinkHelper.cs @@ -246,7 +246,7 @@ namespace Markdig.Helpers break; } - text.NextChar(); + text.SkipChar(); link = builder.ToString(); builder.Length = 0; return true; @@ -294,7 +294,7 @@ namespace Markdig.Helpers if (c == '>') { - text.NextChar(); + text.SkipChar(); link = builder.ToString(); builder.Length = 0; return true; @@ -355,7 +355,7 @@ namespace Markdig.Helpers // 1. An inline link consists of a link text followed immediately by a left parenthesis (, if (c == '(') { - text.NextChar(); + text.SkipChar(); text.TrimStart(); var pos = text.Start; @@ -407,7 +407,7 @@ namespace Markdig.Helpers if (isValid) { // Skip ')' - text.NextChar(); + text.SkipChar(); title ??= string.Empty; } @@ -466,7 +466,7 @@ namespace Markdig.Helpers } // Skip last quote - text.NextChar(); + text.SkipChar(); isValid = true; break; } @@ -527,7 +527,7 @@ namespace Markdig.Helpers c = text.NextChar(); if (!hasEscape && c == '>') { - text.NextChar(); + text.SkipChar(); isValid = true; break; } @@ -743,7 +743,7 @@ namespace Markdig.Helpers label = null; return false; } - text.NextChar(); // Skip ':' + text.SkipChar(); // Skip ':' // Skip any whitespace before the url text.TrimStart(); @@ -873,7 +873,7 @@ namespace Markdig.Helpers if (c == ']') { - lines.NextChar(); // Skip ] + lines.SkipChar(); // Skip ] if (allowEmpty || hasNonWhiteSpace) { // Remove trailing spaces diff --git a/src/Markdig/Helpers/StringLineGroup.cs b/src/Markdig/Helpers/StringLineGroup.cs index be779d2f..b0b651c0 100644 --- a/src/Markdig/Helpers/StringLineGroup.cs +++ b/src/Markdig/Helpers/StringLineGroup.cs @@ -223,7 +223,7 @@ namespace Markdig.Helpers { End += lines.Lines[i].Slice.Length + 1; // Add chars } - NextChar(); + SkipChar(); } public int Start { get; private set; } @@ -287,7 +287,11 @@ namespace Markdig.Helpers return CurrentChar; } - public readonly char PeekChar(int offset = 1) + public void SkipChar() => NextChar(); + + public readonly char PeekChar() => PeekChar(1); + + public readonly char PeekChar(int offset) { if (offset < 0) ThrowHelper.ArgumentOutOfRangeException("Negative offset are not supported for StringLineGroup", nameof(offset)); diff --git a/src/Markdig/Helpers/StringSlice.cs b/src/Markdig/Helpers/StringSlice.cs index 786046d0..cf187677 100644 --- a/src/Markdig/Helpers/StringSlice.cs +++ b/src/Markdig/Helpers/StringSlice.cs @@ -119,6 +119,17 @@ namespace Markdig.Helpers return Text[start]; } + /// + /// Goes to the next character, incrementing the position. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void SkipChar() + { + int start = Start; + if (start <= End) + Start = start + 1; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal int CountAndSkipChar(char matchChar) { diff --git a/src/Markdig/Parsers/BlockProcessor.cs b/src/Markdig/Parsers/BlockProcessor.cs index c8332792..40132820 100644 --- a/src/Markdig/Parsers/BlockProcessor.cs +++ b/src/Markdig/Parsers/BlockProcessor.cs @@ -212,7 +212,7 @@ namespace Markdig.Parsers } else { - Line.NextChar(); + Line.SkipChar(); Column++; } } diff --git a/src/Markdig/Parsers/HtmlBlockParser.cs b/src/Markdig/Parsers/HtmlBlockParser.cs index 2609a399..008fc232 100644 --- a/src/Markdig/Parsers/HtmlBlockParser.cs +++ b/src/Markdig/Parsers/HtmlBlockParser.cs @@ -49,7 +49,7 @@ namespace Markdig.Parsers var line = state.Line; var startPosition = line.Start; - line.NextChar(); + line.SkipChar(); var result = TryParseTagType16(state, line, state.ColumnBeforeIndent, startPosition); // HTML blocks of type 7 cannot interrupt a paragraph: diff --git a/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs b/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs index 52c168f4..44a9ad3a 100644 --- a/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs +++ b/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs @@ -144,7 +144,7 @@ namespace Markdig.Parsers.Inlines char pc = (char)0; if (processor.Inline is HtmlEntityInline htmlEntityInline) { - if (htmlEntityInline.Transcoded.Length > 0) + if (!htmlEntityInline.Transcoded.IsEmpty) { pc = htmlEntityInline.Transcoded[htmlEntityInline.Transcoded.End]; } diff --git a/src/Markdig/Parsers/Inlines/EscapeInlineParser.cs b/src/Markdig/Parsers/Inlines/EscapeInlineParser.cs index d59c06b6..6712a2a8 100644 --- a/src/Markdig/Parsers/Inlines/EscapeInlineParser.cs +++ b/src/Markdig/Parsers/Inlines/EscapeInlineParser.cs @@ -36,7 +36,7 @@ namespace Markdig.Parsers.Inlines IsFirstCharacterEscaped = true, }; processor.Inline.Span.End = processor.Inline.Span.Start + 1; - slice.NextChar(); + slice.SkipChar(); return true; } @@ -52,7 +52,7 @@ namespace Markdig.Parsers.Inlines Column = column }; processor.Inline.Span.End = processor.Inline.Span.Start + 1; - slice.NextChar(); + slice.SkipChar(); return true; } return false; diff --git a/src/Markdig/Parsers/Inlines/LineBreakInlineParser.cs b/src/Markdig/Parsers/Inlines/LineBreakInlineParser.cs index 4be7d92d..a29578b4 100644 --- a/src/Markdig/Parsers/Inlines/LineBreakInlineParser.cs +++ b/src/Markdig/Parsers/Inlines/LineBreakInlineParser.cs @@ -37,7 +37,7 @@ namespace Markdig.Parsers.Inlines var startPosition = slice.Start; var hasDoubleSpacesBefore = slice.PeekCharExtra(-1).IsSpace() && slice.PeekCharExtra(-2).IsSpace(); - slice.NextChar(); // Skip \n + slice.SkipChar(); // Skip \n processor.Inline = new LineBreakInline { diff --git a/src/Markdig/Parsers/Inlines/LinkInlineParser.cs b/src/Markdig/Parsers/Inlines/LinkInlineParser.cs index c65e12e1..9b6ef7de 100644 --- a/src/Markdig/Parsers/Inlines/LinkInlineParser.cs +++ b/src/Markdig/Parsers/Inlines/LinkInlineParser.cs @@ -60,7 +60,7 @@ namespace Markdig.Parsers.Inlines slice = saved; // Else we insert a LinkDelimiter - slice.NextChar(); + slice.SkipChar(); processor.Inline = new LinkDelimiterInline(this) { Type = DelimiterType.Open, @@ -74,7 +74,7 @@ namespace Markdig.Parsers.Inlines return true; case ']': - slice.NextChar(); + slice.SkipChar(); if (processor.Inline != null) { if (TryProcessLinkOrImage(processor, ref slice)) @@ -252,8 +252,8 @@ namespace Markdig.Parsers.Inlines label = openParent.Label; labelSpan = openParent.LabelSpan; isLabelSpanLocal = false; - text.NextChar(); // Skip [ - text.NextChar(); // Skip ] + text.SkipChar(); // Skip [ + text.SkipChar(); // Skip ] } } else diff --git a/src/Markdig/Renderers/Normalize/Inlines/LiteralInlineRenderer.cs b/src/Markdig/Renderers/Normalize/Inlines/LiteralInlineRenderer.cs index 90cd9f26..6b9b6676 100644 --- a/src/Markdig/Renderers/Normalize/Inlines/LiteralInlineRenderer.cs +++ b/src/Markdig/Renderers/Normalize/Inlines/LiteralInlineRenderer.cs @@ -15,7 +15,7 @@ namespace Markdig.Renderers.Normalize.Inlines { protected override void Write(NormalizeRenderer renderer, LiteralInline obj) { - if (obj.IsFirstCharacterEscaped && obj.Content.Length > 0 && obj.Content[obj.Content.Start].IsAsciiPunctuation()) + if (obj.IsFirstCharacterEscaped && !obj.Content.IsEmpty && obj.Content[obj.Content.Start].IsAsciiPunctuation()) { renderer.Write('\\'); }