Skip to content

Commit a118983

Browse files
Compiler: Clean up and reduce allocations in declaration intermediate nodes (second try!) (#12135)
This is a bit of a rethink of #12024 This pull request cleans up and reduces allocations in declaration-level intermediate nodes: `NamespaceDeclarationIntermediateNode`, `ClassDeclarationIntermediateNode`, `MethodDeclarationIntermediateNode`, `FieldDeclarationIntermediateNode`, `PropertyDeclarationIntermediateNode`, and related types. In particular, various collection properties are no longer types as `IList<T>` and pre-assigned with a `List<T>` instance. Instead, these properties now return `ImmutableArray<T>`. ---- CI Build: https://dev.azure.com/dnceng/internal/_build/results?buildId=2777478&view=results Test Insertion: https://dev.azure.com/devdiv/DevDiv/_git/VS/pullrequest/663973 Toolset Run: https://dev.azure.com/dnceng/internal/_build/results?buildId=2777479&view=results
2 parents 5f3dcd9 + 964c1e8 commit a118983

File tree

56 files changed

+625
-677
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+625
-677
lines changed

src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/ModelDirectiveTest.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ @model Type1
8686
var classNode = documentNode.GetClassNode();
8787
var baseType = classNode.BaseType;
8888

89+
Assert.NotNull(baseType);
8990
Assert.Equal("BaseType", baseType.BaseType.Content);
9091
Assert.NotNull(baseType.BaseType.Source);
9192

@@ -114,6 +115,7 @@ @model Type2
114115
var classNode = documentNode.GetClassNode();
115116
var baseType = classNode.BaseType;
116117

118+
Assert.NotNull(baseType);
117119
Assert.Equal("BaseType", baseType.BaseType.Content);
118120
Assert.NotNull(baseType.BaseType.Source);
119121

@@ -141,6 +143,7 @@ @model Type1
141143
var classNode = documentNode.GetClassNode();
142144
var baseType = classNode.BaseType;
143145

146+
Assert.NotNull(baseType);
144147
Assert.Equal("BaseType", baseType.BaseType.Content);
145148
Assert.NotNull(baseType.BaseType.Source);
146149

@@ -166,6 +169,7 @@ @inherits BaseType<TModel>
166169
var classNode = documentNode.GetClassNode();
167170
var baseType = classNode.BaseType;
168171

172+
Assert.NotNull(baseType);
169173
Assert.Equal("BaseType", baseType.BaseType.Content);
170174
Assert.NotNull(baseType.BaseType.Source);
171175

@@ -193,6 +197,7 @@ @inherits BaseType<TModel>
193197
var classNode = documentNode.GetClassNode();
194198
var baseType = classNode.BaseType;
195199

200+
Assert.NotNull(baseType);
196201
Assert.Equal("BaseType", baseType.BaseType.Content);
197202
Assert.Null(baseType.BaseType.Source);
198203

@@ -224,6 +229,7 @@ @model SomeType
224229
var classNode = documentNode.GetClassNode();
225230
var baseType = classNode.BaseType;
226231

232+
Assert.NotNull(baseType);
227233
Assert.Equal("BaseType", baseType.BaseType.Content);
228234
Assert.Null(baseType.BaseType.Source);
229235

src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/MvcViewDocumentClassifierPassTest.cs

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
using Microsoft.AspNetCore.Razor.Language;
55
using Microsoft.AspNetCore.Razor.Language.Intermediate;
6-
using Roslyn.Test.Utilities;
76
using Xunit;
87

98
namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X;
@@ -28,9 +27,9 @@ public void MvcViewDocumentClassifierPass_SetsDocumentKind()
2827
processor.ExecutePass<MvcViewDocumentClassifierPass>();
2928

3029
// Assert
31-
var documentnode = processor.GetDocumentNode();
30+
var documentNode = processor.GetDocumentNode();
3231

33-
Assert.Equal("mvc.1.0.view", documentnode.DocumentKind);
32+
Assert.Equal("mvc.1.0.view", documentNode.DocumentKind);
3433
}
3534

3635
[Fact]
@@ -61,10 +60,10 @@ public void MvcViewDocumentClassifierPass_SetsNamespace()
6160
processor.ExecutePass<MvcViewDocumentClassifierPass>();
6261

