Example #1
0
        public void Add(RantFunctionSignature func)
        {
            RantFunctionSignature existing;

            if (_overloads.TryGetValue(func.Parameters.Length, out existing))
            {
                throw new ArgumentException($"Cannot load function {func} becaue its signature is ambiguous with existing function {existing}.");
            }
            if (_paramsArrayFunc != null)
            {
                if (func.HasParamArray)
                {
                    throw new ArgumentException($"Cannot load function {func} because another function with a parameter array was already loaded.");
                }
                if (func.Parameters.Length >= _paramsArrayFunc.Parameters.Length)
                {
                    throw new ArgumentException($"Cannot load function {func} because its signature is ambiguous with {_paramsArrayFunc}.");
                }
            }

            _overloads[func.Parameters.Length] = func;
            if (func.HasParamArray)
            {
                _paramsArrayFunc = func;
            }
        }
Example #2
0
        private static void RegisterFunction(RantFunctionSignature func)
        {
            RantFunction group;

            if (!FunctionTable.TryGetValue(func.Name, out group))
            {
                group = FunctionTable[func.Name] = new RantFunction(func.Name);
            }
            group.Add(func);
        }
Example #3
0
        internal static void Load()
        {
            if (_loaded)
            {
                return;
            }

            // Get every single private static method in the RantFunctions class
            foreach (var method in typeof(RantFunctionRegistry).GetMethods(BindingFlags.Static | BindingFlags.NonPublic))
            {
                if (!method.IsStatic)
                {
                    continue;
                }
                var attr =
                    method.GetCustomAttributes(typeof(RantFunctionAttribute), false).FirstOrDefault() as RantFunctionAttribute;
                if (attr == null)
                {
                    continue;               // Discard methods without a [RantFunction] attribute
                }
                // Compile metadata into RantFunctionInfo
                string name     = string.IsNullOrEmpty(attr.Name) ? method.Name.ToLower() : attr.Name;
                var    descAttr =
                    method.GetCustomAttributes(typeof(RantDescriptionAttribute), false).FirstOrDefault() as RantDescriptionAttribute;
                var info = new RantFunctionSignature(name, descAttr?.Description ?? string.Empty, method);

                if (Util.ValidateName(name))
                {
                    RegisterFunction(info);
                }

                foreach (string alias in attr.Aliases.Where(Util.ValidateName))
                {
                    RegisterAlias(alias, info.Name);
                }
            }
            _loaded = true;
        }