69 lines
2.3 KiB
C#
69 lines
2.3 KiB
C#
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|