Changes for @inject support

Fixes #35
This commit is contained in:
Pranav K 2014-05-09 11:23:17 -07:00
parent 47141b2003
commit 4f255f8583
9 changed files with 119 additions and 13 deletions

View File

@ -50,11 +50,7 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp
new CSharpTypeMemberVisitor(writer, Context).Accept(Tree.Chunks);
new CSharpDesignTimeHelpersVisitor(writer, Context).AcceptTree(Tree);
writer.WriteLineHiddenDirective();
using (writer.BuildConstructor(Context.ClassName))
{
// Any constructor based logic that we need to add?
};
BuildConstructor(writer);
// Add space inbetween constructor and method body
writer.WriteLine();
@ -72,6 +68,15 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp
return new CodeBuilderResult(writer.GenerateCode(), writer.LineMappingManager.Mappings);
}
protected virtual void BuildConstructor(CSharpCodeWriter writer)
{
writer.WriteLineHiddenDirective();
using (writer.BuildConstructor(Context.ClassName))
{
// Any constructor based logic that we need to add?
};
}
private void AddImports(CodeTree codeTree, CSharpCodeWriter writer, IEnumerable<string> defaultImports)
{
// Write out using directives

View File

@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler
}
}
public void Accept(Chunk chunk)
public virtual void Accept(Chunk chunk)
{
if (chunk == null)
{
@ -105,10 +105,6 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler
{
Visit((SessionStateChunk)chunk);
}
else
{
throw new InvalidOperationException("Unknown chunk type " + chunk.GetType().Name);
}
}
protected abstract void Visit(LiteralChunk chunk);

View File

@ -162,7 +162,7 @@ namespace Microsoft.AspNet.Razor.Parser
}
}
private bool NamespaceOrTypeName()
protected bool NamespaceOrTypeName()
{
if (Optional(CSharpSymbolType.Identifier) || Optional(CSharpSymbolType.Keyword))
{

View File

@ -201,5 +201,19 @@ namespace Microsoft.AspNet.Razor
}
return incomingCodeGenerator;
}
/// <summary>
/// Gets an instance of the code builder and is provided an opportunity to decorate or replace it
/// </summary>
/// <param name="incomingBuilder">The code builder</param>
/// <returns>Either the same code builder, after modifications, or a different code builder.</returns>
public virtual CodeBuilder DecorateCodeBuilder(CodeBuilder incomingBuilder, CodeGeneratorContext context)
{
if (incomingBuilder == null)
{
throw new ArgumentNullException("incomingBuilder");
}
return incomingBuilder;
}
}
}

View File

@ -167,7 +167,7 @@ namespace Microsoft.AspNet.Razor
generator.DesignTimeMode = Host.DesignTimeMode;
generator.Visit(results);
var builder = Host.CodeLanguage.CreateCodeBuilder(generator.Context);
var builder = CreateCodeBuilder(generator.Context);
var builderResult = builder.Build();
// Collect results and return
@ -191,5 +191,11 @@ namespace Microsoft.AspNet.Razor
DesignTimeMode = Host.DesignTimeMode
};
}
protected internal virtual CodeBuilder CreateCodeBuilder(CodeGeneratorContext context)
{
return Host.DecorateCodeBuilder(Host.CodeLanguage.CreateCodeBuilder(context),
context);
}
}
}

View File

@ -2,8 +2,8 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNet.Razor.Generator;
using Microsoft.AspNet.Razor.Generator.Compiler.CSharp;
using Microsoft.AspNet.Razor.Parser;
using Microsoft.CSharp;
using Microsoft.TestCommon;
namespace Microsoft.AspNet.Razor.Test
@ -42,5 +42,24 @@ namespace Microsoft.AspNet.Razor.Test
Assert.Equal("Baz", generator.SourceFileName);
Assert.Same(host, generator.Host);
}
[Fact]
public void CreateCodeBuilder_ReturnsNewCSharpCodeBuilder()
{
// Arrange
var language = new CSharpRazorCodeLanguage();
var host = new RazorEngineHost(language);
var context = CodeGeneratorContext.Create(host,
"myclass",
"myns",
string.Empty,
shouldGenerateLinePragmas: false);
// Act
var generator = language.CreateCodeBuilder(context);
// Assert
Assert.IsType<CSharpCodeBuilder>(generator);
}
}
}

View File

@ -0,0 +1,41 @@
using Microsoft.AspNet.Razor.Generator;
using Microsoft.AspNet.Razor.Generator.Compiler;
using Microsoft.TestCommon;
using Moq;
using Moq.Protected;
namespace Microsoft.AspNet.Razor
{
public class ChunkVisitorTests
{
[Fact]
public void Accept_InvokesAppropriateOverload()
{
// Arrange
var chunks = new Chunk[] { new LiteralChunk(), new StatementChunk() };
var visitor = CreateVisitor();
// Act
visitor.Object.Accept(chunks);
// Assert
visitor.Protected().Verify("Visit", Times.AtMostOnce(), chunks[0]);
visitor.Protected().Verify("Visit", Times.AtMostOnce(), chunks[1]);
}
private static Mock<ChunkVisitor<CodeWriter>> CreateVisitor()
{
var context = CodeGeneratorContext.Create(new RazorEngineHost(new CSharpRazorCodeLanguage()),
"myclass",
"myns",
string.Empty,
shouldGenerateLinePragmas: false);
var writer = Mock.Of<CodeWriter>();
return new Mock<ChunkVisitor<CodeWriter>>(writer, context);
}
private class MyTestChunk : Chunk
{
}
}
}

View File

@ -67,6 +67,7 @@
<Compile Include="Framework\ParserTestBase.cs" />
<Compile Include="Framework\RawTextSymbol.cs" />
<Compile Include="Framework\TestSpanBuilder.cs" />
<Compile Include="Generator\CodeTree\ChunkVisitorTests.cs" />
<Compile Include="Generator\CodeTree\CodeTreeGenerationTest.cs" />
<Compile Include="Generator\CodeTree\CSharpCodeBuilderTests.cs" />
<Compile Include="Generator\CodeTree\CSharpPaddingBuilderTests.cs" />

View File

@ -5,6 +5,7 @@ using System.IO;
using System.Threading;
using System.Web.WebPages.TestUtils;
using Microsoft.AspNet.Razor.Generator;
using Microsoft.AspNet.Razor.Generator.Compiler.CSharp;
using Microsoft.AspNet.Razor.Parser;
using Microsoft.AspNet.Razor.Text;
using Microsoft.TestCommon;
@ -104,6 +105,29 @@ namespace Microsoft.AspNet.Razor.Test
Assert.Equal(expected, actual);
}
[Fact]
public void CreateCodeBuilder_PassesCodeGeneratorThroughDecorateMethodOnHost()
{
// Arrange
var mockHost = new Mock<RazorEngineHost>(new CSharpRazorCodeLanguage()) { CallBase = true };
var context = CodeGeneratorContext.Create(mockHost.Object,
"different-class",
"different-ns",
string.Empty,
shouldGenerateLinePragmas: true);
var expected = new CSharpCodeBuilder(context);
mockHost.Setup(h => h.DecorateCodeBuilder(It.IsAny<CSharpCodeBuilder>(), context))
.Returns(expected);
var engine = new RazorTemplateEngine(mockHost.Object);
// Act
var actual = engine.CreateCodeBuilder(context);
// Assert
Assert.Equal(expected, actual);
}
[Fact]
public void ParseTemplateCopiesTextReaderContentToSeekableTextReaderAndPassesToParseTemplateCore()
{