6362
// Assert
64-
var documentnode = processor.GetDocumentNode();
65-
var namespaceNode = documentnode.GetNamespaceNode();
63+
var documentNode = processor.GetDocumentNode();
64+
var namespaceNode = documentNode.GetNamespaceNode();
6665

67-
Assert.Equal("AspNetCore", namespaceNode.Content);
66+
Assert.Equal("AspNetCore", namespaceNode.Name);
6867
}
6968

7069
[Fact]
@@ -79,15 +78,15 @@ public void MvcViewDocumentClassifierPass_SetsClass()
7978
processor.ExecutePass<MvcViewDocumentClassifierPass>();
8079

8180
// Assert
82-
var documentnode = processor.GetDocumentNode();
83-
var classNode = documentnode.GetClassNode();
81+
var documentNode = processor.GetDocumentNode();
82+
var classNode = documentNode.GetClassNode();
8483
var baseNode = Assert.IsType<BaseTypeWithModel>(classNode.BaseType);
8584

8685
Assert.Equal("global::Microsoft.AspNetCore.Mvc.Razor.RazorPage", baseNode.BaseType.Content);
8786
Assert.NotNull(baseNode.ModelType);
8887
Assert.Equal("TModel", baseNode.ModelType.Content);
89-
Assert.Equal(["public"], classNode.Modifiers);
90-
Assert.Equal("Test", classNode.ClassName);
88+
Assert.Equal<string>(["public"], classNode.Modifiers);
89+
Assert.Equal("Test", classNode.Name);
9190
}
9291

9392
[Fact]
@@ -102,15 +101,15 @@ public void MvcViewDocumentClassifierPass_NullFilePath_SetsClass()
102101
processor.ExecutePass<MvcViewDocumentClassifierPass>();
103102

104103
// Assert
105-
var documentnode = processor.GetDocumentNode();
106-
var classNode = documentnode.GetClassNode();
104+
var documentNode = processor.GetDocumentNode();
105+
var classNode = documentNode.GetClassNode();
107106
var baseNode = Assert.IsType<BaseTypeWithModel>(classNode.BaseType);
108107

109108
Assert.Equal("global::Microsoft.AspNetCore.Mvc.Razor.RazorPage", baseNode.BaseType.Content);
110109
Assert.NotNull(baseNode.ModelType);
111110
Assert.Equal("TModel", baseNode.ModelType.Content);
112-
Assert.Equal(["public"], classNode.Modifiers);
113-
AssertEx.Equal("AspNetCore_ec563e63d931b806184cb02f79875e4f3b21d1ca043ad06699424459128b58c0", classNode.ClassName);
111+
Assert.Equal<string>(["public"], classNode.Modifiers);
112+
Assert.Equal("AspNetCore_ec563e63d931b806184cb02f79875e4f3b21d1ca043ad06699424459128b58c0", classNode.Name);
114113
}
115114

116115
[Theory]
@@ -127,10 +126,10 @@ public void MvcViewDocumentClassifierPass_UsesRelativePathToGenerateTypeName(str
127126
processor.ExecutePass<MvcViewDocumentClassifierPass>();
128127

129128
// Assert
130-
var documentnode = processor.GetDocumentNode();
131-
var classNode = documentnode.GetClassNode();
129+
var documentNode = processor.GetDocumentNode();
130+
var classNode = documentNode.GetClassNode();
132131

133-
Assert.Equal(expected, classNode.ClassName);
132+
Assert.Equal(expected, classNode.Name);
134133
}
135134

136135
[Fact]
@@ -145,10 +144,10 @@ public void MvcViewDocumentClassifierPass_UsesAbsolutePath_IfRelativePathIsNotSe
145144
processor.ExecutePass<MvcViewDocumentClassifierPass>();
146145

147146
// Assert
148-
var documentnode = processor.GetDocumentNode();
149-
var classNode = documentnode.GetClassNode();
147+
var documentNode = processor.GetDocumentNode();
148+
var classNode = documentNode.GetClassNode();
150149

151-
Assert.Equal("x___application_Views_Home_Index", classNode.ClassName);
150+
Assert.Equal("x___application_Views_Home_Index", classNode.Name);
152151
}
153152

154153
[Fact]
@@ -163,10 +162,10 @@ public void MvcViewDocumentClassifierPass_SanitizesClassName()
163162
processor.ExecutePass<MvcViewDocumentClassifierPass>();
164163

