1818
1919using System ;
2020using System . IO ;
21+ using System . Web . Razor ;
2122using ICSharpCode . NRefactory ;
23+ using ICSharpCode . NRefactory . CSharp ;
2224using ICSharpCode . NRefactory . CSharp . Resolver ;
2325using ICSharpCode . NRefactory . CSharp . TypeSystem ;
26+ using ICSharpCode . NRefactory . Editor ;
2427using ICSharpCode . NRefactory . TypeSystem ;
2528using ICSharpCode . NRefactory . TypeSystem . Implementation ;
2629using 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
0 commit comments