Reduce casts when rendering

This commit is contained in:
Miha Zupan
2022-04-03 13:34:38 +02:00
parent e11a2630b8
commit 6eacf8a170
18 changed files with 54 additions and 9 deletions

View File

@@ -20,7 +20,7 @@ namespace Markdig.Renderers.Html
/// <summary>
/// Initializes a new instance of the <see cref="CodeBlockRenderer"/> class.
/// </summary>
public CodeBlockRenderer() { }
public CodeBlockRenderer() => IsInternalRenderer = GetType() == typeof(CodeBlockRenderer);
public bool OutputAttributesOnPre { get; set; }

View File

@@ -21,6 +21,8 @@ namespace Markdig.Renderers.Html
"h6",
};
public HeadingRenderer() => IsInternalRenderer = GetType() == typeof(HeadingRenderer);
protected override void Write(HtmlRenderer renderer, HeadingBlock obj)
{
int index = obj.Level - 1;

View File

@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html
/// <seealso cref="HtmlObjectRenderer{HtmlBlock}" />
public class HtmlBlockRenderer : HtmlObjectRenderer<HtmlBlock>
{
public HtmlBlockRenderer() => IsInternalRenderer = GetType() == typeof(HtmlBlockRenderer);
protected override void Write(HtmlRenderer renderer, HtmlBlock obj)
{
renderer.WriteLeafRawLines(obj, true, false);

View File

@@ -13,6 +13,8 @@ namespace Markdig.Renderers.Html.Inlines
/// <seealso cref="HtmlObjectRenderer{AutolinkInline}" />
public class AutolinkInlineRenderer : HtmlObjectRenderer<AutolinkInline>
{
public AutolinkInlineRenderer() => IsInternalRenderer = GetType() == typeof(AutolinkInlineRenderer);
/// <summary>
/// Gets or sets a value indicating whether to always add rel="nofollow" for links or not.
/// </summary>

View File

@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
/// <seealso cref="HtmlObjectRenderer{CodeInline}" />
public class CodeInlineRenderer : HtmlObjectRenderer<CodeInline>
{
public CodeInlineRenderer() => IsInternalRenderer = GetType() == typeof(CodeInlineRenderer);
protected override void Write(HtmlRenderer renderer, CodeInline obj)
{
if (renderer.EnableHtmlForInline)

View File

@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
/// <seealso cref="HtmlObjectRenderer{DelimiterInline}" />
public class DelimiterInlineRenderer : HtmlObjectRenderer<DelimiterInline>
{
public DelimiterInlineRenderer() => IsInternalRenderer = GetType() == typeof(DelimiterInlineRenderer);
protected override void Write(HtmlRenderer renderer, DelimiterInline obj)
{
renderer.WriteEscape(obj.ToLiteral());

View File

@@ -26,6 +26,7 @@ namespace Markdig.Renderers.Html.Inlines
public EmphasisInlineRenderer()
{
GetTag = GetDefaultTag;
IsInternalRenderer = GetType() == typeof(EmphasisInlineRenderer);
}
/// <summary>

View File

@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
/// <seealso cref="HtmlObjectRenderer{HtmlEntityInline}" />
public class HtmlEntityInlineRenderer : HtmlObjectRenderer<HtmlEntityInline>
{
public HtmlEntityInlineRenderer() => IsInternalRenderer = GetType() == typeof(HtmlEntityInlineRenderer);
protected override void Write(HtmlRenderer renderer, HtmlEntityInline obj)
{
if (renderer.EnableHtmlEscape)

View File

@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
/// <seealso cref="HtmlObjectRenderer{HtmlInline}" />
public class HtmlInlineRenderer : HtmlObjectRenderer<HtmlInline>
{
public HtmlInlineRenderer() => IsInternalRenderer = GetType() == typeof(HtmlInlineRenderer);
protected override void Write(HtmlRenderer renderer, HtmlInline obj)
{
if (renderer.EnableHtmlForInline)

View File

@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
/// <seealso cref="HtmlObjectRenderer{LineBreakInline}" />
public class LineBreakInlineRenderer : HtmlObjectRenderer<LineBreakInline>
{
public LineBreakInlineRenderer() => IsInternalRenderer = GetType() == typeof(LineBreakInlineRenderer);
/// <summary>
/// Gets or sets a value indicating whether to render this softline break as a HTML hardline break tag (&lt;br /&gt;)
/// </summary>

View File

@@ -13,6 +13,8 @@ namespace Markdig.Renderers.Html.Inlines
/// <seealso cref="HtmlObjectRenderer{LinkInline}" />
public class LinkInlineRenderer : HtmlObjectRenderer<LinkInline>
{
public LinkInlineRenderer() => IsInternalRenderer = GetType() == typeof(LinkInlineRenderer);
/// <summary>
/// Gets or sets a value indicating whether to always add rel="nofollow" for links or not.
/// </summary>

View File

@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
/// <seealso cref="HtmlObjectRenderer{LiteralInline}" />
public class LiteralInlineRenderer : HtmlObjectRenderer<LiteralInline>
{
public LiteralInlineRenderer() => IsInternalRenderer = GetType() == typeof(LiteralInlineRenderer);
protected override void Write(HtmlRenderer renderer, LiteralInline obj)
{
if (renderer.EnableHtmlEscape)

View File

@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html
/// <seealso cref="HtmlObjectRenderer{ListBlock}" />
public class ListRenderer : HtmlObjectRenderer<ListBlock>
{
public ListRenderer() => IsInternalRenderer = GetType() == typeof(ListRenderer);
protected override void Write(HtmlRenderer renderer, ListBlock listBlock)
{
renderer.EnsureLine();

View File

@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html
/// <seealso cref="HtmlObjectRenderer{ParagraphBlock}" />
public class ParagraphRenderer : HtmlObjectRenderer<ParagraphBlock>
{
public ParagraphRenderer() => IsInternalRenderer = GetType() == typeof(ParagraphRenderer);
protected override void Write(HtmlRenderer renderer, ParagraphBlock obj)
{
if (!renderer.ImplicitParagraph && renderer.EnableHtmlForBlock)

View File

@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html
/// <seealso cref="HtmlObjectRenderer{QuoteBlock}" />
public class QuoteBlockRenderer : HtmlObjectRenderer<QuoteBlock>
{
public QuoteBlockRenderer() => IsInternalRenderer = GetType() == typeof(QuoteBlockRenderer);
protected override void Write(HtmlRenderer renderer, QuoteBlock obj)
{
renderer.EnsureLine();

View File

@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html
/// <seealso cref="HtmlObjectRenderer{ThematicBreakBlock}" />
public class ThematicBreakRenderer : HtmlObjectRenderer<ThematicBreakBlock>
{
public ThematicBreakRenderer() => IsInternalRenderer = GetType() == typeof(ThematicBreakRenderer);
protected override void Write(HtmlRenderer renderer, ThematicBreakBlock obj)
{
if (renderer.EnableHtmlForBlock)

View File

@@ -5,6 +5,7 @@
using Markdig.Helpers;
using Markdig.Syntax;
using System;
using System.Runtime.CompilerServices;
namespace Markdig.Renderers
{
@@ -18,6 +19,9 @@ namespace Markdig.Renderers
{
private OrderedList<TryWriteDelegate>? _tryWriters;
// Indicates whether it's safe to skip type checks during Write
private protected bool IsInternalRenderer;
protected MarkdownObjectRenderer() { }
public delegate bool TryWriteDelegate(TRenderer renderer, TObject obj);
@@ -29,15 +33,26 @@ namespace Markdig.Renderers
public virtual void Write(RendererBase renderer, MarkdownObject obj)
{
var htmlRenderer = (TRenderer)renderer;
var typedObj = (TObject)obj;
TRenderer typedRenderer;
TObject typedObj;
if (_tryWriters is not null && TryWrite(htmlRenderer, typedObj))
if (IsInternalRenderer)
{
typedRenderer = Unsafe.As<TRenderer>(renderer);
typedObj = Unsafe.As<TObject>(obj);
}
else
{
typedRenderer = (TRenderer)renderer;
typedObj = (TObject)obj;
}
if (_tryWriters is not null && TryWrite(typedRenderer, typedObj))
{
return;
}
Write(htmlRenderer, typedObj);
Write(typedRenderer, typedObj);
}
private bool TryWrite(TRenderer renderer, TObject obj)

View File

@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Markdig.Helpers;
using Markdig.Syntax;
using Markdig.Syntax.Inlines;
@@ -149,13 +150,13 @@ namespace Markdig.Renderers
{
renderer.Write(this, obj);
}
else if (obj is ContainerInline containerInline)
else if (obj.IsContainerInline)
{
WriteChildren(containerInline);
WriteChildren(Unsafe.As<ContainerInline>(obj));
}
else if (obj is ContainerBlock containerBlock)
else if (obj.IsContainerBlock)
{
WriteChildren(containerBlock);
WriteChildren(Unsafe.As<ContainerBlock>(obj));
}
// Calls after writing an object