Addressed code review comments.

This commit is contained in:
N. Taylor Mullen 2015-05-28 15:15:02 -07:00
parent 6df8bc23f1
commit ed92b6992d
79 changed files with 366 additions and 212 deletions

View File

@ -2,7 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNet.Razor.Chunks.Generators; using Microsoft.AspNet.Razor.Chunks.Generators;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.Parser;
#if NET45 #if NET45
@ -36,7 +36,11 @@ namespace Microsoft.AspNet.Razor
/// <summary> /// <summary>
/// Constructs a new instance of the chunk generator for this language with the specified settings /// Constructs a new instance of the chunk generator for this language with the specified settings
/// </summary> /// </summary>
public override RazorChunkGenerator CreateChunkGenerator(string className, string rootNamespaceName, string sourceFileName, RazorEngineHost host) public override RazorChunkGenerator CreateChunkGenerator(
string className,
string rootNamespaceName,
string sourceFileName,
RazorEngineHost host)
{ {
return new RazorChunkGenerator(className, rootNamespaceName, sourceFileName, host); return new RazorChunkGenerator(className, rootNamespaceName, sourceFileName, host);
} }

View File

@ -8,13 +8,13 @@ namespace Microsoft.AspNet.Razor.Chunks
{ {
public class ChunkTreeBuilder public class ChunkTreeBuilder
{ {
private readonly Stack<ParentChunk> _parentChain; private readonly Stack<ParentChunk> _parentStack;
private Chunk _lastChunk; private Chunk _lastChunk;
public ChunkTreeBuilder() public ChunkTreeBuilder()
{ {
ChunkTree = new ChunkTree(); ChunkTree = new ChunkTree();
_parentChain = new Stack<ParentChunk>(); _parentStack = new Stack<ParentChunk>();
} }
public ChunkTree ChunkTree { get; private set; } public ChunkTree ChunkTree { get; private set; }
@ -27,13 +27,13 @@ namespace Microsoft.AspNet.Razor.Chunks
chunk.Association = association; chunk.Association = association;
// If we're not in the middle of a chunk block // If we're not in the middle of a chunk block
if (_parentChain.Count == 0 || topLevel == true) if (_parentStack.Count == 0 || topLevel == true)
{ {
ChunkTree.Chunks.Add(chunk); ChunkTree.Chunks.Add(chunk);
} }
else else
{ {
_parentChain.Peek().Children.Add(chunk); _parentStack.Peek().Children.Add(chunk);
} }
} }
@ -164,14 +164,14 @@ namespace Microsoft.AspNet.Razor.Chunks
{ {
AddChunk(parentChunk, association, topLevel); AddChunk(parentChunk, association, topLevel);
_parentChain.Push(parentChunk); _parentStack.Push(parentChunk);
return parentChunk; return parentChunk;
} }
public void EndParentChunk() public void EndParentChunk()
{ {
_lastChunk = _parentChain.Pop(); _lastChunk = _parentStack.Pop();
} }
} }
} }

View File

@ -33,11 +33,11 @@ namespace Microsoft.AspNet.Razor.Chunks.Generators
public string SourceFile { get; internal set; } public string SourceFile { get; internal set; }
public string RootNamespace { get; private set; } public string RootNamespace { get; }
public string ClassName { get; private set; } public string ClassName { get; }
public RazorEngineHost Host { get; private set; } public RazorEngineHost Host { get; }
public ChunkTreeBuilder ChunkTreeBuilder { get; set; } public ChunkTreeBuilder ChunkTreeBuilder { get; set; }
} }

View File

