@@ -128,9 +128,9 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, Cancellation
128
128
documentNode . Diagnostics . Add ( diagnostic ) ;
129
129
}
130
130
131
- if ( imports is { IsDefault : false } importsArray )
131
+ if ( ! imports . IsDefaultOrEmpty )
132
132
{
133
- foreach ( var import in importsArray )
133
+ foreach ( var import in imports )
134
134
{
135
135
foreach ( var diagnostic in import . Diagnostics )
136
136
{
@@ -492,38 +492,30 @@ public override void VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax no
492
492
return node . GetSourceSpan ( SourceDocument ) ;
493
493
}
494
494
495
- protected static SyntaxList < SyntaxToken > MergeLiterals (
496
- SyntaxList < SyntaxToken > ? literal1 ,
497
- SyntaxList < SyntaxToken > ? literal2 ,
498
- SyntaxList < SyntaxToken > ? literal3 = null ,
499
- SyntaxList < SyntaxToken > ? literal4 = null ,
500
- SyntaxList < SyntaxToken > ? literal5 = null )
495
+ protected static SyntaxList < SyntaxToken > MergeTokenLists ( params ReadOnlySpan < SyntaxList < SyntaxToken > ? > tokenLists )
501
496
{
502
- using var _ = SyntaxListBuilderPool . GetPooledBuilder < SyntaxToken > ( out var builder ) ;
497
+ var count = 0 ;
503
498
504
- if ( literal1 is { } tokens1 )
499
+ foreach ( var tokenList in tokenLists )
505
500
{
506
- builder . AddRange ( tokens1 ) ;
501
+ count += tokenList ? . Count ?? 0 ;
507
502
}
508
503
509
- if ( literal2 is { } tokens2 )
504
+ if ( count == 0 )
510
505
{
511
- builder . AddRange ( tokens2 ) ;
506
+ return default ;
512
507
}
513
508
514
- if ( literal3 is { } tokens3 )
515
- {
516
- builder . AddRange ( tokens3 ) ;
517
- }
509
+ using var builder = new PooledArrayBuilder < SyntaxToken > ( count ) ;
518
510
519
- if ( literal4 is { } tokens4 )
511
+ foreach ( var tokenList in tokenLists )
520
512
{
521
- builder . AddRange ( tokens4 ) ;
522
- }
513
+ if ( tokenList == null )
514
+ {
515
+ continue ;
516
+ }
523
517
524
- if ( literal5 is { } tokens5 )
525
- {
526
- builder . AddRange ( tokens5 ) ;
518
+ builder . AddRange ( tokenList . GetValueOrDefault ( ) ) ;
527
519
}
528
520
529
521
return builder . ToList ( ) ;
@@ -574,7 +566,10 @@ public bool TryCast<TNode>(out ImmutableArray<TNode> result)
574
566
575
567
protected static MarkupTextLiteralSyntax MergeAttributeValue ( MarkupLiteralAttributeValueSyntax node )
576
568
{
577
- var valueTokens = MergeLiterals ( node . Prefix ? . LiteralTokens , node . Value ? . LiteralTokens ) ;
569
+ var valueTokens = MergeTokenLists (
570
+ node . Prefix ? . LiteralTokens ,
571
+ node . Value ? . LiteralTokens ) ;
572
+
578
573
var rewritten = node . Prefix ? . Update ( valueTokens , node . Prefix . ChunkGenerator ) ?? node . Value ? . Update ( valueTokens , node . Value . ChunkGenerator ) ;
579
574
rewritten = ( MarkupTextLiteralSyntax ) rewritten ? . Green . CreateRed ( node , node . Position ) ;
580
575
@@ -606,12 +601,13 @@ public LegacyFileKindVisitor(DocumentIntermediateNode document, IntermediateNode
606
601
// Suffix="
607
602
public override void VisitMarkupAttributeBlock ( MarkupAttributeBlockSyntax node )
608
603
{
609
- var prefixTokens = MergeLiterals (
604
+ var prefixTokens = MergeTokenLists (
610
605
node . NamePrefix ? . LiteralTokens ,
611
606
node . Name . LiteralTokens ,
612
607
node . NameSuffix ? . LiteralTokens ,
613
- node . EqualsToken != null ? new SyntaxList < SyntaxToken > ( node . EqualsToken ) : default ,
608
+ new SyntaxList < SyntaxToken > ( node . EqualsToken ) ,
614
609
node . ValuePrefix ? . LiteralTokens ) ;
610
+
615
611
var prefix = ( MarkupTextLiteralSyntax ) SyntaxFactory . MarkupTextLiteral ( prefixTokens , chunkGenerator : null ) . Green . CreateRed ( node , node . NamePrefix ? . Position ?? node . Name . Position ) ;
616
612
617
613
var name = node . Name . GetContent ( ) ;
@@ -629,7 +625,7 @@ public override void VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
629
625
630
626
if ( children . TryCast < MarkupLiteralAttributeValueSyntax > ( out var attributeLiteralArray ) )
631
627
{
632
- using var _ = SyntaxListBuilderPool . GetPooledBuilder < SyntaxToken > ( out var builder ) ;
628
+ using var builder = new PooledArrayBuilder < SyntaxToken > ( ) ;
633
629
634
630
foreach ( var literal in attributeLiteralArray )
635
631
{
@@ -639,7 +635,11 @@ public override void VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
639
635
640
636
var rewritten = SyntaxFactory . MarkupTextLiteral ( builder . ToList ( ) , chunkGenerator : null ) ;
641
637
642
- var mergedLiterals = MergeLiterals ( prefix ? . LiteralTokens , rewritten . LiteralTokens , node . ValueSuffix ? . LiteralTokens ) ;
638
+ var mergedLiterals = MergeTokenLists (
639
+ prefix ? . LiteralTokens ,
640
+ rewritten . LiteralTokens ,
641
+ node . ValueSuffix ? . LiteralTokens ) ;
642
+
643
643
var mergedAttribute = SyntaxFactory . MarkupTextLiteral ( mergedLiterals , chunkGenerator : null ) . Green . CreateRed ( node . Parent , node . Position ) ;
644
644
Visit ( mergedAttribute ) ;
645
645
@@ -675,9 +675,10 @@ public override void VisitMarkupMinimizedAttributeBlock(MarkupMinimizedAttribute
675
675
}
676
676
677
677
// Minimized attributes are just html content.
678
- var literals = MergeLiterals (
678
+ var literals = MergeTokenLists (
679
679
node . NamePrefix ? . LiteralTokens ,
680
680
node . Name ? . LiteralTokens ) ;
681
+
681
682
var literal = SyntaxFactory . MarkupTextLiteral ( literals , chunkGenerator : null ) . Green . CreateRed ( node . Parent , node . Position ) ;
682
683
683
684
Visit ( literal ) ;
@@ -1188,7 +1189,7 @@ private void VisitAttributeValue(SyntaxNode node)
1188
1189
1189
1190
if ( children . TryCast < MarkupLiteralAttributeValueSyntax > ( out var attributeLiteralArray ) )
1190
1191
{
1191
- using var _ = SyntaxListBuilderPool . GetPooledBuilder < SyntaxToken > ( out var builder ) ;
1192
+ using PooledArrayBuilder < SyntaxToken > builder = [ ] ;
1192
1193
1193
1194
foreach ( var literal in attributeLiteralArray )
1194
1195
{
@@ -1201,7 +1202,7 @@ private void VisitAttributeValue(SyntaxNode node)
1201
1202
}
1202
1203
else if ( children . TryCast < MarkupTextLiteralSyntax > ( out var markupLiteralArray ) )
1203
1204
{
1204
- using var _ = SyntaxListBuilderPool . GetPooledBuilder < SyntaxToken > ( out var builder ) ;
1205
+ using PooledArrayBuilder < SyntaxToken > builder = [ ] ;
1205
1206
1206
1207
foreach ( var literal in markupLiteralArray )
1207
1208
{
@@ -1213,7 +1214,7 @@ private void VisitAttributeValue(SyntaxNode node)
1213
1214
}
1214
1215
else if ( children . TryCast < CSharpExpressionLiteralSyntax > ( out var expressionLiteralArray ) )
1215
1216
{
1216
- using var _ = SyntaxListBuilderPool . GetPooledBuilder < SyntaxToken > ( out var builder ) ;
1217
+ using PooledArrayBuilder < SyntaxToken > builder = [ ] ;
1217
1218
1218
1219
SpanEditHandler editHandler = null ;
1219
1220
ISpanChunkGenerator generator = null ;
@@ -1244,16 +1245,16 @@ private void Combine(HtmlContentIntermediateNode node, SyntaxNode item)
1244
1245
Source = BuildSourceSpanFromNode ( item ) ,
1245
1246
} ) ;
1246
1247
1247
- if ( node . Source != null )
1248
+ if ( node . Source is SourceSpan source )
1248
1249
{
1249
1250
node . Source = new SourceSpan (
1250
- node . Source . Value . FilePath ,
1251
- node . Source . Value . AbsoluteIndex ,
1252
- node . Source . Value . LineIndex ,
1253
- node . Source . Value . CharacterIndex ,
1254
- node . Source . Value . Length + item . Width ,
1255
- node . Source . Value . LineCount ,
1256
- node . Source . Value . EndCharacterIndex ) ;
1251
+ source . FilePath ,
1252
+ source . AbsoluteIndex ,
1253
+ source . LineIndex ,
1254
+ source . CharacterIndex ,
1255
+ source . Length + item . Width ,
1256
+ source . LineCount ,
1257
+ source . EndCharacterIndex ) ;
1257
1258
}
1258
1259
}
1259
1260
}
@@ -1298,8 +1299,8 @@ public override void VisitMarkupElement(MarkupElementSyntax node)
1298
1299
if ( node . StartTag != null && node . EndTag != null && node . StartTag . IsVoidElement ( ) )
1299
1300
{
1300
1301
element . Diagnostics . Add (
1301
- ComponentDiagnosticFactory . Create_UnexpectedClosingTagForVoidElement (
1302
- BuildSourceSpanFromNode ( node . EndTag ) , node . EndTag . GetTagNameWithOptionalBang ( ) ) ) ;
1302
+ ComponentDiagnosticFactory . Create_UnexpectedClosingTagForVoidElement (
1303
+ BuildSourceSpanFromNode ( node . EndTag ) , node . EndTag . GetTagNameWithOptionalBang ( ) ) ) ;
1303
1304
}
1304
1305
else if ( node . StartTag != null && node . EndTag == null && ! node . StartTag . IsVoidElement ( ) && ! node . StartTag . IsSelfClosing ( ) )
1305
1306
{
@@ -1388,12 +1389,13 @@ public override void VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
1388
1389
// building Prefix and Suffix, even though we don't really use them. If we
1389
1390
// end up using another node type in the future this can be simplified quite
1390
1391
// a lot.
1391
- var prefixTokens = MergeLiterals (
1392
+ var prefixTokens = MergeTokenLists (
1392
1393
node . NamePrefix ? . LiteralTokens ,
1393
1394
node . Name . LiteralTokens ,
1394
1395
node . NameSuffix ? . LiteralTokens ,
1395
- node . EqualsToken == null ? new SyntaxList < SyntaxToken > ( ) : new SyntaxList < SyntaxToken > ( node . EqualsToken ) ,
1396
+ new SyntaxList < SyntaxToken > ( node . EqualsToken ) ,
1396
1397
node . ValuePrefix ? . LiteralTokens ) ;
1398
+
1397
1399
var prefix = ( MarkupTextLiteralSyntax ) SyntaxFactory . MarkupTextLiteral ( prefixTokens , chunkGenerator : null ) . Green . CreateRed ( node , node . NamePrefix ? . Position ?? node . Name . Position ) ;
1398
1400
1399
1401
var name = node . Name . GetContent ( ) ;
@@ -1412,7 +1414,10 @@ public override void VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
1412
1414
1413
1415
public override void VisitMarkupMinimizedAttributeBlock ( MarkupMinimizedAttributeBlockSyntax node )
1414
1416
{
1415
- var prefixTokens = MergeLiterals ( node . NamePrefix ? . LiteralTokens , node . Name . LiteralTokens ) ;
1417
+ var prefixTokens = MergeTokenLists (
1418
+ node . NamePrefix ? . LiteralTokens ,
1419
+ node . Name . LiteralTokens ) ;
1420
+
1416
1421
var prefix = ( MarkupTextLiteralSyntax ) SyntaxFactory . MarkupTextLiteral ( prefixTokens , chunkGenerator : null ) . Green . CreateRed ( node , node . NamePrefix ? . Position ?? node . Name . Position ) ;
1417
1422
1418
1423
var name = node . Name . GetContent ( ) ;
@@ -2158,7 +2163,7 @@ private void VisitAttributeValue(SyntaxNode node)
2158
2163
2159
2164
if ( children . TryCast < MarkupLiteralAttributeValueSyntax > ( out var attributeLiteralArray ) )
2160
2165
{
2161
- using var _ = SyntaxListBuilderPool . GetPooledBuilder < SyntaxToken > ( out var valueTokens ) ;
2166
+ using PooledArrayBuilder < SyntaxToken > valueTokens = [ ] ;
2162
2167
2163
2168
foreach ( var literal in attributeLiteralArray )
2164
2169
{
@@ -2171,7 +2176,7 @@ private void VisitAttributeValue(SyntaxNode node)
2171
2176
}
2172
2177
else if ( children . TryCast < MarkupTextLiteralSyntax > ( out var markupLiteralArray ) )
2173
2178
{
2174
- using var _ = SyntaxListBuilderPool . GetPooledBuilder < SyntaxToken > ( out var builder ) ;
2179
+ using PooledArrayBuilder < SyntaxToken > builder = [ ] ;
2175
2180
2176
2181
foreach ( var literal in markupLiteralArray )
2177
2182
{
@@ -2183,7 +2188,7 @@ private void VisitAttributeValue(SyntaxNode node)
2183
2188
}
2184
2189
else if ( children . TryCast < CSharpExpressionLiteralSyntax > ( out var expressionLiteralArray ) )
2185
2190
{
2186
- using var _ = SyntaxListBuilderPool . GetPooledBuilder < SyntaxToken > ( out var builder ) ;
2191
+ using PooledArrayBuilder < SyntaxToken > builder = [ ] ;
2187
2192
2188
2193
ISpanChunkGenerator generator = null ;
2189
2194
SpanEditHandler editHandler = null ;
@@ -2195,7 +2200,12 @@ private void VisitAttributeValue(SyntaxNode node)
2195
2200
}
2196
2201
2197
2202
var rewritten = SyntaxFactory . CSharpExpressionLiteral ( builder . ToList ( ) , generator ) . Green . CreateRed ( node . Parent , position ) ;
2198
- rewritten = editHandler != null ? rewritten . WithEditHandler ( editHandler ) : rewritten ;
2203
+
2204
+ if ( editHandler != null )
2205
+ {
2206
+ rewritten = rewritten . WithEditHandler ( editHandler ) ;
2207
+ }
2208
+
2199
2209
Visit ( rewritten ) ;
2200
2210
}
2201
2211
else
0 commit comments