Example #1
0
        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);
        }
Example #2
0
        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);
        }