From 356e7bfc6ff1a69c2967ffb1f3d05e20fdb62976 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 29 Sep 2012 18:52:56 +0100 Subject: [PATCH] Add MVC T4 processing errors to Errors window. Add View and Add Controller dialogs now report T4 template processing errors to the Errors window instead of logging them to the console window. --- .../AspNet.Mvc/Project/AspNet.Mvc.csproj | 2 ++ .../Src/IMvcFileGenerationErrorReporter.cs | 13 +++++++++ .../Project/Src/MvcControllerFileGenerator.cs | 8 ++++-- .../Src/MvcFileGenerationErrorReporter.cs | 23 +++++++++++++++ .../Project/Src/MvcFileGenerator.cs | 12 ++++---- .../Project/Src/MvcViewFileGenerator.cs | 8 ++++-- .../Src/MvcControllerFileGeneratorTests.cs | 28 ++++++++++++++++++- .../Test/Src/MvcViewFileGeneratorTests.cs | 28 ++++++++++++++++++- 8 files changed, 108 insertions(+), 14 deletions(-) create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcFileGenerationErrorReporter.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerationErrorReporter.cs diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj index d16b77692d..cc1a4d6b6b 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj @@ -173,6 +173,7 @@ + @@ -193,6 +194,7 @@ + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcFileGenerationErrorReporter.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcFileGenerationErrorReporter.cs new file mode 100644 index 0000000000..c958323c3a --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcFileGenerationErrorReporter.cs @@ -0,0 +1,13 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.CodeDom.Compiler; + +namespace ICSharpCode.AspNet.Mvc +{ + public interface IMvcFileGenerationErrorReporter + { + void ShowErrors(CompilerErrorCollection errors); + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs index 7349e2a403..9cfaa97237 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs @@ -11,14 +11,16 @@ namespace ICSharpCode.AspNet.Mvc public MvcControllerFileGenerator() : this( new MvcTextTemplateHostFactory(), - new MvcTextTemplateHostAppDomainFactory()) + new MvcTextTemplateHostAppDomainFactory(), + new MvcFileGenerationErrorReporter()) { } public MvcControllerFileGenerator( IMvcTextTemplateHostFactory hostFactory, - IMvcTextTemplateHostAppDomainFactory appDomainFactory) - : base(hostFactory, appDomainFactory) + IMvcTextTemplateHostAppDomainFactory appDomainFactory, + IMvcFileGenerationErrorReporter errorReporter) + : base(hostFactory, appDomainFactory, errorReporter) { this.Template = new MvcControllerTextTemplate(); } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerationErrorReporter.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerationErrorReporter.cs new file mode 100644 index 0000000000..726e8fa37c --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerationErrorReporter.cs @@ -0,0 +1,23 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.CodeDom.Compiler; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.TextTemplating; + +namespace ICSharpCode.AspNet.Mvc +{ + public class MvcFileGenerationErrorReporter : IMvcFileGenerationErrorReporter + { + public void ShowErrors(CompilerErrorCollection errors) + { + TaskService.ClearExceptCommentTasks(); + foreach (CompilerError error in errors) { + TaskService.Add(new CompilerErrorTask(error)); + } + WorkbenchSingleton.Workbench.GetPad(typeof(ErrorListPad)).BringPadToFront(); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs index 06525d03ba..c898cb1465 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs @@ -12,13 +12,16 @@ namespace ICSharpCode.AspNet.Mvc { IMvcTextTemplateHostFactory hostFactory; IMvcTextTemplateHostAppDomainFactory appDomainFactory; + IMvcFileGenerationErrorReporter errorReporter; public MvcFileGenerator( IMvcTextTemplateHostFactory hostFactory, - IMvcTextTemplateHostAppDomainFactory appDomainFactory) + IMvcTextTemplateHostAppDomainFactory appDomainFactory, + IMvcFileGenerationErrorReporter errorReporter) { this.hostFactory = hostFactory; this.appDomainFactory = appDomainFactory; + this.errorReporter = errorReporter; } public MvcTextTemplateLanguage TemplateLanguage { get; set; } @@ -56,11 +59,8 @@ namespace ICSharpCode.AspNet.Mvc host.ProcessTemplate(templateFileName, outputViewFileName); Errors = host.Errors; - - if (host.Errors.Count > 0) { - CompilerError error = host.Errors[0]; - Console.WriteLine("ProcessTemplate error: " + error.ErrorText); - Console.WriteLine("ProcessTemplate error: Line: " + error.Line); + if (HasErrors) { + errorReporter.ShowErrors(Errors); } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs index ab221bb583..4753ffa7c7 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs @@ -14,15 +14,17 @@ namespace ICSharpCode.AspNet.Mvc : this( new MvcTextTemplateHostFactory(), new MvcTextTemplateRepository(), - new MvcTextTemplateHostAppDomainFactory()) + new MvcTextTemplateHostAppDomainFactory(), + new MvcFileGenerationErrorReporter()) { } public MvcViewFileGenerator( IMvcTextTemplateHostFactory hostFactory, MvcTextTemplateRepository textTemplateRepository, - IMvcTextTemplateHostAppDomainFactory appDomainFactory) - : base(hostFactory, appDomainFactory) + IMvcTextTemplateHostAppDomainFactory appDomainFactory, + IMvcFileGenerationErrorReporter errorReporter) + : base(hostFactory, appDomainFactory, errorReporter) { this.textTemplateRepository = textTemplateRepository; diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs index e7340602d7..46732c2a09 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs @@ -7,6 +7,7 @@ using AspNet.Mvc.Tests.Helpers; using ICSharpCode.AspNet.Mvc; using ICSharpCode.SharpDevelop.Project; using NUnit.Framework; +using Rhino.Mocks; namespace AspNet.Mvc.Tests { @@ -18,13 +19,15 @@ namespace AspNet.Mvc.Tests FakeMvcTextTemplateHostFactory fakeHostFactory; FakeMvcTextTemplateHost fakeHost; FakeMvcTextTemplateAppDomainFactory fakeAppDomainFactory; + IMvcFileGenerationErrorReporter fakeErrorReporter; void CreateGenerator() { fakeHostFactory = new FakeMvcTextTemplateHostFactory(); fakeHost = fakeHostFactory.FakeMvcTextTemplateHost; fakeAppDomainFactory = new FakeMvcTextTemplateAppDomainFactory(); - generator = new MvcControllerFileGenerator(fakeHostFactory, fakeAppDomainFactory); + fakeErrorReporter = MockRepository.GenerateStub(); + generator = new MvcControllerFileGenerator(fakeHostFactory, fakeAppDomainFactory, fakeErrorReporter); projectUsedByGenerator = new FakeMvcProject(); generator.Project = projectUsedByGenerator; ProjectPassedToGeneratorIsCSharpProject(); @@ -244,5 +247,28 @@ namespace AspNet.Mvc.Tests Assert.IsTrue(result); } + + [Test] + public void GenerateFile_TemplateProcessedWithCompilerError_ErrorsReported() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + CompilerError error = AddCompilerErrorToTemplateHost(); + + GenerateFile(); + + fakeErrorReporter.AssertWasCalled(reporter => reporter.ShowErrors(generator.Errors)); + } + + [Test] + public void GenerateFile_TemplateProcessedNoErrors_NoErrorsReported() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + + GenerateFile(); + + fakeErrorReporter.AssertWasNotCalled(reporter => reporter.ShowErrors(Arg.Is.Anything)); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs index f8ea3e545f..71cc0da5bf 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs @@ -7,6 +7,7 @@ using AspNet.Mvc.Tests.Helpers; using ICSharpCode.AspNet.Mvc; using ICSharpCode.SharpDevelop.Project; using NUnit.Framework; +using Rhino.Mocks; namespace AspNet.Mvc.Tests { @@ -19,6 +20,7 @@ namespace AspNet.Mvc.Tests FakeMvcTextTemplateHostFactory fakeHostFactory; FakeMvcTextTemplateHost fakeHost; FakeMvcTextTemplateAppDomainFactory fakeAppDomainFactory; + IMvcFileGenerationErrorReporter fakeErrorReporter; void CreateTemplateRepository(string templateRootDirectory) { @@ -36,7 +38,8 @@ namespace AspNet.Mvc.Tests fakeHostFactory = new FakeMvcTextTemplateHostFactory(); fakeHost = fakeHostFactory.FakeMvcTextTemplateHost; fakeAppDomainFactory = new FakeMvcTextTemplateAppDomainFactory(); - generator = new MvcViewFileGenerator(fakeHostFactory, templateRepository, fakeAppDomainFactory); + fakeErrorReporter = MockRepository.GenerateStub(); + generator = new MvcViewFileGenerator(fakeHostFactory, templateRepository, fakeAppDomainFactory, fakeErrorReporter); projectUsedByGenerator = new FakeMvcProject(); generator.Project = projectUsedByGenerator; ProjectPassedToGeneratorIsCSharpProject(); @@ -357,5 +360,28 @@ namespace AspNet.Mvc.Tests Assert.IsTrue(result); } + + [Test] + public void GenerateFile_TemplateProcessedWithCompilerError_ErrorsReported() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + CompilerError error = AddCompilerErrorToTemplateHost(); + + GenerateFile(); + + fakeErrorReporter.AssertWasCalled(reporter => reporter.ShowErrors(generator.Errors)); + } + + [Test] + public void GenerateFile_TemplateProcessedNoErrors_NoErrorsReported() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + + GenerateFile(); + + fakeErrorReporter.AssertWasNotCalled(reporter => reporter.ShowErrors(Arg.Is.Anything)); + } } }