using System.Globalization; using System.Web.Mvc.Resources; using System.Web.Razor.Generator; using System.Web.Razor.Parser; using System.Web.Razor.Text; namespace System.Web.Mvc.Razor { public class MvcCSharpRazorCodeParser : CSharpCodeParser { private const string ModelKeyword = "model"; private const string GenericTypeFormatString = "{0}<{1}>"; private SourceLocation? _endInheritsLocation; private bool _modelStatementFound; public MvcCSharpRazorCodeParser() { MapDirectives(ModelDirective, ModelKeyword); } protected override void InheritsDirective() { // Verify we're on the right keyword and accept AssertDirective(SyntaxConstants.CSharp.InheritsKeyword); AcceptAndMoveNext(); _endInheritsLocation = CurrentLocation; InheritsDirectiveCore(); CheckForInheritsAndModelStatements(); } private void CheckForInheritsAndModelStatements() { if (_modelStatementFound && _endInheritsLocation.HasValue) { Context.OnError(_endInheritsLocation.Value, String.Format(CultureInfo.CurrentCulture, MvcResources.MvcRazorCodeParser_CannotHaveModelAndInheritsKeyword, ModelKeyword)); } } protected virtual void ModelDirective() { // Verify we're on the right keyword and accept AssertDirective(ModelKeyword); AcceptAndMoveNext(); SourceLocation endModelLocation = CurrentLocation; BaseTypeDirective( String.Format(CultureInfo.CurrentCulture, MvcResources.MvcRazorCodeParser_ModelKeywordMustBeFollowedByTypeName, ModelKeyword), CreateModelCodeGenerator); if (_modelStatementFound) { Context.OnError(endModelLocation, String.Format(CultureInfo.CurrentCulture, MvcResources.MvcRazorCodeParser_OnlyOneModelStatementIsAllowed, ModelKeyword)); } _modelStatementFound = true; CheckForInheritsAndModelStatements(); } private SpanCodeGenerator CreateModelCodeGenerator(string model) { return new SetModelTypeCodeGenerator(model, GenericTypeFormatString); } } }