Skip to content

Commit ec2963e

Browse files
Compute RequiredAttribute.DisplayName
The RequiredAttributeDescriptor.DisplayName property can be computed , so we can stop serializing/deserializing the display name.
1 parent a3b435b commit ec2963e

File tree

5 files changed

+32
-35
lines changed

5 files changed

+32
-35
lines changed

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RequiredAttributeDescriptor.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@ public sealed class RequiredAttributeDescriptor : TagHelperObject<RequiredAttrib
1111
{
1212
private readonly RequiredAttributeDescriptorFlags _flags;
1313
private TagMatchingRuleDescriptor? _parent;
14+
private string? _displayName;
1415

1516
internal RequiredAttributeDescriptorFlags Flags => _flags;
1617

1718
public string Name { get; }
1819
public RequiredAttributeNameComparison NameComparison { get; }
1920
public string? Value { get; }
2021
public RequiredAttributeValueComparison ValueComparison { get; }
21-
public string DisplayName { get; }
22+
public string DisplayName => _displayName ??= GetDisplayName(Name, NameComparison);
2223

2324
public bool CaseSensitive => _flags.IsFlagSet(RequiredAttributeDescriptorFlags.CaseSensitive);
2425
public bool IsDirectiveAttribute => _flags.IsFlagSet(RequiredAttributeDescriptorFlags.IsDirectiveAttribute);
@@ -31,7 +32,6 @@ internal RequiredAttributeDescriptor(
3132
RequiredAttributeNameComparison nameComparison,
3233
string? value,
3334
RequiredAttributeValueComparison valueComparison,
34-
string displayName,
3535
ImmutableArray<RazorDiagnostic> diagnostics,
3636
MetadataCollection metadata)
3737
: base(diagnostics)
@@ -41,7 +41,6 @@ internal RequiredAttributeDescriptor(
4141
NameComparison = nameComparison;
4242
Value = value;
4343
ValueComparison = valueComparison;
44-
DisplayName = displayName;
4544
Metadata = metadata ?? MetadataCollection.Empty;
4645
}
4746

@@ -52,7 +51,6 @@ private protected override void BuildChecksum(in Checksum.Builder builder)
5251
builder.AppendData((int)NameComparison);
5352
builder.AppendData(Value);
5453
builder.AppendData((int)ValueComparison);
55-
builder.AppendData(DisplayName);
5654
builder.AppendData(Metadata.Checksum);
5755
}
5856

@@ -69,6 +67,11 @@ internal void SetParent(TagMatchingRuleDescriptor parent)
6967

7068
public override string ToString()
7169
{
72-
return DisplayName ?? base.ToString()!;
70+
return DisplayName;
7371
}
72+
73+
internal static string GetDisplayName(string name, RequiredAttributeNameComparison nameComparison)
74+
=> nameComparison == RequiredAttributeNameComparison.PrefixMatch
75+
? name + "..."
76+
: name;
7477
}

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RequiredAttributeDescriptorBuilder.cs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Collections.Immutable;
7+
using System.Diagnostics;
78
using System.Diagnostics.CodeAnalysis;
89
using Microsoft.AspNetCore.Razor.PooledObjects;
910

@@ -44,7 +45,6 @@ public bool IsDirectiveAttribute
4445

4546
private protected override RequiredAttributeDescriptor BuildCore(ImmutableArray<RazorDiagnostic> diagnostics)
4647
{
47-
var displayName = GetDisplayName();
4848
var metadata = _metadata.GetMetadataCollection();
4949

5050
var flags = _flags;
@@ -60,47 +60,47 @@ private protected override RequiredAttributeDescriptor BuildCore(ImmutableArray<
6060
NameComparison,
6161
Value,
6262
ValueComparison,
63-
displayName,
6463
diagnostics,
6564
metadata);
6665
}
6766

68-
private string GetDisplayName()
69-
{
70-
return (NameComparison == RequiredAttributeNameComparison.PrefixMatch ? string.Concat(Name, "...") : Name) ?? string.Empty;
71-
}
72-
7367
private protected override void CollectDiagnostics(ref PooledHashSet<RazorDiagnostic> diagnostics)
7468
{
75-
if (Name.IsNullOrWhiteSpace())
69+
var name = Name;
70+
71+
if (name.IsNullOrWhiteSpace())
7672
{
7773
var diagnostic = RazorDiagnosticFactory.CreateTagHelper_InvalidTargetedAttributeNameNullOrWhitespace();
7874

7975
diagnostics.Add(diagnostic);
76+
return;
8077
}
81-
else
78+
79+
var nameSpan = name.AsSpan();
80+
Debug.Assert(nameSpan.Length > 0, "Name should not be empty at this point.");
81+
82+
if (IsDirectiveAttribute)
8283
{
83-
var name = Name.AsSpan();
84-
var isDirectiveAttribute = IsDirectiveAttribute;
85-
if (isDirectiveAttribute && name[0] == '@')
84+
if (nameSpan[0] == '@')
8685
{
87-
name = name[1..];
86+
nameSpan = nameSpan[1..];
8887
}
89-
else if (isDirectiveAttribute)
88+
else
9089
{
91-
var diagnostic = RazorDiagnosticFactory.CreateTagHelper_InvalidRequiredDirectiveAttributeName(GetDisplayName(), Name);
90+
var diagnostic = RazorDiagnosticFactory.CreateTagHelper_InvalidRequiredDirectiveAttributeName(
91+
RequiredAttributeDescriptor.GetDisplayName(name, NameComparison), name);
9292

9393
diagnostics.Add(diagnostic);
9494
}
95+
}
9596

96-
foreach (var ch in name)
97+
foreach (var ch in nameSpan)
98+
{
99+
if (char.IsWhiteSpace(ch) || HtmlConventions.IsInvalidNonWhitespaceHtmlCharacters(ch))
97100
{
98-
if (char.IsWhiteSpace(ch) || HtmlConventions.IsInvalidNonWhitespaceHtmlCharacters(ch))
99-
{
100-
var diagnostic = RazorDiagnosticFactory.CreateTagHelper_InvalidTargetedAttributeName(Name, ch);
101+
var diagnostic = RazorDiagnosticFactory.CreateTagHelper_InvalidTargetedAttributeName(name, ch);
101102

102-
diagnostics.Add(diagnostic);
103-
}
103+
diagnostics.Add(diagnostic);
104104
}
105105
}
106106
}

