@@ -981,6 +981,8 @@ private void ParseSingleLineMarkup(in SyntaxListBuilder<RazorSyntaxNode> builder
981
981
982
982
private void ParseTagBlock ( in SyntaxListBuilder < RazorSyntaxNode > builder , Stack < Tuple < SyntaxToken , SourceLocation > > tags )
983
983
{
984
+ // TODO: This is really ugly and needs to be cleaned up.
985
+
984
986
// Skip Whitespace and Text
985
987
var completeTag = false ;
986
988
var blockAlreadyBuilt = false ;
@@ -991,22 +993,23 @@ private void ParseTagBlock(in SyntaxListBuilder<RazorSyntaxNode> builder, Stack<
991
993
// Output everything prior to the OpenAngle into a markup span
992
994
builder . Add ( OutputTokensAsMarkupLiteral ( ) ) ;
993
995
994
- // Do not want to start a new tag block if we're at the end of the file.
995
996
var tagBuilder = builder ;
996
- IDisposable disposableTagBuilder = null ;
997
+ IDisposable tagBuilderDisposable = null ;
997
998
try
998
999
{
999
1000
if ( EndOfFile )
1000
1001
{
1002
+ // Do not want to start a new tag block if we're at the end of the file.
1001
1003
EndTagBlock ( builder , tags , complete : true ) ;
1002
1004
}
1003
1005
else
1004
1006
{
1005
- if ( ! AtSpecialTag )
1007
+ var atSpecialTag = AtSpecialTag ;
1008
+ if ( ! atSpecialTag )
1006
1009
{
1007
1010
// Start a tag block. This is used to wrap things like <p> or <a class="btn"> etc.
1008
1011
var pooledResult = Pool . Allocate < RazorSyntaxNode > ( ) ;
1009
- disposableTagBuilder = pooledResult ;
1012
+ tagBuilderDisposable = pooledResult ;
1010
1013
tagBuilder = pooledResult . Builder ;
1011
1014
}
1012
1015
_bufferedOpenAngle = null ;
@@ -1019,10 +1022,11 @@ private void ParseTagBlock(in SyntaxListBuilder<RazorSyntaxNode> builder, Stack<
1019
1022
AcceptToken ( _bufferedOpenAngle ) ;
1020
1023
EndTagBlock ( tagBuilder , tags , complete : false ) ;
1021
1024
}
1022
- else if ( AtSpecialTag && At ( SyntaxKind . Bang ) )
1025
+ else if ( atSpecialTag && At ( SyntaxKind . Bang ) )
1023
1026
{
1024
1027
AcceptToken ( _bufferedOpenAngle ) ;
1025
1028
completeTag = ParseBangTag ( builder ) ;
1029
+ blockAlreadyBuilt = completeTag ;
1026
1030
}
1027
1031
else
1028
1032
{
@@ -1043,8 +1047,9 @@ private void ParseTagBlock(in SyntaxListBuilder<RazorSyntaxNode> builder, Stack<
1043
1047
// Output the contents of the tag into its own markup span.
1044
1048
builder . Add ( OutputTokensAsMarkupLiteral ( ) ) ;
1045
1049
}
1046
- else
1050
+ else if ( tagBuilderDisposable != null )
1047
1051
{
1052
+ // A new tag block was started. Build it.
1048
1053
// Output the contents of the tag into its own markup span.
1049
1054
tagBuilder . Add ( OutputTokensAsMarkupLiteral ( ) ) ;
1050
1055
var tagBlock = SyntaxFactory . MarkupTagBlock ( tagBuilder . ToList ( ) ) ;
@@ -1054,10 +1059,10 @@ private void ParseTagBlock(in SyntaxListBuilder<RazorSyntaxNode> builder, Stack<
1054
1059
finally
1055
1060
{
1056
1061
// Will be null if we were at end of file or special tag when initially created.
1057
- if ( disposableTagBuilder != null )
1062
+ if ( tagBuilderDisposable != null )
1058
1063
{
1059
1064
// End tag block
1060
- disposableTagBuilder . Dispose ( ) ;
1065
+ tagBuilderDisposable . Dispose ( ) ;
1061
1066
}
1062
1067
}
1063
1068
}
@@ -1083,7 +1088,10 @@ private Tuple<bool, bool> ParseAfterTagStart(
1083
1088
case SyntaxKind . QuestionMark :
1084
1089
// XML PI
1085
1090
AcceptToken ( _bufferedOpenAngle ) ;
1086
- return Tuple . Create ( TryParseXmlPI ( builder ) , blockAlreadyBuilt ) ;
1091
+ var complete = TryParseXmlPI ( builder ) ;
1092
+ // No block is created for Xml PI. So return the same value as complete.
1093
+ blockAlreadyBuilt = complete ;
1094
+ return Tuple . Create ( complete , blockAlreadyBuilt ) ;
1087
1095
default :
1088
1096
// Start Tag
1089
1097
return ParseStartTag ( builder , parentBuilder , tags ) ;
@@ -1489,7 +1497,7 @@ private void EndTagBlock(
1489
1497
var shouldAcceptWhitespaceAndNewLine = true ;
1490
1498
1491
1499
// Check if the previous span was a transition.
1492
- var previousSpan = GetLastSpan ( builder [ builder . Count - 1 ] ) ;
1500
+ var previousSpan = builder . Count > 0 ? GetLastSpan ( builder [ builder . Count - 1 ] ) : null ;
1493
1501
if ( previousSpan != null && previousSpan . Kind == SyntaxKind . MarkupTransition )
1494
1502
{
1495
1503
var tokens = ReadWhile (
@@ -1710,6 +1718,7 @@ private Syntax.GreenNode GetLastSpan(RazorSyntaxNode node)
1710
1718
return null ;
1711
1719
}
1712
1720
1721
+ // Find the last token of this node and return its immediate non-list parent.
1713
1722
var red = node . CreateRed ( ) ;
1714
1723
var last = red . GetLastTerminal ( ) ;
1715
1724
if ( last == null )
0 commit comments