Make ErrorSink and Tokenizer depend on RazorDiagnostic instead of RazorError

This commit is contained in:
Ajay Bhargav Baaskaran 2017-12-14 17:35:28 -08:00
parent 6bbd063e26
commit 085838e83a
17 changed files with 44 additions and 54 deletions

View File

@ -58,9 +58,8 @@ namespace Microsoft.AspNetCore.Razor.Language
var root = syntaxTree.Root; var root = syntaxTree.Root;
root = rewriter.Rewrite(root, errorSink); root = rewriter.Rewrite(root, errorSink);
// Temporary code while we're still using legacy diagnostics in the SyntaxTree.
var errorList = new List<RazorDiagnostic>(); var errorList = new List<RazorDiagnostic>();
errorList.AddRange(errorSink.Errors.Select(error => RazorDiagnostic.Create(error))); errorList.AddRange(errorSink.Errors);
errorList.AddRange(descriptors.SelectMany(d => d.GetAllDiagnostics())); errorList.AddRange(descriptors.SelectMany(d => d.GetAllDiagnostics()));

View File

@ -1840,8 +1840,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{ {
if (directiveErrorSink.Errors.Count > 0) if (directiveErrorSink.Errors.Count > 0)
{ {
var directiveDiagnostics = directiveErrorSink.Errors.Select(error => RazorDiagnostic.Create(error)); directiveChunkGenerator.Diagnostics.AddRange(directiveErrorSink.Errors);
directiveChunkGenerator.Diagnostics.AddRange(directiveDiagnostics);
} }
Context.ErrorSink = savedErrorSink; Context.ErrorSink = savedErrorSink;
@ -2223,17 +2222,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
} }
finally finally
{ {
List<RazorDiagnostic> directiveErrors; Span.ChunkGenerator = chunkGeneratorFactory(directiveValue, directiveErrorSink.Errors.ToList());
if (directiveErrorSink.Errors.Count > 0)
{
directiveErrors = directiveErrorSink.Errors.Select(RazorDiagnostic.Create).ToList();
}
else
{
directiveErrors = new List<RazorDiagnostic>();
}
Span.ChunkGenerator = chunkGeneratorFactory(directiveValue, directiveErrors);
Context.ErrorSink = savedErrorSink; Context.ErrorSink = savedErrorSink;
} }

View File

