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;
root = rewriter.Rewrite(root, errorSink);
// Temporary code while we're still using legacy diagnostics in the SyntaxTree.
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()));

View File

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

View File

@ -74,7 +74,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
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);
}

View File

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

View File

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

View File

@ -6,40 +6,41 @@ using System.Collections.Generic;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
/// <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>
internal class ErrorSink
{
private readonly List<RazorError> _errors;
private readonly List<RazorDiagnostic> _errors;
/// <summary>
/// Instantiates a new instance of <see cref="ErrorSink"/>.
/// </summary>
public ErrorSink()
{
_errors = new List<RazorError>();
_errors = new List<RazorDiagnostic>();
}
/// <summary>
/// <see cref="RazorError"/>s collected.
/// <see cref="RazorDiagnostic"/>s collected.
/// </summary>
public IReadOnlyList<RazorError> Errors => _errors;
public IReadOnlyList<RazorDiagnostic> Errors => _errors;
/// <summary>
/// Tracks the given <paramref name="error"/>.
/// </summary>
/// <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>
/// Creates and tracks a new <see cref="RazorError"/>.
/// Creates and tracks a new <see cref="RazorDiagnostic"/>.
/// </summary>
/// <param name="location"><see cref="SourceLocation"/> of the error.</param>
/// <param name="message">A message describing 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)
{
var error = new RazorError(message, location, length);
var error = RazorDiagnostic.Create(new RazorError(message, location, length));
_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);
}

View File

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

View File

@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
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);
}

View File

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

View File

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

View File

@ -21,11 +21,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
Source = source;
Buffer = new StringBuilder();
CurrentErrors = new List<RazorError>();
CurrentErrors = new List<RazorDiagnostic>();
StartSymbol();
}
protected List<RazorError> CurrentErrors { get; }
protected List<RazorDiagnostic> CurrentErrors { get; }
protected abstract int StartState { get; }
@ -64,7 +64,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
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();
@ -205,7 +205,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
if (HaveContent)
{
// 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++)
{
errors[i] = CurrentErrors[i];

View File

@ -8,6 +8,7 @@ namespace Microsoft.AspNetCore.Razor.Language
{
public abstract class RazorDiagnostic : IEquatable<RazorDiagnostic>, IFormattable
{
internal static readonly RazorDiagnostic[] EmptyArray = new RazorDiagnostic[0];
internal static readonly object[] EmptyArgs = new object[0];
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 allErrors = syntaxTree.Diagnostics.Concat(errorSink.Errors.Select(error => RazorDiagnostic.Create(error)));
var allErrors = syntaxTree.Diagnostics.Concat(errorSink.Errors);
var actualErrors = allErrors
.OrderBy(error => error.Span.AbsoluteIndex)
.ToList();

View File

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

View File

@ -60,7 +60,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
markupParser.ParseDocument();
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);
@ -90,7 +90,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
parser.ParseBlock();
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);
}
@ -120,7 +120,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
parser.ParseBlock();
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);
}