Browse Source

reimplement support for @model ModelTypeName

pull/520/merge
Siegfried Pammer 11 years ago
parent
commit
d68d301519
  1. 35
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpCompletionBinding.cs
  2. 62
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpModelTypeLocater.cs

35
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpCompletionBinding.cs

@ -18,9 +18,12 @@ @@ -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 @@ -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 @@ -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

62
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpModelTypeLocater.cs

@ -16,34 +16,34 @@ @@ -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; }
}
}

Loading…
Cancel
Save