public static VarDeclarationList Create(IdContainer Container, CodeString Code, List <Modifier> DefaultModifiers = null, VarDeclarationListFlags Flags = VarDeclarationListFlags.Default) { var Ret = new VarDeclarationList(DefaultModifiers); var Rec = Container.State.Language.VarDeclRecognizer; if (Rec != null) { var EnableMessages = (Flags & VarDeclarationListFlags.EnableMessages) != 0; if (!Rec.Recognize(Container, Code, EnableMessages, Ret)) { return(null); } if (!Ret.Process(Container, Flags)) { return(null); } } else { throw new ApplicationException("A variable declaration recognizer is not avaiable"); } return(Ret); }
public bool Process(IdContainer Container, VarDeclarationListFlags Flags = VarDeclarationListFlags.Default) { var RetValue = true; var State = Container.State; var Type = (Identifier)null; var FirstIsVoid = false; for (var i = 0; i < Count; i++) { var e = this[i]; if (FirstIsVoid) { State.Messages.Add(MessageId.NotExpected, e.Declaration); RetValue = false; continue; } if (e.Name.IsValid) { if (!e.Name.IsValidIdentifierName) { if ((Flags & VarDeclarationListFlags.EnableMessages) != 0) { State.Messages.Add(MessageId.NotValidName, e.Name); } RetValue = false; } if (IsDefined(e.Name, i)) { if ((Flags & VarDeclarationListFlags.EnableMessages) != 0) { State.Messages.Add(MessageId.IdAlreadyDefined, e.Name); } RetValue = false; } } else if ((Flags & VarDeclarationListFlags.EnableUnnamed) == 0) { if ((Flags & VarDeclarationListFlags.EnableMessages) != 0) { State.Messages.Add(MessageId.MustBeNamed, e.Declaration); } RetValue = false; } if (e.TypeName.IsValid) { Type = e.Type; Type.SetUsed(); var RType = Type.RealId as Type; if (RType is AutomaticType) { if ((Flags & VarDeclarationListFlags.EnableAutoType) == 0) { if ((Flags & VarDeclarationListFlags.EnableMessages) != 0) { State.Messages.Add(MessageId.Untyped, e.TypeName); } RetValue = false; } } else if (RType == null || (RType.TypeFlags & TypeFlags.CanBeVariable) == 0) { if (RType is VoidType && (Flags & VarDeclarationListFlags.EnableVoidOnly) != 0) { if (e.Name.IsValid) { if ((Flags & VarDeclarationListFlags.EnableMessages) != 0) { State.Messages.Add(MessageId.NotExpected, e.Name); } RetValue = false; continue; } else if (e.InitString.IsValid) { if ((Flags & VarDeclarationListFlags.EnableMessages) != 0) { State.Messages.Add(MessageId.NotExpected, e.InitString); } RetValue = false; continue; } FirstIsVoid = true; } else { if ((Flags & VarDeclarationListFlags.EnableMessages) != 0) { State.Messages.Add(MessageId.CannotBeThisType, e.TypeName); } RetValue = false; } } } else { if (Type != e.Type) { throw new ApplicationException(); } } if (e.InitString.IsValid && (Flags & VarDeclarationListFlags.EnableInitValue) == 0) { if ((Flags & VarDeclarationListFlags.EnableMessages) != 0) { State.Messages.Add(MessageId.CannotHaveInitVal, e.InitString); } RetValue = false; } } return(RetValue); }