Esempio n. 1
0
        public override GamaAttributeSet VisitFuncAttr([NotNull] GamaParser.FuncAttrContext context)
        {
            var names = context.Symbol().Select(s => s.GetText()).ToArray();

            if (names.Distinct().Count() != names.Length)
            {
                Parent.GlobalContext.AddError(new ErrorDuplicateAttributeUsage(context));
                return(null);
            }
            var list = new GamaAttributeSet();

            for (int i = 0; i < names.Length; i++)
            {
                var name = names[i];
                var rule = FindRule(name);
                if (rule == null)
                {
                    Parent.GlobalContext.AddError(new ErrorUnknownAttribute(context));
                    return(null);
                }

                var symlist = context.symbolList(i);
                if (symlist == null)
                {
                    if (rule.ArgTypes.Count != 0)
                    {
                        Parent.GlobalContext.AddError(new ErrorWrongAttributeUsage(symlist));
                        return(null);
                    }

                    list.Add(new GamaAttribute(name));
                }
                else
                {
                    var syms = symlist.Symbol().Select(s => s.GetText()).ToArray();
                    if (syms.Length != rule.ArgTypes.Count)
                    {
                        Parent.GlobalContext.AddError(new ErrorWrongAttributeUsage(symlist));
                        return(null);
                    }

                    list.Add(new GamaAttribute(name, syms));
                }
            }

            return(list);
        }