165164
// Assert
166-
var documentnode = processor.GetDocumentNode();
167-
var classNode = documentnode.GetClassNode();
165+
var documentNode = processor.GetDocumentNode();
166+
var classNode = documentNode.GetClassNode();
168167

169-
Assert.Equal("path_with_invalid_chars", classNode.ClassName);
168+
Assert.Equal("path_with_invalid_chars", classNode.Name);
170169
}
171170

172171
[Fact]
@@ -181,11 +180,11 @@ public void MvcViewDocumentClassifierPass_SetsUpExecuteAsyncMethod()
181180
processor.ExecutePass<MvcViewDocumentClassifierPass>();
182181

183182
// Assert
184-
var documentnode = processor.GetDocumentNode();
185-
var methodNode = documentnode.GetMethodNode();
183+
var documentNode = processor.GetDocumentNode();
184+
var methodNode = documentNode.GetMethodNode();
186185

187-
Assert.Equal("ExecuteAsync", methodNode.MethodName);
186+
Assert.Equal("ExecuteAsync", methodNode.Name);
188187
Assert.Equal("global::System.Threading.Tasks.Task", methodNode.ReturnType);
189-
Assert.Equal(["public", "async", "override"], methodNode.Modifiers);
188+
Assert.Equal<string>(["public", "async", "override"], methodNode.Modifiers);
190189
}
191190
}

src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/AssemblyAttributeInjectionPassTest.cs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void Execute_NoOps_IfNamespaceNodeHasEmptyContent()
3535
var builder = IntermediateNodeBuilder.Create(documentNode);
3636
var @namespace = new NamespaceDeclarationIntermediateNode()
3737
{
38-
Content = string.Empty,
38+
Name = string.Empty,
3939
IsPrimaryNamespace = true,
4040
};
4141

@@ -57,7 +57,7 @@ public void Execute_NoOps_IfClassNameNodeIsMissing()
5757
var documentNode = new DocumentIntermediateNode() { Options = codeDocument.CodeGenerationOptions };
5858

5959
var builder = IntermediateNodeBuilder.Create(documentNode);
60-
var @namespace = new NamespaceDeclarationIntermediateNode() { Content = "SomeNamespace" };
60+
var @namespace = new NamespaceDeclarationIntermediateNode() { Name = "SomeNamespace" };
6161
builder.Push(@namespace);
6262

6363
// Act
@@ -79,7 +79,7 @@ public void Execute_NoOps_IfClassNameIsEmpty()
7979

8080
var @namespace = new NamespaceDeclarationIntermediateNode()
8181
{
82-
Content = "SomeNamespace",
82+
Name = "SomeNamespace",
8383
IsPrimaryNamespace = true,
8484
};
8585

@@ -110,12 +110,12 @@ public void Execute_NoOps_IfDocumentIsNotViewOrPage()
110110
};
111111

112112
var builder = IntermediateNodeBuilder.Create(documentNode);
113-
var @namespace = new NamespaceDeclarationIntermediateNode() { Content = "SomeNamespace" };
113+
var @namespace = new NamespaceDeclarationIntermediateNode() { Name = "SomeNamespace" };
114114
builder.Push(@namespace);
115115

116116
var @class = new ClassDeclarationIntermediateNode
117117
{
118-
ClassName = "SomeName",
118+
Name = "SomeName",
119119
IsPrimaryClass = true,
120120
};
121121

@@ -145,15 +145,15 @@ public void Execute_NoOps_ForDesignTime()
145145
var builder = IntermediateNodeBuilder.Create(documentNode);
146146
var @namespace = new NamespaceDeclarationIntermediateNode
147147
{
148-
Content = "SomeNamespace",
148+
Name = "SomeNamespace",
149149
IsPrimaryNamespace = true,
150150
};
151151

152152
builder.Push(@namespace);
153153

154154
var @class = new ClassDeclarationIntermediateNode
155155
{
156-
ClassName = "SomeName",
156+
Name = "SomeName",
157157
IsPrimaryClass = true,
158158
};
159159

@@ -186,14 +186,14 @@ public void Execute_AddsRazorViewAttribute_ToViews()
186186

