Remove boxing of symbol types.
- The Equals operators were boxing the symbol types like crazy, added an abstract `SymbolTypeEquals` to avoid this. #635
This commit is contained in:
parent
b760156e66
commit
7a0a9c6caa
|
|
@ -62,6 +62,8 @@ namespace Microsoft.AspNet.Razor.Parser
|
||||||
get { return CSharpLanguageCharacteristics.Instance; }
|
get { return CSharpLanguageCharacteristics.Instance; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override bool SymbolTypeEquals(CSharpSymbolType x, CSharpSymbolType y) => x == y;
|
||||||
|
|
||||||
protected void MapDirectives(Action handler, params string[] directives)
|
protected void MapDirectives(Action handler, params string[] directives)
|
||||||
{
|
{
|
||||||
foreach (string directive in directives)
|
foreach (string directive in directives)
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Razor.Parser
|
||||||
// Whitespace here is invalid (according to the spec)
|
// Whitespace here is invalid (according to the spec)
|
||||||
OptionalBangEscape();
|
OptionalBangEscape();
|
||||||
Optional(HtmlSymbolType.Text);
|
Optional(HtmlSymbolType.Text);
|
||||||
AcceptAll(HtmlSymbolType.WhiteSpace);
|
Optional(HtmlSymbolType.WhiteSpace);
|
||||||
Optional(HtmlSymbolType.CloseAngle);
|
Optional(HtmlSymbolType.CloseAngle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,8 @@ namespace Microsoft.AspNet.Razor.Parser
|
||||||
get { return HtmlLanguageCharacteristics.Instance; }
|
get { return HtmlLanguageCharacteristics.Instance; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override bool SymbolTypeEquals(HtmlSymbolType x, HtmlSymbolType y) => x == y;
|
||||||
|
|
||||||
public override void BuildSpan(SpanBuilder span, SourceLocation start, string content)
|
public override void BuildSpan(SpanBuilder span, SourceLocation start, string content)
|
||||||
{
|
{
|
||||||
span.Kind = SpanKind.Markup;
|
span.Kind = SpanKind.Markup;
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,11 @@ namespace Microsoft.AspNet.Razor.Parser
|
||||||
[Conditional("DEBUG")]
|
[Conditional("DEBUG")]
|
||||||
internal void Assert(TSymbolType expectedType)
|
internal void Assert(TSymbolType expectedType)
|
||||||
{
|
{
|
||||||
Debug.Assert(!EndOfFile && Equals(CurrentSymbol.Type, expectedType));
|
Debug.Assert(!EndOfFile && SymbolTypeEquals(CurrentSymbol.Type, expectedType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract protected bool SymbolTypeEquals(TSymbolType x, TSymbolType y);
|
||||||
|
|
||||||
protected internal void PutBack(TSymbol symbol)
|
protected internal void PutBack(TSymbol symbol)
|
||||||
{
|
{
|
||||||
if (symbol != null)
|
if (symbol != null)
|
||||||
|
|
@ -147,12 +149,12 @@ namespace Microsoft.AspNet.Razor.Parser
|
||||||
|
|
||||||
protected internal bool NextIs(TSymbolType type)
|
protected internal bool NextIs(TSymbolType type)
|
||||||
{
|
{
|
||||||
return NextIs(sym => sym != null && Equals(type, sym.Type));
|
return NextIs(sym => sym != null && SymbolTypeEquals(type, sym.Type));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal bool NextIs(params TSymbolType[] types)
|
protected internal bool NextIs(params TSymbolType[] types)
|
||||||
{
|
{
|
||||||
return NextIs(sym => sym != null && types.Any(t => Equals(t, sym.Type)));
|
return NextIs(sym => sym != null && types.Any(t => SymbolTypeEquals(t, sym.Type)));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal bool NextIs(Func<TSymbol, bool> condition)
|
protected internal bool NextIs(Func<TSymbol, bool> condition)
|
||||||
|
|
@ -168,12 +170,12 @@ namespace Microsoft.AspNet.Razor.Parser
|
||||||
|
|
||||||
protected internal bool Was(TSymbolType type)
|
protected internal bool Was(TSymbolType type)
|
||||||
{
|
{
|
||||||
return PreviousSymbol != null && Equals(PreviousSymbol.Type, type);
|
return PreviousSymbol != null && SymbolTypeEquals(PreviousSymbol.Type, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal bool At(TSymbolType type)
|
protected internal bool At(TSymbolType type)
|
||||||
{
|
{
|
||||||
return !EndOfFile && CurrentSymbol != null && Equals(CurrentSymbol.Type, type);
|
return !EndOfFile && CurrentSymbol != null && SymbolTypeEquals(CurrentSymbol.Type, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal bool AcceptAndMoveNext()
|
protected internal bool AcceptAndMoveNext()
|
||||||
|
|
@ -219,7 +221,7 @@ namespace Microsoft.AspNet.Razor.Parser
|
||||||
{
|
{
|
||||||
foreach (TSymbolType type in types)
|
foreach (TSymbolType type in types)
|
||||||
{
|
{
|
||||||
if (CurrentSymbol == null || !Equals(CurrentSymbol.Type, type))
|
if (CurrentSymbol == null || !SymbolTypeEquals(CurrentSymbol.Type, type))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -380,44 +382,44 @@ namespace Microsoft.AspNet.Razor.Parser
|
||||||
|
|
||||||
protected internal void AcceptWhile(TSymbolType type)
|
protected internal void AcceptWhile(TSymbolType type)
|
||||||
{
|
{
|
||||||
AcceptWhile(sym => Equals(type, sym.Type));
|
AcceptWhile(sym => SymbolTypeEquals(type, sym.Type));
|
||||||
}
|
}
|
||||||
|
|
||||||
// We want to avoid array allocations and enumeration where possible, so we use the same technique as string.Format
|
// We want to avoid array allocations and enumeration where possible, so we use the same technique as string.Format
|
||||||
protected internal void AcceptWhile(TSymbolType type1, TSymbolType type2)
|
protected internal void AcceptWhile(TSymbolType type1, TSymbolType type2)
|
||||||
{
|
{
|
||||||
AcceptWhile(sym => Equals(type1, sym.Type) || Equals(type2, sym.Type));
|
AcceptWhile(sym => SymbolTypeEquals(type1, sym.Type) || SymbolTypeEquals(type2, sym.Type));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal void AcceptWhile(TSymbolType type1, TSymbolType type2, TSymbolType type3)
|
protected internal void AcceptWhile(TSymbolType type1, TSymbolType type2, TSymbolType type3)
|
||||||
{
|
{
|
||||||
AcceptWhile(sym => Equals(type1, sym.Type) || Equals(type2, sym.Type) || Equals(type3, sym.Type));
|
AcceptWhile(sym => SymbolTypeEquals(type1, sym.Type) || SymbolTypeEquals(type2, sym.Type) || SymbolTypeEquals(type3, sym.Type));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal void AcceptWhile(params TSymbolType[] types)
|
protected internal void AcceptWhile(params TSymbolType[] types)
|
||||||
{
|
{
|
||||||
AcceptWhile(sym => types.Any(expected => Equals(expected, sym.Type)));
|
AcceptWhile(sym => types.Any(expected => SymbolTypeEquals(expected, sym.Type)));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal void AcceptUntil(TSymbolType type)
|
protected internal void AcceptUntil(TSymbolType type)
|
||||||
{
|
{
|
||||||
AcceptWhile(sym => !Equals(type, sym.Type));
|
AcceptWhile(sym => !SymbolTypeEquals(type, sym.Type));
|
||||||
}
|
}
|
||||||
|
|
||||||
// We want to avoid array allocations and enumeration where possible, so we use the same technique as string.Format
|
// We want to avoid array allocations and enumeration where possible, so we use the same technique as string.Format
|
||||||
protected internal void AcceptUntil(TSymbolType type1, TSymbolType type2)
|
protected internal void AcceptUntil(TSymbolType type1, TSymbolType type2)
|
||||||
{
|
{
|
||||||
AcceptWhile(sym => !Equals(type1, sym.Type) && !Equals(type2, sym.Type));
|
AcceptWhile(sym => !SymbolTypeEquals(type1, sym.Type) && !SymbolTypeEquals(type2, sym.Type));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal void AcceptUntil(TSymbolType type1, TSymbolType type2, TSymbolType type3)
|
protected internal void AcceptUntil(TSymbolType type1, TSymbolType type2, TSymbolType type3)
|
||||||
{
|
{
|
||||||
AcceptWhile(sym => !Equals(type1, sym.Type) && !Equals(type2, sym.Type) && !Equals(type3, sym.Type));
|
AcceptWhile(sym => !SymbolTypeEquals(type1, sym.Type) && !SymbolTypeEquals(type2, sym.Type) && !SymbolTypeEquals(type3, sym.Type));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal void AcceptUntil(params TSymbolType[] types)
|
protected internal void AcceptUntil(params TSymbolType[] types)
|
||||||
{
|
{
|
||||||
AcceptWhile(sym => types.All(expected => !Equals(expected, sym.Type)));
|
AcceptWhile(sym => types.All(expected => !SymbolTypeEquals(expected, sym.Type)));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal void AcceptWhile(Func<TSymbol, bool> condition)
|
protected internal void AcceptWhile(Func<TSymbol, bool> condition)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue