From d68d30151934109d28991ca4fe3437d07945c898 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 31 Jul 2014 21:27:53 +0200 Subject: [PATCH] reimplement support for @model ModelTypeName --- .../RazorCSharpCompletionBinding.cs | 35 +++++++++-- .../Completion/RazorCSharpModelTypeLocater.cs | 62 +++++++++---------- 2 files changed, 62 insertions(+), 35 deletions(-) diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpCompletionBinding.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpCompletionBinding.cs index 38b0020cb6..1ab287f0cb 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpCompletionBinding.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpCompletionBinding.cs @@ -18,9 +18,12 @@ using System; using System.IO; +using System.Web.Razor; using ICSharpCode.NRefactory; +using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.CSharp.Resolver; using ICSharpCode.NRefactory.CSharp.TypeSystem; +using ICSharpCode.NRefactory.Editor; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem.Implementation; using ICSharpCode.SharpDevelop; @@ -82,7 +85,7 @@ namespace ICSharpCode.AspNet.Mvc.Completion var currentTypeDefinition = new DefaultUnresolvedTypeDefinition(project.RootNamespace, Path.GetFileNameWithoutExtension(editor.FileName)); ITypeReference baseTypeReference = new GetClassTypeReference("System.Web.Mvc", "WebViewPage", 1); - baseTypeReference = new ParameterizedTypeReference(baseTypeReference, new[] { KnownTypeReference.Object }); + baseTypeReference = new ParameterizedTypeReference(baseTypeReference, new[] { FindModelType(editor) }); currentTypeDefinition.BaseTypes.Add(baseTypeReference); var currentMethod = new DefaultUnresolvedMethod(currentTypeDefinition, "__ContextStub__"); @@ -107,11 +110,35 @@ namespace ICSharpCode.AspNet.Mvc.Completion } var context = new CSharpTypeResolveContext(compilation.MainAssembly, - currentFile.RootUsingScope.Resolve(compilation), - currentResolvedTypeDef, - currentMethod.CreateResolved(resolveContext.WithCurrentTypeDefinition(currentResolvedTypeDef))); + currentFile.RootUsingScope.Resolve(compilation), + currentResolvedTypeDef, + currentMethod.CreateResolved(resolveContext.WithCurrentTypeDefinition(currentResolvedTypeDef))); return new CSharpResolver(context); } + + ITypeReference FindModelType(ITextEditor editor) + { + ParserResults results = ParseTemplate(editor.Document); + string typeName = GetModelTypeName(results); + if (string.IsNullOrWhiteSpace(typeName)) + return KnownTypeReference.Object; + return new CSharpParser().ParseTypeReference(typeName) + .ToTypeReference(NameLookupMode.BaseTypeReference); + } + + ParserResults ParseTemplate(ITextSource textBuffer) + { + var host = new RazorEngineHost(new CSharpRazorCodeLanguage()); + var engine = new RazorTemplateEngine(host); + return engine.ParseTemplate(textBuffer.CreateReader()); + } + + string GetModelTypeName(ParserResults results) + { + var visitor = new RazorCSharpParserModelTypeVisitor(); + results.Document.Accept(visitor); + return visitor.ModelTypeName; + } } static class NRUtils diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpModelTypeLocater.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpModelTypeLocater.cs index e45bc69574..a5cc0ea8be 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpModelTypeLocater.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpModelTypeLocater.cs @@ -16,34 +16,34 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -//using System; -//using System.Web.Razor; -//using ICSharpCode.SharpDevelop; -// -//namespace ICSharpCode.AspNet.Mvc.Completion -//{ -// public class RazorCSharpModelTypeLocater -// { -// public RazorCSharpModelTypeLocater(ITextBuffer textBuffer) -// { -// ParserResults results = ParseTemplate(textBuffer); -// ModelTypeName = GetModelTypeName(results); -// } -// -// ParserResults ParseTemplate(ITextBuffer textBuffer) -// { -// var host = new RazorEngineHost(new CSharpRazorCodeLanguage()); -// var engine = new RazorTemplateEngine(host); -// return engine.ParseTemplate(textBuffer.CreateReader()); -// } -// -// string GetModelTypeName(ParserResults results) -// { -// var visitor = new RazorCSharpParserModelTypeVisitor(); -// results.Document.Accept(visitor); -// return visitor.ModelTypeName; -// } -// -// public string ModelTypeName { get; private set; } -// } -//} +using System; +using System.Web.Razor; +using ICSharpCode.NRefactory.Editor; + +namespace ICSharpCode.AspNet.Mvc.Completion +{ + public class RazorCSharpModelTypeLocater + { + public RazorCSharpModelTypeLocater(ITextSource textBuffer) + { + ParserResults results = ParseTemplate(textBuffer); + ModelTypeName = GetModelTypeName(results); + } + + ParserResults ParseTemplate(ITextSource textBuffer) + { + var host = new RazorEngineHost(new CSharpRazorCodeLanguage()); + var engine = new RazorTemplateEngine(host); + return engine.ParseTemplate(textBuffer.CreateReader()); + } + + string GetModelTypeName(ParserResults results) + { + var visitor = new RazorCSharpParserModelTypeVisitor(); + results.Document.Accept(visitor); + return visitor.ModelTypeName; + } + + public string ModelTypeName { get; private set; } + } +}