187187
var @namespace = new NamespaceDeclarationIntermediateNode
188188
{
189-
Content = "SomeNamespace",
189+
Name = "SomeNamespace",
190190
IsPrimaryNamespace = true,
191191
};
192192

193193
builder.Push(@namespace);
194194
var @class = new ClassDeclarationIntermediateNode
195195
{
196-
ClassName = "SomeName",
196+
Name = "SomeName",
197197
IsPrimaryClass = true,
198198
};
199199

@@ -232,15 +232,15 @@ public void Execute_EscapesViewPathWhenAddingAttributeToViews()
232232

233233
var @namespace = new NamespaceDeclarationIntermediateNode
234234
{
235-
Content = "SomeNamespace",
235+
Name = "SomeNamespace",
236236
IsPrimaryNamespace = true,
237237
};
238238

239239
builder.Push(@namespace);
240240

241241
var @class = new ClassDeclarationIntermediateNode
242242
{
243-
ClassName = "SomeName",
243+
Name = "SomeName",
244244
IsPrimaryClass = true,
245245
};
246246

@@ -286,15 +286,15 @@ public void Execute_AddsRazorPagettribute_ToPage()
286286

287287
var @namespace = new NamespaceDeclarationIntermediateNode
288288
{
289-
Content = "SomeNamespace",
289+
Name = "SomeNamespace",
290290
IsPrimaryNamespace = true,
291291
};
292292

293293
builder.Push(@namespace);
294294

295295
var @class = new ClassDeclarationIntermediateNode
296296
{
297-
ClassName = "SomeName",
297+
Name = "SomeName",
298298
IsPrimaryClass = true,
299299
};
300300

@@ -334,14 +334,14 @@ public void Execute_EscapesViewPathAndRouteWhenAddingAttributeToPage()
334334

335335
var @namespace = new NamespaceDeclarationIntermediateNode
336336
{
337-
Content = "SomeNamespace",
337+
Name = "SomeNamespace",
338338
IsPrimaryNamespace = true,
339339
};
340340
builder.Push(@namespace);
341341

342342
var @class = new ClassDeclarationIntermediateNode
343343
{
344-
ClassName = "SomeName",
344+
Name = "SomeName",
345345
IsPrimaryClass = true,
346346
};
347347

src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/ModelDirectiveTest.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ @model Type1
8686
var classNode = documentNode.GetClassNode();
8787
var baseType = classNode.BaseType;
8888

89+
Assert.NotNull(baseType);
8990
Assert.Equal("BaseType", baseType.BaseType.Content);
9091
Assert.NotNull(baseType.BaseType.Source);
9192

@@ -114,6 +115,7 @@ @model Type2
114115
var classNode = documentNode.GetClassNode();
115116
var baseType = classNode.BaseType;
116117

118+
Assert.NotNull(baseType);
117119
Assert.Equal("BaseType", baseType.BaseType.Content);
118120
Assert.NotNull(baseType.BaseType.Source);
119121

@@ -141,6 +143,7 @@ @model Type1
141143
var classNode = documentNode.GetClassNode();
142144
var baseType = classNode.BaseType;
143145

146+
Assert.NotNull(baseType);
144147
Assert.Equal("BaseType", baseType.BaseType.Content);
145148
Assert.NotNull(baseType.BaseType.Source);
146149

@@ -166,6 +169,7 @@ @inherits BaseType<TModel>
166169
var classNode = documentNode.GetClassNode();
167170
var baseType = classNode.BaseType;
168171

172+
Assert.NotNull(baseType);
169173
Assert.Equal("BaseType", baseType.BaseType.Content);
170174
Assert.NotNull(baseType.BaseType.Source);
171175

@@ -193,6 +197,7 @@ @inherits BaseType<TModel>
193197
var classNode = documentNode.GetClassNode();
194198
var baseType = classNode.BaseType;
195199

200+
Assert.NotNull(baseType);
196201
Assert.Equal("BaseType", baseType.BaseType.Content);
197202
Assert.Null(baseType.BaseType.Source);
198203

@@ -224,6 +229,7 @@ @model SomeType
224229
var classNode = documentNode.GetClassNode();
225230
var baseType = classNode.BaseType;
226231

232+
Assert.NotNull(baseType);
227233
Assert.Equal("BaseType", baseType.BaseType.Content);
228234
Assert.Null(baseType.BaseType.Source);
229235

0 commit comments

Comments
 (0)