Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid computing tag helper documentation strings in compiler #8706

Merged
merged 10 commits into from
May 16, 2023
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public abstract class BoundAttributeDescriptor : IEquatable<BoundAttributeDescri
private const int CaseSensitiveBit = 1 << 10;

private int _flags;
private DocumentationObject _documentationObject;

private bool HasFlag(int flag) => (_flags & flag) != 0;
private void SetFlag(int toSet) => ThreadSafeFlagOperations.Set(ref _flags, toSet);
Expand Down Expand Up @@ -91,7 +92,17 @@ public bool HasIndexer
protected set => SetOrClearFlag(HasIndexerBit, value);
}

public string Documentation { get; protected set; }
public string Documentation
{
get => _documentationObject.GetText();
protected set => _documentationObject = new(value);
}

internal DocumentationObject DocumentationObject
{
get => _documentationObject;
set => _documentationObject = value;
DustinCampbell marked this conversation as resolved.
Show resolved Hide resolved
}

public string DisplayName { get; protected set; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,14 @@ public abstract class BoundAttributeDescriptorBuilder
public virtual void BindAttributeParameter(Action<BoundAttributeParameterDescriptorBuilder> configure)
{
}

internal virtual void SetDocumentation(string text)
{
throw new NotImplementedException();
}

internal virtual void SetDocumentation(DocumentationDescriptor documentation)
{
throw new NotImplementedException();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public bool Equals(BoundAttributeDescriptor? descriptorX, BoundAttributeDescript
descriptorX.IndexerNamePrefix != descriptorY.IndexerNamePrefix ||
descriptorX.TypeName != descriptorY.TypeName ||
descriptorX.IndexerTypeName != descriptorY.IndexerTypeName ||
descriptorX.Documentation != descriptorY.Documentation ||
descriptorX.DocumentationObject != descriptorY.DocumentationObject ||
descriptorX.DisplayName != descriptorY.DisplayName)
{
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public abstract class BoundAttributeParameterDescriptor : IEquatable<BoundAttrib
private const int CaseSensitiveBit = 1 << 4;

private int _flags;
private DocumentationObject _documentationObject;

private bool HasFlag(int flag) => (_flags & flag) != 0;
private void SetFlag(int toSet) => ThreadSafeFlagOperations.Set(ref _flags, toSet);
Expand Down Expand Up @@ -53,7 +54,17 @@ public bool IsBooleanProperty

public string TypeName { get; protected set; }

public string Documentation { get; protected set; }
public string Documentation
{
get => _documentationObject.GetText();
protected set => _documentationObject = new(value);
}

internal DocumentationObject DocumentationObject
{
get => _documentationObject;
set => _documentationObject = value;
}

public string DisplayName { get; protected set; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#nullable disable

using System;
using System.Collections.Generic;

namespace Microsoft.AspNetCore.Razor.Language;
Expand All @@ -22,4 +23,14 @@ public abstract class BoundAttributeParameterDescriptorBuilder
public abstract IDictionary<string, string> Metadata { get; }

public abstract RazorDiagnosticCollection Diagnostics { get; }

internal virtual void SetDocumentation(string text)
{
throw new NotImplementedException();
}

internal virtual void SetDocumentation(DocumentationDescriptor documentation)
{
throw new NotImplementedException();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public bool Equals(BoundAttributeParameterDescriptor? descriptorX, BoundAttribut
descriptorX.IsEnum != descriptorY.IsEnum ||
descriptorX.Name != descriptorY.Name ||
descriptorX.TypeName != descriptorY.TypeName ||
descriptorX.Documentation != descriptorY.Documentation ||
descriptorX.DocumentationObject != descriptorY.DocumentationObject ||
descriptorX.DisplayName != descriptorY.DisplayName)
{
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public DefaultBoundAttributeDescriptor(
bool hasIndexer,
string? indexerNamePrefix,
string? indexerTypeName,
string? documentation,
DocumentationObject documentationObject,
string? displayName,
bool caseSensitive,
bool isEditorRequired,
Expand All @@ -28,7 +28,7 @@ public DefaultBoundAttributeDescriptor(
HasIndexer = hasIndexer;
IndexerNamePrefix = indexerNamePrefix;
IndexerTypeName = indexerTypeName;
Documentation = documentation;
DocumentationObject = documentationObject;
DisplayName = displayName;
CaseSensitive = caseSensitive;
IsEditorRequired = isEditorRequired;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public override bool Return(DefaultBoundAttributeDescriptorBuilder builder)
{
builder._parent = null;
builder._kind = null;
builder._documentationObject = default;

builder.Name = null;
builder.TypeName = null;
Expand All @@ -23,7 +24,6 @@ public override bool Return(DefaultBoundAttributeDescriptorBuilder builder)
builder.IsEditorRequired = false;
builder.IndexerAttributeNamePrefix = null;
builder.IndexerValueTypeName = null;
builder.Documentation = null;
builder.DisplayName = null;

if (builder._attributeParameterBuilders is { } attributeParameterBuilders)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ private static readonly ObjectPool<HashSet<BoundAttributeParameterDescriptor>> s
[AllowNull]
private string _kind;
private List<DefaultBoundAttributeParameterDescriptorBuilder>? _attributeParameterBuilders;
private DocumentationObject _documentationObject;
private Dictionary<string, string?>? _metadata;
private RazorDiagnosticCollection? _diagnostics;

Expand All @@ -74,7 +75,13 @@ public DefaultBoundAttributeDescriptorBuilder(DefaultTagHelperDescriptorBuilder
public override bool IsDictionary { get; set; }
public override string? IndexerAttributeNamePrefix { get; set; }
public override string? IndexerValueTypeName { get; set; }
public override string? Documentation { get; set; }

public override string? Documentation
{
get => _documentationObject.GetText();
set => _documentationObject = new(value);
}

public override string? DisplayName { get; set; }

public override IDictionary<string, string?> Metadata => _metadata ??= new Dictionary<string, string?>();
Expand All @@ -97,6 +104,16 @@ public override void BindAttributeParameter(Action<BoundAttributeParameterDescri
_attributeParameterBuilders.Add(builder);
}

internal override void SetDocumentation(string text)
{
_documentationObject = new(text);
}

internal override void SetDocumentation(DocumentationDescriptor documentation)
{
_documentationObject = new(documentation);
}

public BoundAttributeDescriptor Build()
{
var diagnostics = new PooledHashSet<RazorDiagnostic>();
Expand All @@ -116,7 +133,7 @@ public BoundAttributeDescriptor Build()
IsDictionary,
IndexerAttributeNamePrefix,
IndexerValueTypeName,
Documentation,
_documentationObject,
GetDisplayName(),
CaseSensitive,
IsEditorRequired,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public DefaultBoundAttributeParameterDescriptor(
string? name,
string? typeName,
bool isEnum,
string? documentation,
DocumentationObject documentationObject,
string? displayName,
bool caseSensitive,
MetadataCollection metadata,
Expand All @@ -20,7 +20,7 @@ public DefaultBoundAttributeParameterDescriptor(
Name = name;
TypeName = typeName;
IsEnum = isEnum;
Documentation = documentation;
DocumentationObject = documentationObject;
DisplayName = displayName;
CaseSensitive = caseSensitive;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ public override bool Return(DefaultBoundAttributeParameterDescriptorBuilder buil
{
builder._parent = null;
builder._kind = null;
builder._documentationObject = default;

builder.Name = null;
builder.TypeName = null;
builder.IsEnum = false;
builder.Documentation = null;
builder.DisplayName = null;

ClearDiagnostics(builder._diagnostics);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public static void ReturnInstance(DefaultBoundAttributeParameterDescriptorBuilde
private DefaultBoundAttributeDescriptorBuilder _parent;
[AllowNull]
private string _kind;
private DocumentationObject _documentationObject;
private Dictionary<string, string?>? _metadata;

private RazorDiagnosticCollection? _diagnostics;
Expand All @@ -47,7 +48,13 @@ public DefaultBoundAttributeParameterDescriptorBuilder(DefaultBoundAttributeDesc
public override string? Name { get; set; }
public override string? TypeName { get; set; }
public override bool IsEnum { get; set; }
public override string? Documentation { get; set; }

public override string? Documentation
{
get => _documentationObject.GetText();
set => _documentationObject = new(value);
}

public override string? DisplayName { get; set; }

public override IDictionary<string, string?> Metadata => _metadata ??= new Dictionary<string, string?>();
Expand All @@ -56,6 +63,16 @@ public DefaultBoundAttributeParameterDescriptorBuilder(DefaultBoundAttributeDesc

internal bool CaseSensitive => _parent.CaseSensitive;

internal override void SetDocumentation(string text)
{
_documentationObject = new(text);
}

internal override void SetDocumentation(DocumentationDescriptor documentation)
{
_documentationObject = new(documentation);
}

public BoundAttributeParameterDescriptor Build()
{
var diagnostics = new PooledHashSet<RazorDiagnostic>();
Expand All @@ -70,7 +87,7 @@ public BoundAttributeParameterDescriptor Build()
Name,
TypeName,
IsEnum,
Documentation,
_documentationObject,
GetDisplayName(),
CaseSensitive,
MetadataCollection.CreateOrEmpty(_metadata),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Immutable;

namespace Microsoft.AspNetCore.Razor.Language;

internal class DefaultTagHelperDescriptor : TagHelperDescriptor
Expand All @@ -12,7 +10,7 @@ public DefaultTagHelperDescriptor(
string name,
string assemblyName,
string displayName,
string? documentation,
DocumentationObject documentationObject,
string? tagOutputHint,
bool caseSensitive,
TagMatchingRuleDescriptor[] tagMatchingRules,
Expand All @@ -25,7 +23,7 @@ public DefaultTagHelperDescriptor(
Name = name;
AssemblyName = assemblyName;
DisplayName = displayName;
Documentation = documentation;
DocumentationObject = documentationObject;
TagOutputHint = tagOutputHint;
CaseSensitive = caseSensitive;
TagMatchingRules = tagMatchingRules;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ public override bool Return(DefaultTagHelperDescriptorBuilder builder)
builder._kind = null;
builder._name = null;
builder._assemblyName = null;
builder._documentationObject = default;

builder.DisplayName = null;
builder.TagOutputHint = null;
builder.CaseSensitive = false;
builder.Documentation = null;

if (builder._allowedChildTags is { } allowedChildTagBuilders)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ private static readonly ObjectPool<HashSet<TagMatchingRuleDescriptor>> s_tagMatc
private string? _name;
private string? _assemblyName;

private DocumentationObject _documentationObject;

private List<DefaultAllowedChildTagDescriptorBuilder>? _allowedChildTags;
private List<DefaultBoundAttributeDescriptorBuilder>? _attributeBuilders;
private List<DefaultTagMatchingRuleDescriptorBuilder>? _tagMatchingRuleBuilders;
Expand Down Expand Up @@ -72,7 +74,12 @@ public DefaultTagHelperDescriptorBuilder(string kind, string name, string assemb
public override string? DisplayName { get; set; }
public override string? TagOutputHint { get; set; }
public override bool CaseSensitive { get; set; }
public override string? Documentation { get; set; }

public override string? Documentation
{
get => _documentationObject.GetText();
set => _documentationObject = new(value);
}

public override IDictionary<string, string?> Metadata => _metadata;
public override RazorDiagnosticCollection Diagnostics => _diagnostics ??= new RazorDiagnosticCollection();
Expand Down Expand Up @@ -149,6 +156,16 @@ public override void TagMatchingRule(Action<TagMatchingRuleDescriptorBuilder> co
_tagMatchingRuleBuilders.Add(builder);
}

internal override void SetDocumentation(string text)
{
_documentationObject = new(text);
}

internal override void SetDocumentation(DocumentationDescriptor documentation)
{
_documentationObject = new(documentation);
}

public override TagHelperDescriptor Build()
{
using var diagnostics = new PooledHashSet<RazorDiagnostic>();
Expand All @@ -164,7 +181,7 @@ public override TagHelperDescriptor Build()
Name,
AssemblyName,
GetDisplayName(),
Documentation,
_documentationObject,
TagOutputHint,
CaseSensitive,
tagMatchingRules,
Expand All @@ -178,7 +195,7 @@ public override TagHelperDescriptor Build()

public override void Reset()
{
Documentation = null;
_documentationObject = default;
TagOutputHint = null;
_allowedChildTags?.Clear();
_attributeBuilders?.Clear();
Expand Down
Loading