a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
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);
|
|
}
|
|
}
|
|
}
|