Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit d68d301

Browse files
reimplement support for @model ModelTypeName
1 parent 0c84517 commit d68d301

2 files changed

Lines changed: 62 additions & 35 deletions

File tree

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

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@
1818

1919
using System;
2020
using System.IO;
21+
using System.Web.Razor;
2122
using ICSharpCode.NRefactory;
23+
using ICSharpCode.NRefactory.CSharp;
2224
using ICSharpCode.NRefactory.CSharp.Resolver;
2325
using ICSharpCode.NRefactory.CSharp.TypeSystem;
26+
using ICSharpCode.NRefactory.Editor;
2427
using ICSharpCode.NRefactory.TypeSystem;
2528
using ICSharpCode.NRefactory.TypeSystem.Implementation;
2629
using ICSharpCode.SharpDevelop;
@@ -82,7 +85,7 @@ ICodeContext CreateContext(ITextEditor editor)
8285

8386
var currentTypeDefinition = new DefaultUnresolvedTypeDefinition(project.RootNamespace, Path.GetFileNameWithoutExtension(editor.FileName));
8487
ITypeReference baseTypeReference = new GetClassTypeReference("System.Web.Mvc", "WebViewPage", 1);
85-
baseTypeReference = new ParameterizedTypeReference(baseTypeReference, new[] { KnownTypeReference.Object });
88+
baseTypeReference = new ParameterizedTypeReference(baseTypeReference, new[] { FindModelType(editor) });
8689
currentTypeDefinition.BaseTypes.Add(baseTypeReference);
8790

8891
var currentMethod = new DefaultUnresolvedMethod(currentTypeDefinition, "__ContextStub__");
@@ -107,11 +110,35 @@ ICodeContext CreateContext(ITextEditor editor)
107110
}
108111

109112
var context = new CSharpTypeResolveContext(compilation.MainAssembly,
110-
currentFile.RootUsingScope.Resolve(compilation),
111-
currentResolvedTypeDef,
112-
currentMethod.CreateResolved(resolveContext.WithCurrentTypeDefinition(currentResolvedTypeDef)));
113+
currentFile.RootUsingScope.Resolve(compilation),
114+
currentResolvedTypeDef,
115+
currentMethod.CreateResolved(resolveContext.WithCurrentTypeDefinition(currentResolvedTypeDef)));
113116
return new CSharpResolver(context);
114117
}
118+
119+
ITypeReference FindModelType(ITextEditor editor)
120+
{
121+
ParserResults results = ParseTemplate(editor.Document);
122+
string typeName = GetModelTypeName(results);
123+
if (string.IsNullOrWhiteSpace(typeName))
124+
return KnownTypeReference.Object;
125+
return new CSharpParser().ParseTypeReference(typeName)
126+
.ToTypeReference(NameLookupMode.BaseTypeReference);
127+
}
128+
129+
ParserResults ParseTemplate(ITextSource textBuffer)
130+
{
131+
var host = new RazorEngineHost(new CSharpRazorCodeLanguage());
132+
var engine = new RazorTemplateEngine(host);
133+
return engine.ParseTemplate(textBuffer.CreateReader());
134+
}
135+
136+
string GetModelTypeName(ParserResults results)
137+
{
138+
var visitor = new RazorCSharpParserModelTypeVisitor();
139+
results.Document.Accept(visitor);
140+
return visitor.ModelTypeName;
141+
}
115142
}
116143

117144
static class NRUtils

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

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,34 +16,34 @@
1616
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1717
// DEALINGS IN THE SOFTWARE.
1818

19-
//using System;
20-
//using System.Web.Razor;
21-
//using ICSharpCode.SharpDevelop;
22-
//
23-
//namespace ICSharpCode.AspNet.Mvc.Completion
24-
//{
25-
// public class RazorCSharpModelTypeLocater
26-
// {
27-
// public RazorCSharpModelTypeLocater(ITextBuffer textBuffer)
28-
// {
29-
// ParserResults results = ParseTemplate(textBuffer);
30-
// ModelTypeName = GetModelTypeName(results);
31-
// }
32-
//
33-
// ParserResults ParseTemplate(ITextBuffer textBuffer)
34-
// {
35-
// var host = new RazorEngineHost(new CSharpRazorCodeLanguage());
36-
// var engine = new RazorTemplateEngine(host);
37-
// return engine.ParseTemplate(textBuffer.CreateReader());
38-
// }
39-
//
40-
// string GetModelTypeName(ParserResults results)
41-
// {
42-
// var visitor = new RazorCSharpParserModelTypeVisitor();
43-
// results.Document.Accept(visitor);
44-
// return visitor.ModelTypeName;
45-
// }
46-
//
47-
// public string ModelTypeName { get; private set; }
48-
// }
49-
//}
19+
using System;
20+
using System.Web.Razor;
21+
using ICSharpCode.NRefactory.Editor;
22+
23+
namespace ICSharpCode.AspNet.Mvc.Completion
24+
{
25+
public class RazorCSharpModelTypeLocater
26+
{
27+
public RazorCSharpModelTypeLocater(ITextSource textBuffer)
28+
{
29+
ParserResults results = ParseTemplate(textBuffer);
30+
ModelTypeName = GetModelTypeName(results);
31+
}
32+
33+
ParserResults ParseTemplate(ITextSource textBuffer)
34+
{
35+
var host = new RazorEngineHost(new CSharpRazorCodeLanguage());
36+
var engine = new RazorTemplateEngine(host);
37+
return engine.ParseTemplate(textBuffer.CreateReader());
38+
}
39+
40+
string GetModelTypeName(ParserResults results)
41+
{
42+
var visitor = new RazorCSharpParserModelTypeVisitor();
43+
results.Document.Accept(visitor);
44+
return visitor.ModelTypeName;
45+
}
46+
47+
public string ModelTypeName { get; private set; }
48+
}
49+
}

0 commit comments

Comments
 (0)