@ -74,7 +74,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
return new CSharpTokenizer(source); return new CSharpTokenizer(source);
} }
protected override CSharpSymbol CreateSymbol(string content, CSharpSymbolType type, IReadOnlyList<RazorError> errors) protected override CSharpSymbol CreateSymbol(string content, CSharpSymbolType type, IReadOnlyList<RazorDiagnostic> errors)
{ {
return new CSharpSymbol(content, type, errors); return new CSharpSymbol(content, type, errors);
} }

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
public CSharpSymbol( public CSharpSymbol(
string content, string content,
CSharpSymbolType type) CSharpSymbolType type)
: base(content, type, RazorError.EmptyArray) : base(content, type, RazorDiagnostic.EmptyArray)
{ {
if (content == null) if (content == null)
{ {
@ -22,7 +22,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
public CSharpSymbol( public CSharpSymbol(
string content, string content,
CSharpSymbolType type, CSharpSymbolType type,
IReadOnlyList<RazorError> errors) IReadOnlyList<RazorDiagnostic> errors)
: base(content, type, errors) : base(content, type, errors)
{ {
if (content == null) if (content == null)

View File

@ -343,7 +343,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
return base.GetSymbolContent(type); return base.GetSymbolContent(type);
} }
protected override CSharpSymbol CreateSymbol(string content, CSharpSymbolType type, IReadOnlyList<RazorError> errors) protected override CSharpSymbol CreateSymbol(string content, CSharpSymbolType type, IReadOnlyList<RazorDiagnostic> errors)
{ {
return new CSharpSymbol(content, type, errors); return new CSharpSymbol(content, type, errors);
} }
@ -547,10 +547,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
else if (EndOfFile) else if (EndOfFile)
{ {
CurrentErrors.Add( CurrentErrors.Add(
new RazorError( RazorDiagnostic.Create(
LegacyResources.ParseError_Unterminated_String_Literal, new RazorError(
CurrentStart, LegacyResources.ParseError_Unterminated_String_Literal,
length: 1 /* end of file */)); CurrentStart,
length: 1 /* end of file */)));
} }
return Transition(CSharpTokenizerState.Data, EndSymbol(CSharpSymbolType.StringLiteral)); return Transition(CSharpTokenizerState.Data, EndSymbol(CSharpSymbolType.StringLiteral));
} }
@ -576,10 +577,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
else if (EndOfFile || ParserHelpers.IsNewLine(CurrentCharacter)) else if (EndOfFile || ParserHelpers.IsNewLine(CurrentCharacter))
{ {
CurrentErrors.Add( CurrentErrors.Add(
new RazorError( RazorDiagnostic.Create(new RazorError(
LegacyResources.ParseError_Unterminated_String_Literal, LegacyResources.ParseError_Unterminated_String_Literal,
CurrentStart, CurrentStart,
length: 1 /* " */)); length: 1 /* " */)));
} }
else else
{ {
@ -595,10 +596,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
if (EndOfFile) if (EndOfFile)
{ {
CurrentErrors.Add( CurrentErrors.Add(
new RazorError( RazorDiagnostic.Create(new RazorError(
LegacyResources.ParseError_BlockComment_Not_Terminated, LegacyResources.ParseError_BlockComment_Not_Terminated,
CurrentStart, CurrentStart,
length: 1 /* end of file */)); length: 1 /* end of file */)));
return Transition(CSharpTokenizerState.Data, EndSymbol(CSharpSymbolType.Comment)); return Transition(CSharpTokenizerState.Data, EndSymbol(CSharpSymbolType.Comment));
} }
if (CurrentCharacter == '*') if (CurrentCharacter == '*')

View File

@ -6,40 +6,41 @@ using System.Collections.Generic;
namespace Microsoft.AspNetCore.Razor.Language.Legacy namespace Microsoft.AspNetCore.Razor.Language.Legacy
{ {
/// <summary> /// <summary>
/// Used to manage <see cref="RazorError"/>s encountered during the Razor parsing phase. /// Used to manage <see cref="RazorDiagnostic"/>s encountered during the Razor parsing phase.
/// </summary> /// </summary>
internal class ErrorSink internal class ErrorSink
{ {
private readonly List<RazorError> _errors; private readonly List<RazorDiagnostic> _errors;
/// <summary> /// <summary>
/// Instantiates a new instance of <see cref="ErrorSink"/>. /// Instantiates a new instance of <see cref="ErrorSink"/>.
/// </summary> /// </summary>
public ErrorSink() public ErrorSink()
{ {
_errors = new List<RazorError>(); _errors = new List<RazorDiagnostic>();
} }
/// <summary> /// <summary>
/// <see cref="RazorError"/>s collected. /// <see cref="RazorDiagnostic"/>s collected.
/// </summary> /// </summary>
public IReadOnlyList<RazorError> Errors => _errors; public IReadOnlyList<RazorDiagnostic> Errors => _errors;
/// <summary> /// <summary>
/// Tracks the given <paramref name="error"/>. /// Tracks the given <paramref name="error"/>.
/// </summary> /// </summary>
/// <param name="error">The <see cref="RazorError"/> to track.</param> /// <param name="error">The <see cref="RazorError"/> to track.</param>
public void OnError(RazorError error) =>_errors.Add(error); public void OnError(RazorDiagnostic error) =>_errors.Add(error);
/// <summary> /// <summary>
/// Creates and tracks a new <see cref="RazorError"/>. /// Creates and tracks a new <see cref="RazorDiagnostic"/>.
/// </summary> /// </summary>
/// <param name="location"><see cref="SourceLocation"/> of the error.</param> /// <param name="location"><see cref="SourceLocation"/> of the error.</param>
/// <param name="message">A message describing the error.</param> /// <param name="message">A message describing the error.</param>
/// <param name="length">The length of the error.</param> /// <param name="length">The length of the error.</param>
/// <remarks>This is temporary. It will be removed once we get rid of <see cref="LegacyRazorDiagnostic"/>.</remarks>
public void OnError(SourceLocation location, string message, int length) public void OnError(SourceLocation location, string message, int length)
{ {
var error = new RazorError(message, location, length); var error = RazorDiagnostic.Create(new RazorError(message, location, length));
_errors.Add(error); _errors.Add(error);
} }
} }

View File

@ -119,7 +119,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
} }
} }
protected override HtmlSymbol CreateSymbol(string content, HtmlSymbolType type, IReadOnlyList<RazorError> errors) protected override HtmlSymbol CreateSymbol(string content, HtmlSymbolType type, IReadOnlyList<RazorDiagnostic> errors)
{ {
return new HtmlSymbol(content, type, errors); return new HtmlSymbol(content, type, errors);
} }

View File

@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
internal class HtmlSymbol : SymbolBase<HtmlSymbolType> internal class HtmlSymbol : SymbolBase<HtmlSymbolType>
{ {
public HtmlSymbol(string content, HtmlSymbolType type) public HtmlSymbol(string content, HtmlSymbolType type)
: base(content, type, RazorError.EmptyArray) : base(content, type, RazorDiagnostic.EmptyArray)
{ {
if (content == null) if (content == null)
{ {
@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
public HtmlSymbol( public HtmlSymbol(
string content, string content,
HtmlSymbolType type, HtmlSymbolType type,
IReadOnlyList<RazorError> errors) IReadOnlyList<RazorDiagnostic> errors)
: base(content, type, errors) : base(content, type, errors)
{ {
if (content == null) if (content == null)

View File

@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
get { return HtmlSymbolType.RazorCommentStar; } get { return HtmlSymbolType.RazorCommentStar; }
} }
protected override HtmlSymbol CreateSymbol(string content, HtmlSymbolType type, IReadOnlyList<RazorError> errors) protected override HtmlSymbol CreateSymbol(string content, HtmlSymbolType type, IReadOnlyList<RazorDiagnostic> errors)
{ {
return new HtmlSymbol(content, type, errors); return new HtmlSymbol(content, type, errors);
} }

View File

@ -86,7 +86,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
public virtual Tuple<TSymbol, TSymbol> SplitSymbol(TSymbol symbol, int splitAt, TSymbolType leftType) public virtual Tuple<TSymbol, TSymbol> SplitSymbol(TSymbol symbol, int splitAt, TSymbolType leftType)
{ {
var left = CreateSymbol(symbol.Content.Substring(0, splitAt), leftType, RazorError.EmptyArray); var left = CreateSymbol(symbol.Content.Substring(0, splitAt), leftType, RazorDiagnostic.EmptyArray);
TSymbol right = null; TSymbol right = null;
if (splitAt < symbol.Content.Length) if (splitAt < symbol.Content.Length)
@ -104,6 +104,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
return type == KnownSymbolType.Unknown || !Equals(GetKnownSymbolType(type), GetKnownSymbolType(KnownSymbolType.Unknown)); return type == KnownSymbolType.Unknown || !Equals(GetKnownSymbolType(type), GetKnownSymbolType(KnownSymbolType.Unknown));
} }
protected abstract TSymbol CreateSymbol(string content, TSymbolType type, IReadOnlyList<RazorError> errors); protected abstract TSymbol CreateSymbol(string content, TSymbolType type, IReadOnlyList<RazorDiagnostic> errors);
} }
} }

View File

@ -43,8 +43,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
var root = context.Builder.Build(); var root = context.Builder.Build();
// Temporary code while we're still using legacy diagnostics in the SyntaxTree. var diagnostics = context.ErrorSink.Errors;
var diagnostics = context.ErrorSink.Errors.Select(error => RazorDiagnostic.Create(error));
return RazorSyntaxTree.Create(root, source, diagnostics, Options); return RazorSyntaxTree.Create(root, source, diagnostics, Options);
} }

View File

@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
protected SymbolBase( protected SymbolBase(
string content, string content,
TType type, TType type,
IReadOnlyList<RazorError> errors) IReadOnlyList<RazorDiagnostic> errors)
{ {
if (content == null) if (content == null)
{ {
@ -27,7 +27,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
public Span Parent { get; set; } public Span Parent { get; set; }
public IReadOnlyList<RazorError> Errors { get; } public IReadOnlyList<RazorDiagnostic> Errors { get; }
public string Content { get; } public string Content { get; }

View File

@ -21,11 +21,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
Source = source; Source = source;
Buffer = new StringBuilder(); Buffer = new StringBuilder();
CurrentErrors = new List<RazorError>(); CurrentErrors = new List<RazorDiagnostic>();
StartSymbol(); StartSymbol();
} }
protected List<RazorError> CurrentErrors { get; } protected List<RazorDiagnostic> CurrentErrors { get; }
protected abstract int StartState { get; } protected abstract int StartState { get; }
@ -64,7 +64,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
public SourceLocation CurrentStart { get; private set; } public SourceLocation CurrentStart { get; private set; }
protected abstract TSymbol CreateSymbol(string content, TSymbolType type, IReadOnlyList<RazorError> errors); protected abstract TSymbol CreateSymbol(string content, TSymbolType type, IReadOnlyList<RazorDiagnostic> errors);
protected abstract StateResult Dispatch(); protected abstract StateResult Dispatch();
@ -205,7 +205,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
if (HaveContent) if (HaveContent)
{ {
// Perf: Don't allocate a new errors array unless necessary. // Perf: Don't allocate a new errors array unless necessary.
var errors = CurrentErrors.Count == 0 ? RazorError.EmptyArray : new RazorError[CurrentErrors.Count]; var errors = CurrentErrors.Count == 0 ? RazorDiagnostic.EmptyArray : new RazorDiagnostic[CurrentErrors.Count];
for (var i = 0; i < CurrentErrors.Count; i++) for (var i = 0; i < CurrentErrors.Count; i++)
{ {
errors[i] = CurrentErrors[i]; errors[i] = CurrentErrors[i];

View File

@ -8,6 +8,7 @@ namespace Microsoft.AspNetCore.Razor.Language
{ {
public abstract class RazorDiagnostic : IEquatable<RazorDiagnostic>, IFormattable public abstract class RazorDiagnostic : IEquatable<RazorDiagnostic>, IFormattable
{ {
internal static readonly RazorDiagnostic[] EmptyArray = new RazorDiagnostic[0];
internal static readonly object[] EmptyArgs = new object[0]; internal static readonly object[] EmptyArgs = new object[0];
public abstract string Id { get; } public abstract string Id { get; }

View File

@ -63,7 +63,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
var actualTree = parseTreeRewriter.Rewrite(syntaxTree.Root, errorSink); var actualTree = parseTreeRewriter.Rewrite(syntaxTree.Root, errorSink);
var allErrors = syntaxTree.Diagnostics.Concat(errorSink.Errors.Select(error => RazorDiagnostic.Create(error))); var allErrors = syntaxTree.Diagnostics.Concat(errorSink.Errors);
var actualErrors = allErrors var actualErrors = allErrors
.OrderBy(error => error.Span.AbsoluteIndex) .OrderBy(error => error.Span.AbsoluteIndex)
.ToList(); .ToList();

View File

@ -106,7 +106,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
protected override CSharpSymbol CreateSymbol( protected override CSharpSymbol CreateSymbol(
string content, string content,
CSharpSymbolType type, CSharpSymbolType type,
IReadOnlyList<RazorError> errors) IReadOnlyList<RazorDiagnostic> errors)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -60,7 +60,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
markupParser.ParseDocument(); markupParser.ParseDocument();
var root = context.Builder.Build(); var root = context.Builder.Build();
var diagnostics = context.ErrorSink.Errors?.Select(error => RazorDiagnostic.Create(error)); var diagnostics = context.ErrorSink.Errors;
var codeDocument = RazorCodeDocument.Create(source); var codeDocument = RazorCodeDocument.Create(source);
@ -90,7 +90,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
parser.ParseBlock(); parser.ParseBlock();
var root = context.Builder.Build(); var root = context.Builder.Build();
var diagnostics = context.ErrorSink.Errors?.Select(error => RazorDiagnostic.Create(error)); var diagnostics = context.ErrorSink.Errors;
return RazorSyntaxTree.Create(root, source, diagnostics, options); return RazorSyntaxTree.Create(root, source, diagnostics, options);
} }
@ -120,7 +120,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
parser.ParseBlock(); parser.ParseBlock();
var root = context.Builder.Build(); var root = context.Builder.Build();
var diagnostics = context.ErrorSink.Errors?.Select(error => RazorDiagnostic.Create(error)); var diagnostics = context.ErrorSink.Errors;
return RazorSyntaxTree.Create(root, source, diagnostics, options); return RazorSyntaxTree.Create(root, source, diagnostics, options);
} }