diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddTagHelperChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddTagHelperChunkGenerator.cs
index 8c9d98633b..0345a706a8 100644
--- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddTagHelperChunkGenerator.cs
+++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddTagHelperChunkGenerator.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text;
using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
@@ -63,5 +64,28 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
return combiner.CombinedHash;
}
+
+ public override string ToString()
+ {
+ var builder = new StringBuilder("AddTagHelper:{");
+ builder.Append(LookupText);
+ builder.Append(";");
+ builder.Append(DirectiveText);
+ builder.Append(";");
+ builder.Append(TypePattern);
+ builder.Append(";");
+ builder.Append(AssemblyName);
+ builder.Append("}");
+
+ if (Diagnostics.Count > 0)
+ {
+ builder.Append(" [");
+ var ids = string.Join(", ", Diagnostics.Select(diagnostic => diagnostic.Id));
+ builder.Append(ids);
+ builder.Append("]");
+ }
+
+ return builder.ToString();
+ }
}
}
diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveChunkGenerator.cs
index c584de9cc8..b07399f032 100644
--- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveChunkGenerator.cs
+++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveChunkGenerator.cs
@@ -60,8 +60,12 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
// This is used primarily at test time to show an identifiable representation of the chunk generator.
- var builder = new StringBuilder("Directive {");
+ var builder = new StringBuilder("Directive:{");
builder.Append(Descriptor.Directive);
+ builder.Append(";");
+ builder.Append(Descriptor.Kind);
+ builder.Append(";");
+ builder.Append(Descriptor.Usage);
builder.Append("}");
if (Diagnostics.Count > 0)
diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveTokenChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveTokenChunkGenerator.cs
index b7b2c9fe84..69327ba6e2 100644
--- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveTokenChunkGenerator.cs
+++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveTokenChunkGenerator.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
+using System.Text;
using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
@@ -15,7 +16,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
Descriptor = tokenDescriptor;
}
- public DirectiveTokenDescriptor Descriptor { get; set; }
+ public DirectiveTokenDescriptor Descriptor { get; }
public override void Accept(ParserVisitor visitor, Span span)
{
@@ -37,5 +38,18 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
return combiner.CombinedHash;
}
+
+ public override string ToString()
+ {
+ var builder = new StringBuilder("DirectiveToken {");
+ builder.Append(Descriptor.Name);
+ builder.Append(";");
+ builder.Append(Descriptor.Kind);
+ builder.Append(";Opt:");
+ builder.Append(Descriptor.Optional);
+ builder.Append("}");
+
+ return builder.ToString();
+ }
}
}
diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorCommentChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorCommentChunkGenerator.cs
index fdf6a6f1e4..4d3d13f0b0 100644
--- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorCommentChunkGenerator.cs
+++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorCommentChunkGenerator.cs
@@ -9,5 +9,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
visitor.VisitCommentBlock(this, block);
}
+
+ public override string ToString()
+ {
+ return "RazorComment";
+ }
}
}
diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RemoveTagHelperChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/RemoveTagHelperChunkGenerator.cs
index 09328bb69c..914d4d15ee 100644
--- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RemoveTagHelperChunkGenerator.cs
+++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/RemoveTagHelperChunkGenerator.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text;
using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
@@ -63,5 +64,28 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
return combiner.CombinedHash;
}
+
+ public override string ToString()
+ {
+ var builder = new StringBuilder("RemoveTagHelper:{");
+ builder.Append(LookupText);
+ builder.Append(";");
+ builder.Append(DirectiveText);
+ builder.Append(";");
+ builder.Append(TypePattern);
+ builder.Append(";");
+ builder.Append(AssemblyName);
+ builder.Append("}");
+
+ if (Diagnostics.Count > 0)
+ {
+ builder.Append(" [");
+ var ids = string.Join(", ", Diagnostics.Select(diagnostic => diagnostic.Id));
+ builder.Append(ids);
+ builder.Append("]");
+ }
+
+ return builder.ToString();
+ }
}
}
\ No newline at end of file
diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperChunkGenerator.cs
index 29a828f386..8f278edb2c 100644
--- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperChunkGenerator.cs
+++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperChunkGenerator.cs
@@ -73,5 +73,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
visitor.VisitTagHelperBlock(this, block);
}
+
+ public override string ToString()
+ {
+ return "TagHelper";
+ }
}
}
\ No newline at end of file
diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs
index bed1cadcc7..b116c5c3b3 100644
--- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs
+++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text;
using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
@@ -48,5 +49,24 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
return combiner.CombinedHash;
}
+
+ public override string ToString()
+ {
+ var builder = new StringBuilder("TagHelperPrefix:{");
+ builder.Append(Prefix);
+ builder.Append(";");
+ builder.Append(DirectiveText);
+ builder.Append("}");
+
+ if (Diagnostics.Count > 0)
+ {
+ builder.Append(" [");
+ var ids = string.Join(", ", Diagnostics.Select(diagnostic => diagnostic.Id));
+ builder.Append(ids);
+ builder.Append("]");
+ }
+
+ return builder.ToString();
+ }
}
}
\ No newline at end of file
diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TemplateBlockChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TemplateBlockChunkGenerator.cs
index 68212bf1b2..02940c1c31 100644
--- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TemplateBlockChunkGenerator.cs
+++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TemplateBlockChunkGenerator.cs
@@ -19,5 +19,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
//context.ChunkTreeBuilder.EndParentChunk();
}
+
+ public override string ToString()
+ {
+ return "Template";
+ }
}
}
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpAutoCompleteTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpAutoCompleteTest.cs
index 0ea7e057cc..4264b5a66a 100644
--- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpAutoCompleteTest.cs
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpAutoCompleteTest.cs
@@ -10,136 +10,49 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
public class CSharpAutoCompleteTest : CsHtmlCodeParserTestBase
{
+ public CSharpAutoCompleteTest()
+ {
+ UseBaselineTests = true;
+ }
+
[Fact]
public void FunctionsDirectiveAutoCompleteAtEOF()
{
- // Arrange
- var chunkGenerator = new DirectiveChunkGenerator(FunctionsDirective.Directive);
- chunkGenerator.Diagnostics.Add(
- RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
- new SourceSpan(new SourceLocation(10, 0, 10), contentLength: 1), FunctionsDirective.Directive.Directive, "}", "{"));
-
- // Act & Assert
- ParseBlockTest(
- "@functions{",
- new[] { FunctionsDirective.Directive },
- new DirectiveBlock(chunkGenerator,
- Factory.CodeTransition(),
- Factory.MetaCode("functions").Accepts(AcceptedCharactersInternal.None),
- Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharactersInternal.None),
- Factory.EmptyCSharp().AsCodeBlock()));
+ // Arrange, Act & Assert
+ ParseBlockTest("@functions{", new[] { FunctionsDirective.Directive });
}
[Fact]
public void SectionDirectiveAutoCompleteAtEOF()
{
- // Arrange
- var chunkGenerator = new DirectiveChunkGenerator(SectionDirective.Directive);
- chunkGenerator.Diagnostics.Add(
- RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
- new SourceSpan(new SourceLocation(16, 0, 16), contentLength: 1), "section", "}", "{"));
-
- // Act & Assert
- ParseBlockTest(
- "@section Header {",
- new[] { SectionDirective.Directive },
- new DirectiveBlock(chunkGenerator,
- Factory.CodeTransition(),
- Factory.MetaCode("section").Accepts(AcceptedCharactersInternal.None),
- Factory.Span(SpanKindInternal.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharactersInternal.WhiteSpace),
- Factory.Span(SpanKindInternal.Code, "Header", CSharpSymbolType.Identifier)
- .AsDirectiveToken(SectionDirective.Directive.Tokens.First()),
- Factory.Span(SpanKindInternal.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharactersInternal.AllWhiteSpace),
- Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharactersInternal.None),
- new MarkupBlock(
- Factory.EmptyHtml())));
+ // Arrange, Act & Assert
+ ParseBlockTest("@section Header {", new[] { SectionDirective.Directive });
}
[Fact]
public void VerbatimBlockAutoCompleteAtEOF()
{
- ParseBlockTest("@{",
- new StatementBlock(
- Factory.CodeTransition(),
- Factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
- Factory.EmptyCSharp()
- .AsStatement()
- .With(new AutoCompleteEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString) { AutoCompleteString = "}" })
- ),
- RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
- new SourceSpan(new SourceLocation(1, 0, 1), contentLength: 1), Resources.BlockName_Code, "}", "{"));
+ ParseBlockTest("@{");
}
[Fact]
public void FunctionsDirectiveAutoCompleteAtStartOfFile()
{
- // Arrange
- var chunkGenerator = new DirectiveChunkGenerator(FunctionsDirective.Directive);
- chunkGenerator.Diagnostics.Add(
- RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
- new SourceSpan(new SourceLocation(10, 0, 10), contentLength: 1), "functions", "}", "{"));
-
- // Act & Assert
- ParseBlockTest(
- "@functions{" + Environment.NewLine + "foo",
- new[] { FunctionsDirective.Directive },
- new DirectiveBlock(chunkGenerator,
- Factory.CodeTransition(),
- Factory.MetaCode("functions").Accepts(AcceptedCharactersInternal.None),
- Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharactersInternal.None),
- Factory.Code(Environment.NewLine + "foo").AsCodeBlock()));
+ // Arrange, Act & Assert
+ ParseBlockTest("@functions{" + Environment.NewLine + "foo", new[] { FunctionsDirective.Directive });
}
[Fact]
public void SectionDirectiveAutoCompleteAtStartOfFile()
{
- // Arrange
- var chunkGenerator = new DirectiveChunkGenerator(SectionDirective.Directive);
- chunkGenerator.Diagnostics.Add(
- RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
- new SourceSpan(new SourceLocation(16, 0, 16), contentLength: 1), "section", "}", "{"));
-
- // Act & Assert
- ParseBlockTest(
- "@section Header {" + Environment.NewLine + "
Foo
",
- new[] { SectionDirective.Directive },
- new DirectiveBlock(chunkGenerator,
- Factory.CodeTransition(),
- Factory.MetaCode("section").Accepts(AcceptedCharactersInternal.None),
- Factory.Span(SpanKindInternal.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharactersInternal.WhiteSpace),
- Factory.Span(SpanKindInternal.Code, "Header", CSharpSymbolType.Identifier).AsDirectiveToken(SectionDirective.Directive.Tokens.First()),
- Factory.Span(SpanKindInternal.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharactersInternal.AllWhiteSpace),
- Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharactersInternal.None),
- new MarkupBlock(
- Factory.Markup(Environment.NewLine),
- new MarkupTagBlock(
- Factory.Markup("")),
- Factory.Markup("Foo"),
- new MarkupTagBlock(
- Factory.Markup("
")))));
+ // Arrange, Act & Assert
+ ParseBlockTest("@section Header {" + Environment.NewLine + "Foo
", new[] { SectionDirective.Directive });
}
[Fact]
public void VerbatimBlockAutoCompleteAtStartOfFile()
{
- ParseBlockTest(
- "@{" + Environment.NewLine + "",
- new StatementBlock(
- Factory.CodeTransition(),
- Factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
- Factory.Code(Environment.NewLine)
- .AsStatement()
- .With(new AutoCompleteEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString) { AutoCompleteString = "}" }),
- new MarkupBlock(
- new MarkupTagBlock(
- Factory.Markup("").Accepts(AcceptedCharactersInternal.None)),
- new MarkupTagBlock(
- Factory.Markup("
").Accepts(AcceptedCharactersInternal.None))),
- Factory.Span(SpanKindInternal.Code, new CSharpSymbol(string.Empty, CSharpSymbolType.Unknown))
- .With(new StatementChunkGenerator())
- ),
- RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
- new SourceSpan(new SourceLocation(1, 0, 1), contentLength: 1), Resources.BlockName_Code, "}", "{"));
+ ParseBlockTest("@{" + Environment.NewLine + "");
}
}
}
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtEOF.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtEOF.syntaxtree.txt
new file mode 100644
index 0000000000..a4353cf354
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtEOF.syntaxtree.txt
@@ -0,0 +1,9 @@
+Directive block - Gen - 11 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ MetaCode span - Gen - [functions] - SpanEditHandler;Accepts:None - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[functions];
+ MetaCode span - Gen - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (10:0,10) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [] - CodeBlockEditHandler;Accepts:Any;CodeBlock - (11:0,11) - Symbols:1
+ CSharpSymbolType.Unknown;[];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtStartOfFile.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtStartOfFile.syntaxtree.txt
new file mode 100644
index 0000000000..7a268f583d
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtStartOfFile.syntaxtree.txt
@@ -0,0 +1,10 @@
+Directive block - Gen - 16 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ MetaCode span - Gen - [functions] - SpanEditHandler;Accepts:None - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[functions];
+ MetaCode span - Gen - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (10:0,10) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [LFfoo] - CodeBlockEditHandler;Accepts:Any;CodeBlock - (11:0,11) - Symbols:2
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Identifier;[foo];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtEOF.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtEOF.syntaxtree.txt
new file mode 100644
index 0000000000..c9a6364f31
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtEOF.syntaxtree.txt
@@ -0,0 +1,16 @@
+Directive block - Gen - 17 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ MetaCode span - Gen - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[section];
+ Code span - Gen - [ ] - SpanEditHandler;Accepts:WhiteSpace - (8:0,8) - Symbols:1
+ CSharpSymbolType.WhiteSpace;[ ];
+ Code span - Gen - [Header] - DirectiveTokenEditHandler;Accepts:NonWhiteSpace - (9:0,9) - Symbols:1
+ CSharpSymbolType.Identifier;[Header];
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:AllWhiteSpace - (15:0,15) - Symbols:1
+ CSharpSymbolType.WhiteSpace;[ ];
+ MetaCode span - Gen - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (16:0,16) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Markup block - Gen - 0 - (17:0,17)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:Any - (17:0,17) - Symbols:1
+ HtmlSymbolType.Unknown;[];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtStartOfFile.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtStartOfFile.syntaxtree.txt
new file mode 100644
index 0000000000..b117855d2b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtStartOfFile.syntaxtree.txt
@@ -0,0 +1,29 @@
+Directive block - Gen - 29 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ MetaCode span - Gen - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[section];
+ Code span - Gen - [ ] - SpanEditHandler;Accepts:WhiteSpace - (8:0,8) - Symbols:1
+ CSharpSymbolType.WhiteSpace;[ ];
+ Code span - Gen - [Header] - DirectiveTokenEditHandler;Accepts:NonWhiteSpace - (9:0,9) - Symbols:1
+ CSharpSymbolType.Identifier;[Header];
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:AllWhiteSpace - (15:0,15) - Symbols:1
+ CSharpSymbolType.WhiteSpace;[ ];
+ MetaCode span - Gen - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (16:0,16) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Markup block - Gen - 12 - (17:0,17)
+ Markup span - Gen - [LF] - SpanEditHandler;Accepts:Any - (17:0,17) - Symbols:1
+ HtmlSymbolType.NewLine;[LF];
+ Tag block - Gen - 3 - (19:1,0)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:Any - (19:1,0) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo] - SpanEditHandler;Accepts:Any - (22:1,3) - Symbols:1
+ HtmlSymbolType.Text;[Foo];
+ Tag block - Gen - 4 - (25:1,6)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:Any - (25:1,6) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtEOF.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtEOF.diagnostics.txt
new file mode 100644
index 0000000000..1ced8c1b88
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtEOF.diagnostics.txt
@@ -0,0 +1 @@
+(1,2): Error RZ1006: The code block is missing a closing "}" character. Make sure you have a matching "}" character for all the "{" characters within this block, and that none of the "}" characters are being interpreted as markup.
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtEOF.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtEOF.syntaxtree.txt
new file mode 100644
index 0000000000..7637638d62
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtEOF.syntaxtree.txt
@@ -0,0 +1,7 @@
+Statement block - Gen - 2 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (2:0,2) - Symbols:1
+ CSharpSymbolType.Unknown;[];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtStartOfFile.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtStartOfFile.diagnostics.txt
new file mode 100644
index 0000000000..1ced8c1b88
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtStartOfFile.diagnostics.txt
@@ -0,0 +1 @@
+(1,2): Error RZ1006: The code block is missing a closing "}" character. Make sure you have a matching "}" character for all the "{" characters within this block, and that none of the "}" characters are being interpreted as markup.
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtStartOfFile.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtStartOfFile.syntaxtree.txt
new file mode 100644
index 0000000000..8066a192b7
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtStartOfFile.syntaxtree.txt
@@ -0,0 +1,21 @@
+Statement block - Gen - 11 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (2:0,2) - Symbols:1
+ CSharpSymbolType.NewLine;[LF];
+ Markup block - Gen - 7 - (4:1,0)
+ Tag block - Gen - 3 - (4:1,0)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (4:1,0) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Tag block - Gen - 4 - (7:1,3)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (7:1,3) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [] - SpanEditHandler;Accepts:Any - (11:1,7) - Symbols:1
+ CSharpSymbolType.Unknown;[];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionAcceptsTrailingNewlineInDesignTimeMode.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionAcceptsTrailingNewlineInDesignTimeMode.syntaxtree.txt
index 5ee8b370e0..9302c75396 100644
--- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionAcceptsTrailingNewlineInDesignTimeMode.syntaxtree.txt
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionAcceptsTrailingNewlineInDesignTimeMode.syntaxtree.txt
@@ -1,8 +1,15 @@
-Statement block - NullParentChunkGenerator - 9 - (0:0,0)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - { - (0:0,0)
- Code span - StatementChunkGenerator - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - - (1:0,1)
- Expression block - ExpressionChunkGenerator - 5 - (1:0,1)
- Transition span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - @ - (1:0,1)
- Code span - ExpressionChunkGenerator - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - foo. - (2:0,2)
- Code span - StatementChunkGenerator - SpanEditHandler;Accepts:Any - LF - (6:0,6)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - } - (8:1,0)
+Statement block - Gen - 9 - (0:0,0)
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (1:0,1) - Symbols:1
+ CSharpSymbolType.Unknown;[];
+ Expression block - Gen - 5 - (1:0,1)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (1:0,1) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - (2:0,2) - Symbols:2
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ Code span - Gen - [LF] - SpanEditHandler;Accepts:Any - (6:0,6) - Symbols:1
+ CSharpSymbolType.NewLine;[LF];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (8:1,0) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionDoesNotAcceptDotAfterAt.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionDoesNotAcceptDotAfterAt.syntaxtree.txt
index d0857f86f0..bec3b503d0 100644
--- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionDoesNotAcceptDotAfterAt.syntaxtree.txt
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionDoesNotAcceptDotAfterAt.syntaxtree.txt
@@ -1,8 +1,14 @@
-Statement block - NullParentChunkGenerator - 4 - (0:0,0)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - { - (0:0,0)
- Code span - StatementChunkGenerator - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - - (1:0,1)
- Expression block - ExpressionChunkGenerator - 1 - (1:0,1)
- Transition span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - @ - (1:0,1)
- Code span - ExpressionChunkGenerator - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - - (2:0,2)
- Code span - StatementChunkGenerator - SpanEditHandler;Accepts:Any - . - (2:0,2)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - } - (3:0,3)
+Statement block - Gen - 4 - (0:0,0)
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (1:0,1) - Symbols:1
+ CSharpSymbolType.Unknown;[];
+ Expression block - Gen - 1 - (1:0,1)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (1:0,1) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - (2:0,2) - Symbols:1
+ CSharpSymbolType.Unknown;[];
+ Code span - Gen - [.] - SpanEditHandler;Accepts:Any - (2:0,2) - Symbols:1
+ CSharpSymbolType.Dot;[.];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (3:0,3) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionDoesNotAcceptTrailingNewlineInRunTimeMode.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionDoesNotAcceptTrailingNewlineInRunTimeMode.syntaxtree.txt
index 5ee8b370e0..9302c75396 100644
--- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionDoesNotAcceptTrailingNewlineInRunTimeMode.syntaxtree.txt
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionDoesNotAcceptTrailingNewlineInRunTimeMode.syntaxtree.txt
@@ -1,8 +1,15 @@
-Statement block - NullParentChunkGenerator - 9 - (0:0,0)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - { - (0:0,0)
- Code span - StatementChunkGenerator - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - - (1:0,1)
- Expression block - ExpressionChunkGenerator - 5 - (1:0,1)
- Transition span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - @ - (1:0,1)
- Code span - ExpressionChunkGenerator - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - foo. - (2:0,2)
- Code span - StatementChunkGenerator - SpanEditHandler;Accepts:Any - LF - (6:0,6)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - } - (8:1,0)
+Statement block - Gen - 9 - (0:0,0)
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (1:0,1) - Symbols:1
+ CSharpSymbolType.Unknown;[];
+ Expression block - Gen - 5 - (1:0,1)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (1:0,1) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - (2:0,2) - Symbols:2
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ Code span - Gen - [LF] - SpanEditHandler;Accepts:Any - (6:0,6) - Symbols:1
+ CSharpSymbolType.NewLine;[LF];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (8:1,0) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionWithOnlySingleAtAcceptsSingleSpaceOrNewlineAtDesignTime.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionWithOnlySingleAtAcceptsSingleSpaceOrNewlineAtDesignTime.syntaxtree.txt
index 74caffc857..26eab9de90 100644
--- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionWithOnlySingleAtAcceptsSingleSpaceOrNewlineAtDesignTime.syntaxtree.txt
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionWithOnlySingleAtAcceptsSingleSpaceOrNewlineAtDesignTime.syntaxtree.txt
@@ -1,8 +1,15 @@
-Statement block - NullParentChunkGenerator - 11 - (0:0,0)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - { - (0:0,0)
- Code span - StatementChunkGenerator - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - LF - (1:0,1)
- Expression block - ExpressionChunkGenerator - 1 - (7:1,4)
- Transition span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - @ - (7:1,4)
- Code span - ExpressionChunkGenerator - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - - (8:1,5)
- Code span - StatementChunkGenerator - SpanEditHandler;Accepts:Any - LF - (8:1,5)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - } - (10:2,0)
+Statement block - Gen - 11 - (0:0,0)
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [LF ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (1:0,1) - Symbols:2
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Expression block - Gen - 1 - (7:1,4)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (7:1,4) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - (8:1,5) - Symbols:1
+ CSharpSymbolType.Unknown;[];
+ Code span - Gen - [LF] - SpanEditHandler;Accepts:Any - (8:1,5) - Symbols:1
+ CSharpSymbolType.NewLine;[LF];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (10:2,0) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionWithOnlySingleAtOutputsZeroLengthCodeSpan.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionWithOnlySingleAtOutputsZeroLengthCodeSpan.syntaxtree.txt
index dcc86f7429..f4ca85113e 100644
--- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionWithOnlySingleAtOutputsZeroLengthCodeSpan.syntaxtree.txt
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExpressionWithOnlySingleAtOutputsZeroLengthCodeSpan.syntaxtree.txt
@@ -1,8 +1,14 @@
-Statement block - NullParentChunkGenerator - 3 - (0:0,0)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - { - (0:0,0)
- Code span - StatementChunkGenerator - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - - (1:0,1)
- Expression block - ExpressionChunkGenerator - 1 - (1:0,1)
- Transition span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - @ - (1:0,1)
- Code span - ExpressionChunkGenerator - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - - (2:0,2)
- Code span - StatementChunkGenerator - SpanEditHandler;Accepts:Any - - (2:0,2)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - } - (2:0,2)
+Statement block - Gen - 3 - (0:0,0)
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (1:0,1) - Symbols:1
+ CSharpSymbolType.Unknown;[];
+ Expression block - Gen - 1 - (1:0,1)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (1:0,1) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - (2:0,2) - Symbols:1
+ CSharpSymbolType.Unknown;[];
+ Code span - Gen - [] - SpanEditHandler;Accepts:Any - (2:0,2) - Symbols:1
+ CSharpSymbolType.Unknown;[];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (2:0,2) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/VerbatimBlock.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/VerbatimBlock.syntaxtree.txt
index fc2ac0edce..d10b13cfc1 100644
--- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/VerbatimBlock.syntaxtree.txt
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/VerbatimBlock.syntaxtree.txt
@@ -1,5 +1,14 @@
-Statement block - NullParentChunkGenerator - 11 - (0:0,0)
- Transition span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - @ - (0:0,0)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - { - (1:0,1)
- Code span - StatementChunkGenerator - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - foo(); - (2:0,2)
- MetaCode span - NullSpanChunkGenerator - SpanEditHandler;Accepts:None - } - (10:0,10)
+Statement block - Gen - 11 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [ foo(); ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (2:0,2) - Symbols:6
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (10:0,10) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs
index 4541d04e24..463b8bd486 100644
--- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs
+++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs
@@ -278,6 +278,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest(document, null, designTime, new RazorDiagnostic[0]);
}
+ internal virtual void ParseBlockTest(string document, IEnumerable directives)
+ {
+ ParseBlockTest(document, directives, null);
+ }
+
internal virtual void ParseBlockTest(string document, params RazorDiagnostic[] expectedErrors)
{
ParseBlockTest(document, false, expectedErrors);
diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeWriter.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeWriter.cs
index d6698e40c2..290d79c459 100644
--- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeWriter.cs
+++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeWriter.cs
@@ -2,7 +2,9 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
+using System.Collections.Generic;
using System.IO;
+using System.Linq;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
@@ -52,12 +54,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
public override void VisitAttributeBlock(AttributeBlockChunkGenerator chunkGenerator, Block block)
{
WriteBlock(block);
- WriteSeparator();
- Write(chunkGenerator.Name);
- WriteSeparator();
- WriteLocationTaggedString(chunkGenerator.Prefix);
- WriteSeparator();
- WriteLocationTaggedString(chunkGenerator.Suffix);
}
public override void VisitCommentBlock(RazorCommentChunkGenerator chunkGenerator, Block block)
@@ -68,21 +64,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
public override void VisitDirectiveBlock(DirectiveChunkGenerator chunkGenerator, Block block)
{
WriteBlock(block);
- WriteSeparator();
- Write(chunkGenerator.Descriptor.Directive);
- WriteSeparator();
- Write(chunkGenerator.Descriptor.Kind);
- WriteSeparator();
- Write(chunkGenerator.Descriptor.Usage);
}
public override void VisitDynamicAttributeBlock(DynamicAttributeBlockChunkGenerator chunkGenerator, Block block)
{
WriteBlock(block);
- WriteSeparator();
- WriteLocationTaggedString(chunkGenerator.Prefix);
- WriteSeparator();
- WriteSourceLocation(chunkGenerator.ValueStart);
}
public override void VisitExpressionBlock(ExpressionChunkGenerator chunkGenerator, Block block)
@@ -103,14 +89,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
public override void VisitAddTagHelperSpan(AddTagHelperChunkGenerator chunkGenerator, Span span)
{
WriteSpan(span);
- WriteSeparator();
- Write(chunkGenerator.LookupText);
- WriteSeparator();
- Write(chunkGenerator.DirectiveText);
- WriteSeparator();
- Write(chunkGenerator.TypePattern);
- WriteSeparator();
- Write(chunkGenerator.AssemblyName);
}
public override void VisitExpressionSpan(ExpressionChunkGenerator chunkGenerator, Span span)
@@ -121,39 +99,21 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
public override void VisitImportSpan(AddImportChunkGenerator chunkGenerator, Span span)
{
WriteSpan(span);
- WriteSeparator();
- Write(chunkGenerator.Namespace);
}
public override void VisitLiteralAttributeSpan(LiteralAttributeChunkGenerator chunkGenerator, Span span)
{
WriteSpan(span);
- WriteSeparator();
- WriteLocationTaggedString(chunkGenerator.Prefix);
- WriteSeparator();
- WriteLocationTaggedString(chunkGenerator.Value);
}
public override void VisitRemoveTagHelperSpan(RemoveTagHelperChunkGenerator chunkGenerator, Span span)
{
WriteSpan(span);
- WriteSeparator();
- Write(chunkGenerator.LookupText);
- WriteSeparator();
- Write(chunkGenerator.DirectiveText);
- WriteSeparator();
- Write(chunkGenerator.TypePattern);
- WriteSeparator();
- Write(chunkGenerator.AssemblyName);
}
public override void VisitTagHelperPrefixDirectiveSpan(TagHelperPrefixDirectiveChunkGenerator chunkGenerator, Span span)
{
WriteSpan(span);
- WriteSeparator();
- Write(chunkGenerator.Prefix);
- WriteSeparator();
- Write(chunkGenerator.DirectiveText);
}
public override void VisitStatementSpan(StatementChunkGenerator chunkGenerator, Span span)
@@ -164,12 +124,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
public override void VisitDirectiveToken(DirectiveTokenChunkGenerator chunkGenerator, Span span)
{
WriteSpan(span);
- WriteSeparator();
- Write(chunkGenerator.Descriptor.Kind);
- WriteSeparator();
- Write(chunkGenerator.Descriptor.Name);
- WriteSeparator();
- Write($"Optional: {chunkGenerator.Descriptor.Optional}");
}
protected void WriteBlock(Block block)
@@ -177,7 +131,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
WriteIndent();
Write($"{block.Type} block");
WriteSeparator();
- Write(block.ChunkGenerator.GetType().Name);
+ Write($"Gen<{block.ChunkGenerator}>");
WriteSeparator();
Write(block.Length);
WriteSeparator();
@@ -189,13 +143,45 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
WriteIndent();
Write($"{span.Kind} span");
WriteSeparator();
- Write(span.ChunkGenerator.GetType().Name);
+ Write($"Gen<{span.ChunkGenerator}>");
+ WriteSeparator();
+ Write($"[{span.Content}]");
WriteSeparator();
Write(span.EditHandler);
WriteSeparator();
- Write(span.Content);
- WriteSeparator();
WriteSourceLocation(span.Start);
+ WriteSeparator();
+ Write($"Symbols:{span.Symbols.Count}");
+
+ // Write symbols
+ Depth++;
+ foreach (var symbol in span.Symbols)
+ {
+ WriteNewLine();
+ WriteIndent();
+ WriteSymbol(symbol);
+ }
+ Depth--;
+ }
+
+ protected void WriteSymbol(ISymbol symbol)
+ {
+ var symbolType = string.Empty;
+ IEnumerable diagnostics = RazorDiagnostic.EmptyArray;
+
+ if (symbol is HtmlSymbol htmlSymbol)
+ {
+ symbolType = $"{htmlSymbol.Type.GetType().Name}.{htmlSymbol.Type}";
+ diagnostics = htmlSymbol.Errors;
+ }
+ else if (symbol is CSharpSymbol csharpSymbol)
+ {
+ symbolType = $"{csharpSymbol.Type.GetType().Name}.{csharpSymbol.Type}";
+ diagnostics = csharpSymbol.Errors;
+ }
+
+ var symbolString = $"{symbolType};[{symbol.Content}];{string.Join(",", diagnostics.Select(diagnostic => diagnostic.Id))}";
+ Write(symbolString);
}
protected void WriteSourceLocation(SourceLocation location)