@ -5,21 +5,21 @@ using Microsoft.AspNet.Razor.Parser.SyntaxTree;
namespace Microsoft.AspNet.Razor.Chunks.Generators namespace Microsoft.AspNet.Razor.Chunks.Generators
{ {
public class ExpressionChunkGenerator : HybridChunkGenerator public class ExpressionChunkGenerator : ISpanChunkGenerator, IParentChunkGenerator
{ {
private static readonly int TypeHashCode = typeof(ExpressionChunkGenerator).GetHashCode(); private static readonly int TypeHashCode = typeof(ExpressionChunkGenerator).GetHashCode();
public override void GenerateStartParentChunk(Block target, ChunkGeneratorContext context) public void GenerateStartParentChunk(Block target, ChunkGeneratorContext context)
{ {
context.ChunkTreeBuilder.StartParentChunk<ExpressionBlockChunk>(target); context.ChunkTreeBuilder.StartParentChunk<ExpressionBlockChunk>(target);
} }
public override void GenerateChunk(Span target, ChunkGeneratorContext context) public void GenerateChunk(Span target, ChunkGeneratorContext context)
{ {
context.ChunkTreeBuilder.AddExpressionChunk(target.Content, target); context.ChunkTreeBuilder.AddExpressionChunk(target.Content, target);
} }
public override void GenerateEndParentChunk(Block target, ChunkGeneratorContext context) public void GenerateEndParentChunk(Block target, ChunkGeneratorContext context)
{ {
context.ChunkTreeBuilder.EndParentChunk(); context.ChunkTreeBuilder.EndParentChunk();
} }

View File

@ -1,22 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNet.Razor.Parser.SyntaxTree;
namespace Microsoft.AspNet.Razor.Chunks.Generators
{
public abstract class HybridChunkGenerator : ISpanChunkGenerator, IParentChunkGenerator
{
public virtual void GenerateStartParentChunk(Block target, ChunkGeneratorContext context)
{
}
public virtual void GenerateEndParentChunk(Block target, ChunkGeneratorContext context)
{
}
public virtual void GenerateChunk(Span target, ChunkGeneratorContext context)
{
}
}
}

View File

@ -10,7 +10,9 @@ namespace Microsoft.AspNet.Razor.Chunks.Generators
{ {
public class LiteralAttributeChunkGenerator : SpanChunkGenerator public class LiteralAttributeChunkGenerator : SpanChunkGenerator
{ {
public LiteralAttributeChunkGenerator(LocationTagged<string> prefix, LocationTagged<SpanChunkGenerator> valueGenerator) public LiteralAttributeChunkGenerator(
LocationTagged<string> prefix,
LocationTagged<SpanChunkGenerator> valueGenerator)
{ {
Prefix = prefix; Prefix = prefix;
ValueGenerator = valueGenerator; ValueGenerator = valueGenerator;

View File

@ -10,7 +10,10 @@ namespace Microsoft.AspNet.Razor.Chunks.Generators
{ {
private static readonly int TypeHashCode = typeof(ParentChunkGenerator).GetHashCode(); private static readonly int TypeHashCode = typeof(ParentChunkGenerator).GetHashCode();
[SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes", Justification = "This class has no instance state")] [SuppressMessage(
"Microsoft.Security",
"CA2104:DoNotDeclareReadOnlyMutableReferenceTypes",
Justification = "This class has no instance state")]
public static readonly IParentChunkGenerator Null = new NullParentChunkGenerator(); public static readonly IParentChunkGenerator Null = new NullParentChunkGenerator();
public virtual void GenerateStartParentChunk(Block target, ChunkGeneratorContext context) public virtual void GenerateStartParentChunk(Block target, ChunkGeneratorContext context)

View File

@ -10,7 +10,10 @@ namespace Microsoft.AspNet.Razor.Chunks.Generators
{ {
private static readonly int TypeHashCode = typeof(SpanChunkGenerator).GetHashCode(); private static readonly int TypeHashCode = typeof(SpanChunkGenerator).GetHashCode();
[SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes", Justification = "This class has no instance state")] [SuppressMessage(
"Microsoft.Security",
"CA2104:DoNotDeclareReadOnlyMutableReferenceTypes",
Justification = "This class has no instance state")]
public static readonly ISpanChunkGenerator Null = new NullSpanChunkGenerator(); public static readonly ISpanChunkGenerator Null = new NullSpanChunkGenerator();
public virtual void GenerateChunk(Span target, ChunkGeneratorContext context) public virtual void GenerateChunk(Span target, ChunkGeneratorContext context)

View File

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using Microsoft.AspNet.Razor.Parser.SyntaxTree; using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Microsoft.AspNet.Razor.Parser.TagHelpers; using Microsoft.AspNet.Razor.Parser.TagHelpers;
@ -40,11 +41,9 @@ namespace Microsoft.AspNet.Razor.Chunks.Generators
{ {
var tagHelperBlock = target as TagHelperBlock; var tagHelperBlock = target as TagHelperBlock;
if (tagHelperBlock == null) Debug.Assert(
{ tagHelperBlock != null,
throw new ArgumentException( $"A {nameof(TagHelperChunkGenerator)} must only be used with {nameof(TagHelperBlock)}s.");
RazorResources.TagHelpers_TagHelperCodeGeneartorMustBeAssociatedWithATagHelperBlock);
}
var attributes = new List<KeyValuePair<string, Chunk>>(); var attributes = new List<KeyValuePair<string, Chunk>>();
@ -60,7 +59,7 @@ namespace Microsoft.AspNet.Razor.Chunks.Generators
if (attribute.Value != null) if (attribute.Value != null)
{ {
// Populates the code tree with chunks associated with attributes // Populates the chunk tree with chunks associated with attributes
attribute.Value.Accept(chunkGenerator); attribute.Value.Accept(chunkGenerator);
var chunks = chunkGenerator.Context.ChunkTreeBuilder.ChunkTree.Chunks; var chunks = chunkGenerator.Context.ChunkTreeBuilder.ChunkTree.Chunks;
@ -76,7 +75,7 @@ namespace Microsoft.AspNet.Razor.Chunks.Generators
attributes.Add(new KeyValuePair<string, Chunk>(attribute.Key, attributeChunkValue)); attributes.Add(new KeyValuePair<string, Chunk>(attribute.Key, attributeChunkValue));
// Reset the code tree builder so we can build a new one for the next attribute // Reset the chunk tree builder so we can build a new one for the next attribute
chunkGenerator.Context.ChunkTreeBuilder = new ChunkTreeBuilder(); chunkGenerator.Context.ChunkTreeBuilder = new ChunkTreeBuilder();
} }

View File

@ -5,10 +5,10 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
using Microsoft.AspNet.Razor.CodeGeneration.Visitors; using Microsoft.AspNet.Razor.CodeGenerators.Visitors;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class CSharpCodeGenerator : CodeGenerator public class CSharpCodeGenerator : CodeGenerator
{ {

View File

@ -10,7 +10,7 @@ using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Microsoft.AspNet.Razor.Text; using Microsoft.AspNet.Razor.Text;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class CSharpCodeWriter : CodeWriter public class CSharpCodeWriter : CodeWriter
{ {
@ -464,7 +464,10 @@ namespace Microsoft.AspNet.Razor.CodeGeneration
Write("\""); Write("\"");
} }
public void WriteStartInstrumentationContext(ChunkGeneratorContext context, SyntaxTreeNode syntaxNode, bool isLiteral) public void WriteStartInstrumentationContext(
ChunkGeneratorContext context,
SyntaxTreeNode syntaxNode,
bool isLiteral)
{ {
WriteStartMethodInvocation(context.Host.GeneratedClassContext.BeginContextMethodName); WriteStartMethodInvocation(context.Host.GeneratedClassContext.BeginContextMethodName);
Write(syntaxNode.Start.AbsoluteIndex.ToString(CultureInfo.InvariantCulture)); Write(syntaxNode.Start.AbsoluteIndex.ToString(CultureInfo.InvariantCulture));

View File

@ -4,7 +4,7 @@
using System; using System;
using System.Linq; using System.Linq;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public struct CSharpCodeWritingScope : IDisposable public struct CSharpCodeWritingScope : IDisposable
{ {

View File

@ -3,7 +3,7 @@
using System; using System;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public struct CSharpDisableWarningScope : IDisposable public struct CSharpDisableWarningScope : IDisposable
{ {

View File

@ -4,7 +4,7 @@
using System; using System;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class CSharpLineMappingWriter : IDisposable public class CSharpLineMappingWriter : IDisposable
{ {

View File

@ -6,7 +6,7 @@ using Microsoft.AspNet.Razor.Parser;
using Microsoft.AspNet.Razor.Parser.SyntaxTree; using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class CSharpPaddingBuilder public class CSharpPaddingBuilder
{ {

View File

@ -6,11 +6,11 @@ using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
using Microsoft.AspNet.Razor.CodeGeneration.Visitors; using Microsoft.AspNet.Razor.CodeGenerators.Visitors;
using Microsoft.AspNet.Razor.TagHelpers; using Microsoft.AspNet.Razor.TagHelpers;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
/// <summary> /// <summary>
/// Renders tag helper rendering code. /// Renders tag helper rendering code.

View File

@ -1,7 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public abstract class CodeGenerator public abstract class CodeGenerator
{ {

View File

@ -3,7 +3,7 @@
using Microsoft.AspNet.Razor.Chunks.Generators; using Microsoft.AspNet.Razor.Chunks.Generators;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
/// <summary> /// <summary>
/// Context object with information used to generate a Razor page. /// Context object with information used to generate a Razor page.
@ -26,12 +26,13 @@ namespace Microsoft.AspNet.Razor.CodeGeneration
} }
// Internal for testing. // Internal for testing.
internal CodeGeneratorContext(RazorEngineHost host, internal CodeGeneratorContext(
string className, RazorEngineHost host,
string rootNamespace, string className,
string sourceFile, string rootNamespace,
bool shouldGenerateLinePragmas, string sourceFile,
ErrorSink errorSink) bool shouldGenerateLinePragmas,
ErrorSink errorSink)
: base(host, className, rootNamespace, sourceFile, shouldGenerateLinePragmas) : base(host, className, rootNamespace, sourceFile, shouldGenerateLinePragmas)
{ {
ErrorSink = errorSink; ErrorSink = errorSink;

View File

@ -3,7 +3,7 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class CodeGeneratorResult public class CodeGeneratorResult
{ {

View File

@ -4,7 +4,7 @@
using System; using System;
using System.IO; using System.IO;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class CodeWriter : IDisposable public class CodeWriter : IDisposable
{ {

View File

@ -1,7 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public enum ExpressionRenderingMode public enum ExpressionRenderingMode
{ {

View File

@ -6,7 +6,7 @@ using System.Diagnostics.CodeAnalysis;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
using Microsoft.Internal.Web.Utils; using Microsoft.Internal.Web.Utils;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public struct GeneratedClassContext public struct GeneratedClassContext
{ {

View File

@ -1,7 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
/// <summary> /// <summary>
/// Contains necessary information for the tag helper code generation process. /// Contains necessary information for the tag helper code generation process.

View File

@ -3,12 +3,11 @@
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
using Microsoft.AspNet.Razor.CodeGeneration;
using Microsoft.AspNet.Razor.Parser.SyntaxTree; using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Microsoft.AspNet.Razor.TagHelpers; using Microsoft.AspNet.Razor.TagHelpers;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
/// <summary> /// <summary>
/// The results of parsing and generating code for a Razor document. /// The results of parsing and generating code for a Razor document.

View File

@ -4,7 +4,7 @@
using System.Globalization; using System.Globalization;
using Microsoft.Internal.Web.Utils; using Microsoft.Internal.Web.Utils;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class LineMapping public class LineMapping
{ {

View File

@ -3,7 +3,7 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class LineMappingManager public class LineMappingManager
{ {

View File

@ -4,7 +4,7 @@
using System.Globalization; using System.Globalization;
using Microsoft.Internal.Web.Utils; using Microsoft.Internal.Web.Utils;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class MappingLocation public class MappingLocation
{ {

View File

@ -5,7 +5,7 @@ using System;
using Microsoft.AspNet.Razor.TagHelpers; using Microsoft.AspNet.Razor.TagHelpers;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
/// <summary> /// <summary>
/// Renders code for tag helper property initialization. /// Renders code for tag helper property initialization.
@ -20,8 +20,8 @@ namespace Microsoft.AspNet.Razor.CodeGeneration
/// The <see cref="TagHelperAttributeDescriptor"/> to generate code for. /// The <see cref="TagHelperAttributeDescriptor"/> to generate code for.
/// </param> /// </param>
/// <param name="writer">The <see cref="CSharpCodeWriter"/> that's used to write code.</param> /// <param name="writer">The <see cref="CSharpCodeWriter"/> that's used to write code.</param>
/// <param name="context">A <see cref="Chunks.Generators.ChunkGeneratorContext"/> instance that contains information about /// <param name="context">A <see cref="Chunks.Generators.ChunkGeneratorContext"/> instance that contains
/// the current code generation process.</param> /// information about the current code generation process.</param>
/// <param name="renderAttributeValue"> /// <param name="renderAttributeValue">
/// <see cref="Action"/> that renders the raw value of the HTML attribute. /// <see cref="Action"/> that renders the raw value of the HTML attribute.
/// </param> /// </param>

View File

@ -4,7 +4,7 @@
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
{ {
public class CSharpBaseTypeVisitor : CodeVisitor<CSharpCodeWriter> public class CSharpBaseTypeVisitor : CodeVisitor<CSharpCodeWriter>
{ {

View File

@ -7,7 +7,7 @@ using Microsoft.AspNet.Razor.Chunks;
using Microsoft.AspNet.Razor.Parser.SyntaxTree; using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
{ {
public class CSharpCodeVisitor : CodeVisitor<CSharpCodeWriter> public class CSharpCodeVisitor : CodeVisitor<CSharpCodeWriter>
{ {

View File

@ -6,7 +6,7 @@ using System.Globalization;
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
{ {
public class CSharpDesignTimeHelpersVisitor : CodeVisitor<CSharpCodeWriter> public class CSharpDesignTimeHelpersVisitor : CodeVisitor<CSharpCodeWriter>
{ {

View File

@ -6,7 +6,7 @@ using Microsoft.AspNet.Razor.Parser;
using Microsoft.AspNet.Razor.Parser.SyntaxTree; using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
{ {
/// <summary> /// <summary>
/// <see cref="CodeVisitor{CSharpCodeWriter}"/> that writes code for a non-<see langword="string"/> tag helper /// <see cref="CodeVisitor{CSharpCodeWriter}"/> that writes code for a non-<see langword="string"/> tag helper
@ -98,7 +98,7 @@ namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors
/// <param name="chunk">The <see cref="ResolveUrlChunk"/> to render.</param> /// <param name="chunk">The <see cref="ResolveUrlChunk"/> to render.</param>
/// <remarks> /// <remarks>
/// Allowed to support future C# extensions. Likely "~/..." will lead to a C# compilation error but that is up /// Allowed to support future C# extensions. Likely "~/..." will lead to a C# compilation error but that is up
/// to the . /// to the compiler.
/// </remarks> /// </remarks>
protected override void Visit(ResolveUrlChunk chunk) protected override void Visit(ResolveUrlChunk chunk)
{ {

View File

@ -6,7 +6,7 @@ using System.Collections.Generic;
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
{ {
public class CSharpTagHelperFieldDeclarationVisitor : CodeVisitor<CSharpCodeWriter> public class CSharpTagHelperFieldDeclarationVisitor : CodeVisitor<CSharpCodeWriter>
{ {

View File

@ -4,7 +4,7 @@
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
{ {
/// <summary> /// <summary>
/// The <see cref="CodeVisitor{T}"/> that generates the code to initialize the TagHelperRunner. /// The <see cref="CodeVisitor{T}"/> that generates the code to initialize the TagHelperRunner.

View File

@ -4,7 +4,7 @@
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
{ {
public class CSharpTypeMemberVisitor : CodeVisitor<CSharpCodeWriter> public class CSharpTypeMemberVisitor : CodeVisitor<CSharpCodeWriter>
{ {

View File

@ -7,7 +7,7 @@ using Microsoft.AspNet.Razor.Chunks;
using Microsoft.AspNet.Razor.Parser.SyntaxTree; using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
{ {
public class CSharpUsingVisitor : CodeVisitor<CSharpCodeWriter> public class CSharpUsingVisitor : CodeVisitor<CSharpCodeWriter>
{ {

View File

@ -5,7 +5,7 @@ using System.Collections.Generic;
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
{ {
public abstract class ChunkVisitor<TWriter> : IChunkVisitor public abstract class ChunkVisitor<TWriter> : IChunkVisitor
where TWriter : CodeWriter where TWriter : CodeWriter

View File

@ -4,7 +4,7 @@
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
{ {
public class CodeVisitor<TWriter> : ChunkVisitor<TWriter> public class CodeVisitor<TWriter> : ChunkVisitor<TWriter>
where TWriter : CodeWriter where TWriter : CodeWriter

View File

@ -4,7 +4,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
namespace Microsoft.AspNet.Razor.CodeGeneration.Visitors namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
{ {
public interface IChunkVisitor public interface IChunkVisitor
{ {

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Text; using Microsoft.AspNet.Razor.Text;
namespace Microsoft.AspNet.Razor namespace Microsoft.AspNet.Razor

View File

@ -9,6 +9,7 @@ using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Parser.SyntaxTree; using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Microsoft.AspNet.Razor.Text; using Microsoft.AspNet.Razor.Text;
using Microsoft.AspNet.Razor.Utils; using Microsoft.AspNet.Razor.Utils;

View File

@ -222,7 +222,9 @@ namespace Microsoft.AspNet.Razor.Parser
protected void InheritsDirectiveCore() protected void InheritsDirectiveCore()
{ {
BaseTypeDirective(RazorResources.ParseError_InheritsKeyword_Must_Be_Followed_By_TypeName, baseType => new SetBaseTypeChunkGenerator(baseType)); BaseTypeDirective(
RazorResources.ParseError_InheritsKeyword_Must_Be_Followed_By_TypeName,
baseType => new SetBaseTypeChunkGenerator(baseType));
} }
protected void BaseTypeDirective(string noTypeNameError, Func<string, SpanChunkGenerator> createChunkGenerator) protected void BaseTypeDirective(string noTypeNameError, Func<string, SpanChunkGenerator> createChunkGenerator)

View File

@ -334,7 +334,10 @@ namespace Microsoft.AspNet.Razor.Parser
using (PushSpanConfig(span => using (PushSpanConfig(span =>
{ {
span.EditHandler = new ImplicitExpressionEditHandler(Language.TokenizeString, Keywords, acceptTrailingDot: IsNested); span.EditHandler = new ImplicitExpressionEditHandler(
Language.TokenizeString,
Keywords,
acceptTrailingDot: IsNested);
span.EditHandler.AcceptedCharacters = acceptedCharacters; span.EditHandler.AcceptedCharacters = acceptedCharacters;
span.ChunkGenerator = new ExpressionChunkGenerator(); span.ChunkGenerator = new ExpressionChunkGenerator();
})) }))

View File

@ -635,17 +635,20 @@ namespace Microsoft.AspNet.Razor.Parser
Accept(prefix); Accept(prefix);
// Literal value // Literal value
// 'quote' should be "Unknown" if not quoted and symbols coming from the tokenizer should never have "Unknown" type. // 'quote' should be "Unknown" if not quoted and symbols coming from the tokenizer should never have
// "Unknown" type.
var value = ReadWhile(sym => var value = ReadWhile(sym =>
// These three conditions find separators which break the attribute value into portions // These three conditions find separators which break the attribute value into portions
sym.Type != HtmlSymbolType.WhiteSpace && sym.Type != HtmlSymbolType.WhiteSpace &&
sym.Type != HtmlSymbolType.NewLine && sym.Type != HtmlSymbolType.NewLine &&
sym.Type != HtmlSymbolType.Transition && sym.Type != HtmlSymbolType.Transition &&
// This condition checks for the end of the attribute value (it repeats some of the checks above // This condition checks for the end of the attribute value (it repeats some of the checks above
// but for now that's ok) // but for now that's ok)
!IsEndOfAttributeValue(quote, sym)); !IsEndOfAttributeValue(quote, sym));
Accept(value); Accept(value);
Span.ChunkGenerator = new LiteralAttributeChunkGenerator(prefix.GetContent(prefixStart), value.GetContent(prefixStart)); Span.ChunkGenerator = new LiteralAttributeChunkGenerator(
prefix.GetContent(prefixStart),
value.GetContent(prefixStart));
} }
Output(SpanKind.Markup); Output(SpanKind.Markup);
} }

View File

@ -45,7 +45,11 @@ namespace Microsoft.AspNet.Razor.Parser.SyntaxTree
Children = contents; Children = contents;
} }
[SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods", Justification = "Type is the most appropriate name for this property and there is little chance of confusion with GetType")] [SuppressMessage(
"Microsoft.Naming",
"CA1721:PropertyNamesShouldNotMatchGetMethods",
Justification = "Type is the most appropriate name for this property and there is little chance of " +
"confusion with GetType")]
public BlockType Type { get; } public BlockType Type { get; }
public IEnumerable<SyntaxTreeNode> Children { get; } public IEnumerable<SyntaxTreeNode> Children { get; }
@ -105,7 +109,13 @@ namespace Microsoft.AspNet.Razor.Parser.SyntaxTree
public override string ToString() public override string ToString()
{ {
return string.Format(CultureInfo.CurrentCulture, "{0} Block at {1}::{2} (Gen:{3})", Type, Start, Length, ChunkGenerator); return string.Format(
CultureInfo.CurrentCulture,
"{0} Block at {1}::{2} (Gen:{3})",
Type,
Start,
Length,
ChunkGenerator);
} }
public override bool Equals(object obj) public override bool Equals(object obj)

View File

@ -21,7 +21,11 @@ namespace Microsoft.AspNet.Razor.Parser.SyntaxTree
ChunkGenerator = original.ChunkGenerator; ChunkGenerator = original.ChunkGenerator;
} }
[SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods", Justification = "Type is the most appropriate name for this property and there is little chance of confusion with GetType")] [SuppressMessage(
"Microsoft.Naming",
"CA1721:PropertyNamesShouldNotMatchGetMethods",
Justification = "Type is the most appropriate name for this property and there is little chance of " +
"confusion with GetType")]
public BlockType? Type { get; set; } public BlockType? Type { get; set; }
public IList<SyntaxTreeNode> Children { get; private set; } public IList<SyntaxTreeNode> Children { get; private set; }
public IParentChunkGenerator ChunkGenerator { get; set; } public IParentChunkGenerator ChunkGenerator { get; set; }

View File

@ -4,7 +4,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNet.Razor.Chunks.Generators; using Microsoft.AspNet.Razor.Chunks.Generators;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.Parser;
namespace Microsoft.AspNet.Razor namespace Microsoft.AspNet.Razor
@ -14,7 +14,8 @@ namespace Microsoft.AspNet.Razor
/// </summary> /// </summary>
public abstract class RazorCodeLanguage public abstract class RazorCodeLanguage
{ {
private static IDictionary<string, RazorCodeLanguage> _services = new Dictionary<string, RazorCodeLanguage>(StringComparer.OrdinalIgnoreCase) private static IDictionary<string, RazorCodeLanguage> _services =
new Dictionary<string, RazorCodeLanguage>(StringComparer.OrdinalIgnoreCase)
{ {
{ "cshtml", new CSharpRazorCodeLanguage() } { "cshtml", new CSharpRazorCodeLanguage() }
}; };
@ -52,7 +53,11 @@ namespace Microsoft.AspNet.Razor
/// <summary> /// <summary>
/// Constructs the chunk generator. Must return a new instance on EVERY call to ensure thread-safety /// Constructs the chunk generator. Must return a new instance on EVERY call to ensure thread-safety
/// </summary> /// </summary>
public abstract RazorChunkGenerator CreateChunkGenerator(string className, string rootNamespaceName, string sourceFileName, RazorEngineHost host); public abstract RazorChunkGenerator CreateChunkGenerator(
string className,
string rootNamespaceName,
string sourceFileName,
RazorEngineHost host);
public abstract CodeGenerator CreateCodeGenerator(CodeGeneratorContext chunkGeneratorContext); public abstract CodeGenerator CreateCodeGenerator(CodeGeneratorContext chunkGeneratorContext);
} }

View File

@ -5,7 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNet.Razor.Chunks.Generators; using Microsoft.AspNet.Razor.Chunks.Generators;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.Parser;
using Microsoft.AspNet.Razor.TagHelpers; using Microsoft.AspNet.Razor.TagHelpers;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
@ -36,7 +36,10 @@ namespace Microsoft.AspNet.Razor
private int _tabSize = 4; private int _tabSize = 4;
[SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors", Justification = "The code path is safe, it is a property setter and not dependent on other state")] [SuppressMessage(
"Microsoft.Usage",
"CA2214:DoNotCallOverridableMethodsInConstructors",
Justification = "The code path is safe, it is a property setter and not dependent on other state")]
protected RazorEngineHost() protected RazorEngineHost()
{ {
GeneratedClassContext = GeneratedClassContext.Default; GeneratedClassContext = GeneratedClassContext.Default;

View File

@ -375,9 +375,6 @@ Instead, wrap the contents of the block in "{{}}":
<data name="TagHelpers_CannotHaveCSharpInTagDeclaration" xml:space="preserve"> <data name="TagHelpers_CannotHaveCSharpInTagDeclaration" xml:space="preserve">
<value>The tag helper '{0}' must not have C# in the element's attribute declaration area.</value> <value>The tag helper '{0}' must not have C# in the element's attribute declaration area.</value>
</data> </data>
<data name="TagHelpers_TagHelperCodeGeneartorMustBeAssociatedWithATagHelperBlock" xml:space="preserve">
<value>A TagHelperChunkGenerator must only be used with TagHelperBlocks.</value>
</data>
<data name="ParseError_DirectiveMustHaveValue" xml:space="preserve"> <data name="ParseError_DirectiveMustHaveValue" xml:space="preserve">
<value>Directive '{0}' must have a value.</value> <value>Directive '{0}' must have a value.</value>
</data> </data>

View File

@ -8,7 +8,7 @@ using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using Microsoft.AspNet.Razor.Chunks.Generators; using Microsoft.AspNet.Razor.Chunks.Generators;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.Parser;
using Microsoft.AspNet.Razor.Text; using Microsoft.AspNet.Razor.Text;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;

View File

@ -2,7 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNet.Razor.Chunks.Generators; using Microsoft.AspNet.Razor.Chunks.Generators;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.Parser;
using Xunit; using Xunit;

View File

@ -7,7 +7,7 @@ using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Microsoft.AspNet.Razor.Test.Framework; using Microsoft.AspNet.Razor.Test.Framework;
using Xunit; using Xunit;
namespace Microsoft.AspNet.Razor.Chunks namespace Microsoft.AspNet.Razor.Chunks.Generators
{ {
public class ChunkTreeBuilderTest public class ChunkTreeBuilderTest
{ {

View File

@ -2,13 +2,13 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#if !DNXCORE50 #if !DNXCORE50
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.CodeGeneration.Visitors; using Microsoft.AspNet.Razor.CodeGenerators.Visitors;
using Moq; using Moq;
using Moq.Protected; using Moq.Protected;
using Xunit; using Xunit;
namespace Microsoft.AspNet.Razor.Chunks namespace Microsoft.AspNet.Razor.Chunks.Generators
{ {
public class ChunkVisitorTests public class ChunkVisitorTests
{ {

View File

@ -9,7 +9,7 @@ using Microsoft.AspNet.Razor.Test.Utils;
using Moq; using Moq;
using Xunit; using Xunit;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class CSharpCodeGeneratorTest public class CSharpCodeGeneratorTest
{ {

View File

@ -3,7 +3,7 @@
using Xunit; using Xunit;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class CSharpCodeWriterTest public class CSharpCodeWriterTest
{ {

View File

@ -4,7 +4,7 @@
using System; using System;
using Xunit; using Xunit;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class CSharpLineMappingWriterTest public class CSharpLineMappingWriterTest
{ {

View File

@ -5,7 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.Parser;
using Microsoft.AspNet.Razor.Parser.SyntaxTree; using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Xunit; using Xunit;

View File

@ -4,7 +4,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNet.Razor.Chunks.Generators; using Microsoft.AspNet.Razor.Chunks.Generators;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Parser.SyntaxTree; using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Xunit; using Xunit;
@ -33,13 +33,17 @@ namespace Microsoft.AspNet.Razor.Test.Generator
[Fact] [Fact]
public void ConstructorRequiresNonNullClassName() public void ConstructorRequiresNonNullClassName()
{ {
Assert.Throws<ArgumentException>("className", () => new RazorChunkGenerator(null, TestRootNamespaceName, TestPhysicalPath, CreateHost())); Assert.Throws<ArgumentException>(
"className",
() => new RazorChunkGenerator(null, TestRootNamespaceName, TestPhysicalPath, CreateHost()));
} }
[Fact] [Fact]
public void ConstructorRequiresNonEmptyClassName() public void ConstructorRequiresNonEmptyClassName()
{ {
Assert.Throws<ArgumentException>("className", () => new RazorChunkGenerator(string.Empty, TestRootNamespaceName, TestPhysicalPath, CreateHost())); Assert.Throws<ArgumentException>(
"className",
() => new RazorChunkGenerator(string.Empty, TestRootNamespaceName, TestPhysicalPath, CreateHost()));
} }
[Fact] [Fact]

View File

@ -6,7 +6,7 @@ using System.Linq;
#if DNXCORE50 #if DNXCORE50
using System.Reflection; using System.Reflection;
#endif #endif
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.TagHelpers; using Microsoft.AspNet.Razor.TagHelpers;
using Xunit; using Xunit;

View File

@ -1,8 +1,8 @@
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNet.Razor.Chunks; using Microsoft.AspNet.Razor.Chunks;
using Microsoft.AspNet.Razor.Chunks.Generators; using Microsoft.AspNet.Razor.Chunks.Generators;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.CodeGeneration.Visitors; using Microsoft.AspNet.Razor.CodeGenerators.Visitors;
using Microsoft.AspNet.Razor.TagHelpers; using Microsoft.AspNet.Razor.TagHelpers;
using Xunit; using Xunit;

View File

@ -1,7 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
namespace Microsoft.AspNet.Razor.Test.Generator namespace Microsoft.AspNet.Razor.Test.Generator
{ {

View File

@ -1,7 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
namespace Microsoft.AspNet.Razor.Test.Generator namespace Microsoft.AspNet.Razor.Test.Generator
{ {

View File

@ -5,7 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using Xunit; using Xunit;
namespace Microsoft.AspNet.Razor.CodeGeneration namespace Microsoft.AspNet.Razor.CodeGenerators
{ {
public class CodeWriterTest public class CodeWriterTest
{ {

View File

@ -1,7 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Xunit; using Xunit;
namespace Microsoft.AspNet.Razor.Test.Generator namespace Microsoft.AspNet.Razor.Test.Generator

View File

@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Test.Utils; using Microsoft.AspNet.Razor.Test.Utils;
using Microsoft.AspNet.Testing; using Microsoft.AspNet.Testing;
using Xunit; using Xunit;
@ -127,7 +127,9 @@ namespace Microsoft.AspNet.Razor.Test.Generator
} }
var sourceLocation = string.Format("TestFiles/CodeGenerator/Source/{0}.{1}", name, FileExtension); var sourceLocation = string.Format("TestFiles/CodeGenerator/Source/{0}.{1}", name, FileExtension);
var expectedOutput = TestFile.Create(string.Format("TestFiles/CodeGenerator/Output/{0}.{1}", baselineName, BaselineExtension)).ReadAllText(); var expectedOutput = TestFile
.Create(string.Format("TestFiles/CodeGenerator/Output/{0}.{1}", baselineName, BaselineExtension))
.ReadAllText();
// Set up the host and engine // Set up the host and engine
var host = CreateHost(); var host = CreateHost();
@ -171,10 +173,19 @@ namespace Microsoft.AspNet.Razor.Test.Generator
{ {
var sourceFile = NormalizeNewLines(source); var sourceFile = NormalizeNewLines(source);
var sourceFileName = generatePragmas ? string.Format("{0}.{1}", name, FileExtension) : null; var sourceFileName = generatePragmas ? string.Format("{0}.{1}", name, FileExtension) : null;
results = engine.GenerateCode(sourceFile, className: name, rootNamespace: TestRootNamespaceName, sourceFileName: sourceFileName); results = engine.GenerateCode(
sourceFile,
className: name,
rootNamespace: TestRootNamespaceName,
sourceFileName: sourceFileName);
} }
// Only called if GENERATE_BASELINES is set, otherwise compiled out. // Only called if GENERATE_BASELINES is set, otherwise compiled out.
BaselineWriter.WriteBaseline(string.Format(@"test\Microsoft.AspNet.Razor.Test\TestFiles\ChunkGenerator\Output\{0}.{1}", baselineName, BaselineExtension), results.GeneratedCode); BaselineWriter.WriteBaseline(
string.Format(
@"test\Microsoft.AspNet.Razor.Test\TestFiles\ChunkGenerator\Output\{0}.{1}",
baselineName,
BaselineExtension),
results.GeneratedCode);
#if !GENERATE_BASELINES #if !GENERATE_BASELINES
var textOutput = results.GeneratedCode; var textOutput = results.GeneratedCode;

View File

@ -5,8 +5,8 @@ using System;
#if DNXCORE50 #if DNXCORE50
using System.Reflection; using System.Reflection;
#endif #endif
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.CodeGeneration.Visitors; using Microsoft.AspNet.Razor.CodeGenerators.Visitors;
using Microsoft.AspNet.Razor.TagHelpers; using Microsoft.AspNet.Razor.TagHelpers;
using Xunit; using Xunit;
@ -58,7 +58,9 @@ namespace Microsoft.AspNet.Razor.Test.Generator
GeneratedClassContext = originalHost.GeneratedClassContext; GeneratedClassContext = originalHost.GeneratedClassContext;
} }
public override CodeGenerator DecorateCodeGenerator(CodeGenerator incomingBuilder, CodeGeneratorContext context) public override CodeGenerator DecorateCodeGenerator(
CodeGenerator incomingBuilder,
CodeGeneratorContext context)
{ {
return new AttributeChunkGeneratorReplacingCodeGenerator(context); return new AttributeChunkGeneratorReplacingCodeGenerator(context);
} }

View File

@ -4,8 +4,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.CodeGeneration.Visitors; using Microsoft.AspNet.Razor.CodeGenerators.Visitors;
using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.Parser;
using Microsoft.AspNet.Razor.TagHelpers; using Microsoft.AspNet.Razor.TagHelpers;
@ -100,7 +100,9 @@ namespace Microsoft.AspNet.Razor.Test.Generator
} }
protected override CSharpCodeVisitor CreateCSharpCodeVisitor(CSharpCodeWriter writer, CodeGeneratorContext context) protected override CSharpCodeVisitor CreateCSharpCodeVisitor(
CSharpCodeWriter writer,
CodeGeneratorContext context)
{ {
var visitor = base.CreateCSharpCodeVisitor(writer, context); var visitor = base.CreateCSharpCodeVisitor(writer, context);
visitor.TagHelperRenderer = new NoUniqueIdsTagHelperCodeRenderer(visitor, writer, context); visitor.TagHelperRenderer = new NoUniqueIdsTagHelperCodeRenderer(visitor, writer, context);

View File

@ -124,7 +124,10 @@ namespace Microsoft.AspNet.Razor.Test.Framework
{ {
private const BlockType ThisBlockType = BlockType.Markup; private const BlockType ThisBlockType = BlockType.Markup;
public MarkupBlock(BlockType blockType, IParentChunkGenerator chunkGenerator, IEnumerable<SyntaxTreeNode> children) public MarkupBlock(
BlockType blockType,
IParentChunkGenerator chunkGenerator,
IEnumerable<SyntaxTreeNode> children)
: base(blockType, children, chunkGenerator) : base(blockType, children, chunkGenerator)
{ {
} }

View File

@ -19,12 +19,17 @@ namespace Microsoft.AspNet.Razor.Test.Framework
public static UnclassifiedCodeSpanConstructor EmptyCSharp(this SpanFactory self) public static UnclassifiedCodeSpanConstructor EmptyCSharp(this SpanFactory self)
{ {
return new UnclassifiedCodeSpanConstructor( return new UnclassifiedCodeSpanConstructor(
self.Span(SpanKind.Code, new CSharpSymbol(self.LocationTracker.CurrentLocation, string.Empty, CSharpSymbolType.Unknown))); self.Span(
SpanKind.Code,
new CSharpSymbol(self.LocationTracker.CurrentLocation, string.Empty, CSharpSymbolType.Unknown)));
} }
public static SpanConstructor EmptyHtml(this SpanFactory self) public static SpanConstructor EmptyHtml(this SpanFactory self)
{ {
return self.Span(SpanKind.Markup, new HtmlSymbol(self.LocationTracker.CurrentLocation, string.Empty, HtmlSymbolType.Unknown)) return self
.Span(
SpanKind.Markup,
new HtmlSymbol(self.LocationTracker.CurrentLocation, string.Empty, HtmlSymbolType.Unknown))
.With(new MarkupChunkGenerator()); .With(new MarkupChunkGenerator());
} }
@ -36,7 +41,9 @@ namespace Microsoft.AspNet.Razor.Test.Framework
public static SpanConstructor CodeTransition(this SpanFactory self) public static SpanConstructor CodeTransition(this SpanFactory self)
{ {
return self.Span(SpanKind.Transition, SyntaxConstants.TransitionString, markup: false).Accepts(AcceptedCharacters.None); return self
.Span(SpanKind.Transition, SyntaxConstants.TransitionString, markup: false)
.Accepts(AcceptedCharacters.None);
} }
public static SpanConstructor CodeTransition(this SpanFactory self, string content) public static SpanConstructor CodeTransition(this SpanFactory self, string content)
@ -46,7 +53,9 @@ namespace Microsoft.AspNet.Razor.Test.Framework
public static SpanConstructor CodeTransition(this SpanFactory self, CSharpSymbolType type) public static SpanConstructor CodeTransition(this SpanFactory self, CSharpSymbolType type)
{ {
return self.Span(SpanKind.Transition, SyntaxConstants.TransitionString, type).Accepts(AcceptedCharacters.None); return self
.Span(SpanKind.Transition, SyntaxConstants.TransitionString, type)
.Accepts(AcceptedCharacters.None);
} }
public static SpanConstructor CodeTransition(this SpanFactory self, string content, CSharpSymbolType type) public static SpanConstructor CodeTransition(this SpanFactory self, string content, CSharpSymbolType type)
@ -56,7 +65,9 @@ namespace Microsoft.AspNet.Razor.Test.Framework
public static SpanConstructor MarkupTransition(this SpanFactory self) public static SpanConstructor MarkupTransition(this SpanFactory self)
{ {
return self.Span(SpanKind.Transition, SyntaxConstants.TransitionString, markup: true).Accepts(AcceptedCharacters.None); return self
.Span(SpanKind.Transition, SyntaxConstants.TransitionString, markup: true)
.Accepts(AcceptedCharacters.None);
} }
public static SpanConstructor MarkupTransition(this SpanFactory self, string content) public static SpanConstructor MarkupTransition(this SpanFactory self, string content)
@ -66,7 +77,9 @@ namespace Microsoft.AspNet.Razor.Test.Framework
public static SpanConstructor MarkupTransition(this SpanFactory self, HtmlSymbolType type) public static SpanConstructor MarkupTransition(this SpanFactory self, HtmlSymbolType type)
{ {
return self.Span(SpanKind.Transition, SyntaxConstants.TransitionString, type).Accepts(AcceptedCharacters.None); return self
.Span(SpanKind.Transition, SyntaxConstants.TransitionString, type)
.Accepts(AcceptedCharacters.None);
} }
public static SpanConstructor MarkupTransition(this SpanFactory self, string content, HtmlSymbolType type) public static SpanConstructor MarkupTransition(this SpanFactory self, string content, HtmlSymbolType type)
@ -241,7 +254,10 @@ namespace Microsoft.AspNet.Razor.Test.Framework
return AutoCompleteWith(self, autoCompleteString, atEndOfSpan: false); return AutoCompleteWith(self, autoCompleteString, atEndOfSpan: false);
} }
public static SpanConstructor AutoCompleteWith(this SpanConstructor self, string autoCompleteString, bool atEndOfSpan) public static SpanConstructor AutoCompleteWith(
this SpanConstructor self,
string autoCompleteString,
bool atEndOfSpan)
{ {
return self.With(new AutoCompleteEditHandler( return self.With(new AutoCompleteEditHandler(
SpanConstructor.TestTokenizer, SpanConstructor.TestTokenizer,
@ -289,7 +305,8 @@ namespace Microsoft.AspNet.Razor.Test.Framework
public SpanConstructor AsImplicitExpression(ISet<string> keywords, bool acceptTrailingDot) public SpanConstructor AsImplicitExpression(ISet<string> keywords, bool acceptTrailingDot)
{ {
return _self.With(new ImplicitExpressionEditHandler(SpanConstructor.TestTokenizer, keywords, acceptTrailingDot)) return _self
.With(new ImplicitExpressionEditHandler(SpanConstructor.TestTokenizer, keywords, acceptTrailingDot))
.With(new ExpressionChunkGenerator()); .With(new ExpressionChunkGenerator());
} }

View File

@ -61,37 +61,58 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
[Fact] [Fact]
public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsForKeyword() public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsForKeyword()
{ {
SingleSpanBlockTest("for(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); }", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedCharacters.None); SingleSpanBlockTest(
"for(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); }",
BlockType.Statement,
SpanKind.Code,
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsForeachKeyword() public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsForeachKeyword()
{ {
SingleSpanBlockTest("foreach(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); }", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedCharacters.None); SingleSpanBlockTest(
"foreach(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); }",
BlockType.Statement,
SpanKind.Code,
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsWhileKeyword() public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsWhileKeyword()
{ {
SingleSpanBlockTest("while(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); }", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedCharacters.None); SingleSpanBlockTest(
"while(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); }",
BlockType.Statement,
SpanKind.Code,
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsUsingKeywordFollowedByParen() public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsUsingKeywordFollowedByParen()
{ {
SingleSpanBlockTest("using(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); }", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedCharacters.None); SingleSpanBlockTest(
"using(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); }",
BlockType.Statement,
SpanKind.Code, acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
public void ParseBlockSupportsUsingsNestedWithinOtherBlocks() public void ParseBlockSupportsUsingsNestedWithinOtherBlocks()
{ {
SingleSpanBlockTest("if(foo) { using(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); } }", BlockType.Statement, SpanKind.Code); SingleSpanBlockTest(
"if(foo) { using(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); } }",
BlockType.Statement,
SpanKind.Code);
} }
[Fact] [Fact]
public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsIfKeywordWithNoElseBranches() public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsIfKeywordWithNoElseBranches()
{ {
SingleSpanBlockTest("if(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); }", BlockType.Statement, SpanKind.Code); SingleSpanBlockTest(
"if(int i = 0; i < 10; new Foo { Bar = \"baz\" }) { Debug.WriteLine(@\"foo } bar\"); }",
BlockType.Statement,
SpanKind.Code);
} }
[Fact] [Fact]
@ -113,31 +134,46 @@ namespace Microsoft.AspNet.Razor.Test.Parser.CSharp
[Fact] [Fact]
public void ParseBlockSupportsBlockCommentBetweenIfAndElseClause() public void ParseBlockSupportsBlockCommentBetweenIfAndElseClause()
{ {
SingleSpanBlockTest("if(foo) { bar(); } /* Foo */ /* Bar */ else { baz(); }", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedCharacters.None); SingleSpanBlockTest(
"if(foo) { bar(); } /* Foo */ /* Bar */ else { baz(); }",
BlockType.Statement,
SpanKind.Code,
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
public void ParseBlockSupportsRazorCommentBetweenIfAndElseClause() public void ParseBlockSupportsRazorCommentBetweenIfAndElseClause()
{ {
RunRazorCommentBetweenClausesTest("if(foo) { bar(); } ", " else { baz(); }", acceptedCharacters: AcceptedCharacters.None); RunRazorCommentBetweenClausesTest(
"if(foo) { bar(); } ", " else { baz(); }",
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
public void ParseBlockSupportsBlockCommentBetweenElseIfAndElseClause() public void ParseBlockSupportsBlockCommentBetweenElseIfAndElseClause()
{ {
SingleSpanBlockTest("if(foo) { bar(); } else if(bar) { baz(); } /* Foo */ /* Bar */ else { biz(); }", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedCharacters.None); SingleSpanBlockTest(
"if(foo) { bar(); } else if(bar) { baz(); } /* Foo */ /* Bar */ else { biz(); }",
BlockType.Statement,
SpanKind.Code,
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
public void ParseBlockSupportsRazorCommentBetweenElseIfAndElseClause() public void ParseBlockSupportsRazorCommentBetweenElseIfAndElseClause()
{ {
RunRazorCommentBetweenClausesTest("if(foo) { bar(); } else if(bar) { baz(); } ", " else { baz(); }", acceptedCharacters: AcceptedCharacters.None); RunRazorCommentBetweenClausesTest(
"if(foo) { bar(); } else if(bar) { baz(); } ", " else { baz(); }",
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
public void ParseBlockSupportsBlockCommentBetweenIfAndElseIfClause() public void ParseBlockSupportsBlockCommentBetweenIfAndElseIfClause()
{ {
SingleSpanBlockTest("if(foo) { bar(); } /* Foo */ /* Bar */ else if(bar) { baz(); }", BlockType.Statement, SpanKind.Code); SingleSpanBlockTest(
"if(foo) { bar(); } /* Foo */ /* Bar */ else if(bar) { baz(); }",
BlockType.Statement,
SpanKind.Code);
} }
[Fact] [Fact]
@ -228,7 +264,9 @@ else if(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
const string document = ifStatement + elseIfBranch + elseBranch + elseIfBranch; const string document = ifStatement + elseIfBranch + elseBranch + elseIfBranch;
const string expected = ifStatement + elseIfBranch + elseBranch; const string expected = ifStatement + elseIfBranch + elseBranch;
ParseBlockTest(document, new StatementBlock(Factory.Code(expected).AsStatement().Accepts(AcceptedCharacters.None))); ParseBlockTest(
document,
new StatementBlock(Factory.Code(expected).AsStatement().Accepts(AcceptedCharacters.None)));
} }
[Fact] [Fact]
@ -244,7 +282,8 @@ else if(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
[Fact] [Fact]
public void ParseBlockAcceptsElseIfWithNoCondition() public void ParseBlockAcceptsElseIfWithNoCondition()
{ {
// We don't want to be a full C# parser - If the else if is missing it's condition, the C# compiler can handle that, we have all the info we need to keep parsing // We don't want to be a full C# parser - If the else if is missing it's condition, the C# compiler
// can handle that, we have all the info we need to keep parsing
const string ifBranch = @"if(int i = 0; i < 10; new Foo { Bar = ""baz"" }) { const string ifBranch = @"if(int i = 0; i < 10; new Foo { Bar = ""baz"" }) {
Debug.WriteLine(@""foo } bar""); Debug.WriteLine(@""foo } bar"");
}"; }";
@ -257,7 +296,11 @@ else if(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
[Fact] [Fact]
public void ParseBlockCorrectlyParsesDoWhileBlock() public void ParseBlockCorrectlyParsesDoWhileBlock()
{ {
SingleSpanBlockTest("do { var foo = bar; } while(foo != bar);", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedCharacters.None); SingleSpanBlockTest(
"do { var foo = bar; } while(foo != bar);",
BlockType.Statement,
SpanKind.Code,
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
@ -275,7 +318,11 @@ else if(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
[Fact] [Fact]
public void ParseBlockCorrectlyParsesDoWhileBlockMissingWhileConditionWithSemicolon() public void ParseBlockCorrectlyParsesDoWhileBlockMissingWhileConditionWithSemicolon()
{ {
SingleSpanBlockTest("do { var foo = bar; } while;", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedCharacters.None); SingleSpanBlockTest(
"do { var foo = bar; } while;",
BlockType.Statement,
SpanKind.Code,
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
@ -287,7 +334,11 @@ else if(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
[Fact] [Fact]
public void ParseBlockSupportsBlockCommentBetweenDoAndWhileClause() public void ParseBlockSupportsBlockCommentBetweenDoAndWhileClause()
{ {
SingleSpanBlockTest("do { var foo = bar; } /* Foo */ /* Bar */ while(true);", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedCharacters.None); SingleSpanBlockTest(
"do { var foo = bar; } /* Foo */ /* Bar */ while(true);",
BlockType.Statement,
SpanKind.Code,
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
@ -302,7 +353,9 @@ while(true);", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedC
[Fact] [Fact]
public void ParseBlockSupportsRazorCommentBetweenDoAndWhileClause() public void ParseBlockSupportsRazorCommentBetweenDoAndWhileClause()
{ {
RunRazorCommentBetweenClausesTest("do { var foo = bar; } ", " while(true);", acceptedCharacters: AcceptedCharacters.None); RunRazorCommentBetweenClausesTest(
"do { var foo = bar; } ", " while(true);",
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
@ -343,25 +396,40 @@ while(true);", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedC
[Fact] [Fact]
public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsLockKeyword() public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsLockKeyword()
{ {
SingleSpanBlockTest("lock(foo) { Debug.WriteLine(@\"foo } bar\"); }", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedCharacters.None); SingleSpanBlockTest(
"lock(foo) { Debug.WriteLine(@\"foo } bar\"); }",
BlockType.Statement,
SpanKind.Code,
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
public void ParseBlockHasErrorsIfNamespaceImportMissingSemicolon() public void ParseBlockHasErrorsIfNamespaceImportMissingSemicolon()
{ {
NamespaceImportTest("using Foo.Bar.Baz", " Foo.Bar.Baz", acceptedCharacters: AcceptedCharacters.NonWhiteSpace | AcceptedCharacters.WhiteSpace, location: new SourceLocation(17, 0, 17)); NamespaceImportTest(
"using Foo.Bar.Baz",
" Foo.Bar.Baz",
acceptedCharacters: AcceptedCharacters.NonWhiteSpace | AcceptedCharacters.WhiteSpace,
location: new SourceLocation(17, 0, 17));
} }
[Fact] [Fact]
public void ParseBlockHasErrorsIfNamespaceAliasMissingSemicolon() public void ParseBlockHasErrorsIfNamespaceAliasMissingSemicolon()
{ {
NamespaceImportTest("using Foo.Bar.Baz = FooBarBaz", " Foo.Bar.Baz = FooBarBaz", acceptedCharacters: AcceptedCharacters.NonWhiteSpace | AcceptedCharacters.WhiteSpace, location: new SourceLocation(29, 0, 29)); NamespaceImportTest(
"using Foo.Bar.Baz = FooBarBaz",
" Foo.Bar.Baz = FooBarBaz",
acceptedCharacters: AcceptedCharacters.NonWhiteSpace | AcceptedCharacters.WhiteSpace,
location: new SourceLocation(29, 0, 29));
} }
[Fact] [Fact]
public void ParseBlockParsesNamespaceImportWithSemicolonForUsingKeywordIfIsInValidFormat() public void ParseBlockParsesNamespaceImportWithSemicolonForUsingKeywordIfIsInValidFormat()
{ {
NamespaceImportTest("using Foo.Bar.Baz;", " Foo.Bar.Baz", AcceptedCharacters.NonWhiteSpace | AcceptedCharacters.WhiteSpace); NamespaceImportTest(
"using Foo.Bar.Baz;",
" Foo.Bar.Baz",
AcceptedCharacters.NonWhiteSpace | AcceptedCharacters.WhiteSpace);
} }
[Fact] [Fact]
@ -377,7 +445,10 @@ while(true);", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedC
[Fact] [Fact]
public void ParseBlockParsesNamespaceAliasWithSemicolonForUsingKeywordIfIsInValidFormat() public void ParseBlockParsesNamespaceAliasWithSemicolonForUsingKeywordIfIsInValidFormat()
{ {
NamespaceImportTest("using FooBarBaz = FooBarBaz;", " FooBarBaz = FooBarBaz", AcceptedCharacters.NonWhiteSpace | AcceptedCharacters.WhiteSpace); NamespaceImportTest(
"using FooBarBaz = FooBarBaz;",
" FooBarBaz = FooBarBaz",
AcceptedCharacters.NonWhiteSpace | AcceptedCharacters.WhiteSpace);
} }
[Fact] [Fact]
@ -390,17 +461,29 @@ while(true);", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedC
public void ParseBlockTerminatesSingleLineCommentAtEndOfFile() public void ParseBlockTerminatesSingleLineCommentAtEndOfFile()
{ {
const string document = "foreach(var f in Foo) { // foo bar baz"; const string document = "foreach(var f in Foo) { // foo bar baz";
SingleSpanBlockTest(document, document, BlockType.Statement, SpanKind.Code, SingleSpanBlockTest(
new RazorError(RazorResources.FormatParseError_Expected_EndOfBlock_Before_EOF("foreach", '}', '{'), SourceLocation.Zero)); document,
document,
BlockType.Statement,
SpanKind.Code,
new RazorError(
RazorResources.FormatParseError_Expected_EndOfBlock_Before_EOF("foreach", '}', '{'),
SourceLocation.Zero));
} }
[Fact] [Fact]
public void ParseBlockTerminatesBlockCommentAtEndOfFile() public void ParseBlockTerminatesBlockCommentAtEndOfFile()
{ {
const string document = "foreach(var f in Foo) { /* foo bar baz"; const string document = "foreach(var f in Foo) { /* foo bar baz";
SingleSpanBlockTest(document, document, BlockType.Statement, SpanKind.Code, SingleSpanBlockTest(
new RazorError(RazorResources.ParseError_BlockComment_Not_Terminated, 24, 0, 24), document,
new RazorError(RazorResources.FormatParseError_Expected_EndOfBlock_Before_EOF("foreach", '}', '{'), SourceLocation.Zero)); document,
BlockType.Statement,
SpanKind.Code,
new RazorError(RazorResources.ParseError_BlockComment_Not_Terminated, 24, 0, 24),
new RazorError(
RazorResources.FormatParseError_Expected_EndOfBlock_Before_EOF("foreach", '}', '{'),
SourceLocation.Zero));
} }
[Fact] [Fact]
@ -426,13 +509,19 @@ while(true);", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedC
[Fact] [Fact]
public void ParseBlockSupportsBlockCommentBetweenCatchAndFinallyClause() public void ParseBlockSupportsBlockCommentBetweenCatchAndFinallyClause()
{ {
SingleSpanBlockTest("try { bar(); } catch(bar) { baz(); } /* Foo */ /* Bar */ finally { biz(); }", BlockType.Statement, SpanKind.Code, acceptedCharacters: AcceptedCharacters.None); SingleSpanBlockTest(
"try { bar(); } catch(bar) { baz(); } /* Foo */ /* Bar */ finally { biz(); }",
BlockType.Statement,
SpanKind.Code,
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
public void ParseBlockSupportsRazorCommentBetweenCatchAndFinallyClause() public void ParseBlockSupportsRazorCommentBetweenCatchAndFinallyClause()
{ {
RunRazorCommentBetweenClausesTest("try { bar(); } catch(bar) { baz(); } ", " finally { biz(); }", acceptedCharacters: AcceptedCharacters.None); RunRazorCommentBetweenClausesTest(
"try { bar(); } catch(bar) { baz(); } ", " finally { biz(); }",
acceptedCharacters: AcceptedCharacters.None);
} }
[Fact] [Fact]
@ -519,7 +608,11 @@ catch(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
[Fact] [Fact]
public void ParseBlockSupportsTryStatementWithMultipleCatchClause() public void ParseBlockSupportsTryStatementWithMultipleCatchClause()
{ {
SingleSpanBlockTest("try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }", BlockType.Statement, SpanKind.Code); SingleSpanBlockTest(
"try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) " +
"{ var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }",
BlockType.Statement,
SpanKind.Code);
} }
[Fact] [Fact]
@ -532,7 +625,8 @@ catch(bar) { baz(); }", BlockType.Statement, SpanKind.Code);
public void ParseBlockSupportsMarkupWithinAdditionalCatchClauses() public void ParseBlockSupportsMarkupWithinAdditionalCatchClauses()
{ {
RunSimpleWrappedMarkupTest( RunSimpleWrappedMarkupTest(
prefix: "try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) {", prefix: "try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) " +
"{ var foo = new { } } catch(Foo Bar Baz) {",
markup: " <p>Foo</p> ", markup: " <p>Foo</p> ",
suffix: "}", suffix: "}",
expectedMarkup: new MarkupBlock( expectedMarkup: new MarkupBlock(

View File

@ -4,7 +4,7 @@
using System; using System;
using System.Threading; using System.Threading;
using System.Web.WebPages.TestUtils; using System.Web.WebPages.TestUtils;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Parser.SyntaxTree; using Microsoft.AspNet.Razor.Parser.SyntaxTree;
using Microsoft.AspNet.Razor.Test.Framework; using Microsoft.AspNet.Razor.Test.Framework;
using Microsoft.AspNet.Razor.Test.Utils; using Microsoft.AspNet.Razor.Test.Utils;

View File

@ -2,7 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNet.Razor.Chunks.Generators; using Microsoft.AspNet.Razor.Chunks.Generators;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.Parser;
using Xunit; using Xunit;

View File

@ -8,7 +8,7 @@ using System.Text;
using System.Threading; using System.Threading;
using System.Web.WebPages.TestUtils; using System.Web.WebPages.TestUtils;
using Microsoft.AspNet.Razor.Chunks.Generators; using Microsoft.AspNet.Razor.Chunks.Generators;
using Microsoft.AspNet.Razor.CodeGeneration; using Microsoft.AspNet.Razor.CodeGenerators;
using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.Parser;
using Microsoft.AspNet.Razor.Text; using Microsoft.AspNet.Razor.Text;
using Moq; using Moq;