示例#1
0
        private ProcedureList ListProcedures(Script script, Regex pattern)
        {
            var procedures = new ProcedureList();

            foreach (Module _mod in _compiler.Modules)
            {
                foreach (IScriptProcedure proc in _mod.Procedures)
                {
                    var proc_name = proc.Name;
                    switch (proc_name.ToLower())
                    {
                    case "initialize": procedures.ProcInitialize = new ProcedureItem(_mod, proc_name); break;

                    case "terminate": procedures.ProcTerminate = new ProcedureItem(_mod, proc_name); break;

                    case "setup": procedures.ProcSetup = new ProcedureItem(_mod, proc_name); break;

                    case "teardown": procedures.ProcTearDown = new ProcedureItem(_mod, proc_name); break;

                    case "onerror": procedures.ProcOnError = new ProcedureItem(_mod, proc_name); break;

                    case "iif": break;

                    default:
                        if (proc.HasReturnValue)
                        {
                            continue;
                        }
                        if (!pattern.IsMatch(proc_name))
                        {
                            continue;
                        }
                        ProcedureStringParams proc_params_str;
                        if (script.ProceduresParams.TryGetValue(proc_name, out proc_params_str))
                        {
                            if (!_compiler.Eval("Array(" + proc_params_str.Params + ')'))
                            {
                                var error = new ScriptError(script, new ProcedureItem(_mod, proc_name), "Invalide array: " + proc_params_str.Params);
                                error.AddTraceLine(script, proc_params_str.Line);
                                OnError(error);
                                continue;
                            }
                            var proc_params = (object[])_compiler.Result;
                            foreach (var p in proc_params)
                            {
                                var proc_args = p is object[] ? (object[])p : new object[1] {
                                    p
                                };
                                if (proc_args.Length == proc.NumArgs)
                                {
                                    procedures.Add(_mod, proc_name, proc_args);
                                }
                                else
                                {
                                    var error = new ScriptError(script, new ProcedureItem(_mod, proc_name), string.Format("Procedure {0} requires {1} argument(s). {2} provied.", proc_name, proc.NumArgs, proc_args.Length));
                                    error.AddTraceLine(script, script.TextFormated.GetLineNumber("(Sub|Function).\b" + proc_name + "\b"));
                                    OnError(error);
                                    break;
                                }
                            }
                        }
                        else if (proc.NumArgs == 0)
                        {
                            procedures.Add(_mod, proc_name, new object[0]);
                        }
                        break;
                    }
                }
            }
            return(procedures);
        }