src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Serialization/MessagePack/Formatters/TagHelpers/RequiredAttributeFormatter.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33

44
using System.Collections.Immutable;
55
using MessagePack;
6-
using Microsoft.AspNetCore.Razor;
76
using Microsoft.AspNetCore.Razor.Language;
87

98
namespace Microsoft.CodeAnalysis.Razor.Serialization.MessagePack.Formatters.TagHelpers;
109

1110
internal sealed class RequiredAttributeFormatter : ValueFormatter<RequiredAttributeDescriptor>
1211
{
13-
private const int PropertyCount = 8;
12+
private const int PropertyCount = 7;
1413

1514
public static readonly ValueFormatter<RequiredAttributeDescriptor> Instance = new RequiredAttributeFormatter();
1615

@@ -27,15 +26,14 @@ public override RequiredAttributeDescriptor Deserialize(ref MessagePackReader re
2726
var nameComparison = (RequiredAttributeNameComparison)reader.ReadInt32();
2827
var value = CachedStringFormatter.Instance.Deserialize(ref reader, options);
2928
var valueComparison = (RequiredAttributeValueComparison)reader.ReadInt32();
30-
var displayName = CachedStringFormatter.Instance.Deserialize(ref reader, options).AssumeNotNull();
3129

3230
var metadata = reader.Deserialize<MetadataCollection>(options);
3331
var diagnostics = reader.Deserialize<ImmutableArray<RazorDiagnostic>>(options);
3432

3533
return new RequiredAttributeDescriptor(
3634
flags, name!, nameComparison,
3735
value, valueComparison,
38-
displayName, diagnostics, metadata);
36+
diagnostics, metadata);
3937
}
4038

4139
public override void Serialize(ref MessagePackWriter writer, RequiredAttributeDescriptor value, SerializerCachingOptions options)
@@ -47,7 +45,6 @@ public override void Serialize(ref MessagePackWriter writer, RequiredAttributeDe
4745
writer.Write((int)value.NameComparison);
4846
CachedStringFormatter.Instance.Serialize(ref writer, value.Value, options);
4947
writer.Write((int)value.ValueComparison);
50-
CachedStringFormatter.Instance.Serialize(ref writer, value.DisplayName, options);
5148

5249
writer.Serialize(value.Metadata, options);
5350
writer.Serialize(value.Diagnostics, options);
@@ -62,7 +59,6 @@ public override void Skim(ref MessagePackReader reader, SerializerCachingOptions
6259
reader.Skip(); // NameComparison
6360
CachedStringFormatter.Instance.Skim(ref reader, options); // Value
6461
reader.Skip(); // ValueComparison
65-
CachedStringFormatter.Instance.Skim(ref reader, options); // DisplayName
6662

6763
MetadataCollectionFormatter.Instance.Skim(ref reader, options); // Metadata
6864
RazorDiagnosticFormatter.Instance.SkimArray(ref reader, options); // Diagnostics

src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectReaders_TagHelpers.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,14 @@ static RequiredAttributeDescriptor ReadFromProperties(JsonDataReader reader)
134134
var nameComparison = (RequiredAttributeNameComparison)reader.ReadInt32OrZero(nameof(RequiredAttributeDescriptor.NameComparison));
135135
var value = reader.ReadStringOrNull(nameof(RequiredAttributeDescriptor.Value));
136136
var valueComparison = (RequiredAttributeValueComparison)reader.ReadInt32OrZero(nameof(RequiredAttributeDescriptor.ValueComparison));
137-
var displayName = reader.ReadNonNullString(nameof(RequiredAttributeDescriptor.DisplayName));
138137

139138
var metadata = ReadMetadata(reader, nameof(RequiredAttributeDescriptor.Metadata));
140139
var diagnostics = reader.ReadImmutableArrayOrEmpty(nameof(RequiredAttributeDescriptor.Diagnostics), ReadDiagnostic);
141140

142141
return new RequiredAttributeDescriptor(
143142
flags, Cached(name)!, nameComparison,
144143
Cached(value), valueComparison,
145-
Cached(displayName), diagnostics, metadata);
144+
diagnostics, metadata);
146145
}
147146
}
148147

src/Shared/Microsoft.AspNetCore.Razor.Serialization.Json/ObjectWriters_TagHelpers.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ static void WriteRequiredAttribute(JsonDataWriter writer, RequiredAttributeDescr
9494
writer.WriteIfNotZero(nameof(value.NameComparison), (int)value.NameComparison);
9595
writer.WriteIfNotNull(nameof(value.Value), value.Value);
9696
writer.WriteIfNotZero(nameof(value.ValueComparison), (int)value.ValueComparison);
97-
writer.WriteIfNotNull(nameof(value.DisplayName), value.DisplayName);
9897

9998
WriteMetadata(writer, nameof(value.Metadata), value.Metadata);
10099
writer.WriteArrayIfNotDefaultOrEmpty(nameof(value.Diagnostics), value.Diagnostics, Write);

0 commit comments

Comments
 (0)