From e5836be58e91f120c8c0fa751b1f93ed822cbe78 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 16 Sep 2012 12:59:52 +0100 Subject: [PATCH] Add C# Razor completion for MVC helper methods. Use WebViewPage as Razor view's base class. Add default namespaces for the Razor view class so extension methods show in completion: System.Web.Mvc, System.Web.Mvc.Ajax, System.Web.Mvc.Html, System.Web.Routing The Razor view's base class and namespaces should be taken from the web.config but are currently hard coded. --- .../RazorCSharpDotCompletionDataProvider.cs | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpDotCompletionDataProvider.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpDotCompletionDataProvider.cs index b5015ec062..0ed8a6889d 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpDotCompletionDataProvider.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpDotCompletionDataProvider.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver; @@ -31,10 +32,32 @@ namespace ICSharpCode.AspNet.Mvc.Completion ParseInformation CreateParseInformationWithWebViewPageClass(ParseInformation parseInfo) { var compilationUnit = new DefaultCompilationUnit(parseInfo.CompilationUnit.ProjectContent); + AddDefaultUsings(compilationUnit); AddWebViewPageClass(compilationUnit); return new ParseInformation(compilationUnit); } + void AddDefaultUsings(ICompilationUnit compilationUnit) + { + AddUsing("System.Web.Mvc", compilationUnit); + AddUsing("System.Web.Mvc.Ajax", compilationUnit); + AddUsing("System.Web.Mvc.Html", compilationUnit); + AddUsing("System.Web.Routing", compilationUnit); + } + + void AddUsing(string name, ICompilationUnit compilationUnit) + { + DefaultUsing defaultUsing = CreateUsing(name, compilationUnit.ProjectContent); + compilationUnit.UsingScope.Usings.Add(defaultUsing); + } + + DefaultUsing CreateUsing(string namespaceName, IProjectContent projectContent) + { + var defaultUsing = new DefaultUsing(projectContent); + defaultUsing.Usings.Add(namespaceName); + return defaultUsing; + } + void AddWebViewPageClass(DefaultCompilationUnit compilationUnit) { DefaultClass webViewPageClass = CreateWebViewPageClass(compilationUnit); @@ -52,12 +75,20 @@ namespace ICSharpCode.AspNet.Mvc.Completion void AddWebViewPageBaseClass(DefaultClass webViewPageClass) { - IClass webViewPageBaseClass = webViewPageClass.ProjectContent.GetClass("System.Web.Mvc.WebViewPage", 0); + IClass webViewPageBaseClass = webViewPageClass.ProjectContent.GetClass("System.Web.Mvc.WebViewPage", 1); if (webViewPageBaseClass != null) { - webViewPageClass.BaseTypes.Add(webViewPageBaseClass.DefaultReturnType); + IReturnType returnType = GetWebViewPageBaseClassReturnType(webViewPageBaseClass); + webViewPageClass.BaseTypes.Add(returnType); } } + IReturnType GetWebViewPageBaseClassReturnType(IClass webViewPageBaseClass) + { + var typeArguments = new List(); + typeArguments.Add(new DynamicReturnType(webViewPageBaseClass.ProjectContent)); + return new ConstructedReturnType(webViewPageBaseClass.DefaultReturnType, typeArguments); + } + DomRegion GetRegionInMiddleOfWebViewPageClass() { return new DomRegion(2, 0, 2, 0);