Exemple #1
0
        /// <summary>
        /// Writes the help for the specified function.
        /// </summary>
        /// <param name="command">The name of the function to output help for.</param>
        /// <returns>The help for the specified function.</returns>
        public string WriteHelp(string command)
        {
            LuaFunctionDescriptor func = (LuaFunctionDescriptor)_packageFunctions[command];
            string output = null;

            if (func != null)
            {
                output = func.FunctionFullDocumentation;
            }

            return(output);
        }
Exemple #2
0
        /// <summary>
        /// Adds a function to the Lua package.
        /// </summary>
        /// <param name="function">The function to add.</param>
        public void AddFunction(LuaFunctionDescriptor function)
        {
            if (_packageFunctions == null)
            {
                _packageFunctions = new Hashtable();
            }

            if (!_packageFunctions.ContainsKey(function.FunctionName))
            {
                _packageFunctions.Add(function.FunctionName, function);
            }
        }
        public void Help(string command)
        {
            if (_functions.Contains(command))
            {
                LuaFunctionDescriptor func = (LuaFunctionDescriptor)_functions[command];

                Console.WriteLine(func.FunctionFullDocumentation);

                return;
            }

            if (command.IndexOf(".") == -1)
            {
                if (_packages.ContainsKey(command))
                {
                    LuaPackageDescriptor pkg = (LuaPackageDescriptor)_packages[command];

                    Console.WriteLine(pkg.WriteHelp(command));

                    return;
                }
                else
                {
                    Console.WriteLine("No such function or package: " + command);

                    return;
                }
            }

            string[] parts = command.Split('.');

            if (!_packages.ContainsKey(parts[0]))
            {
                Console.WriteLine("No such function or package: " + command);

                return;
            }

            LuaPackageDescriptor desc = (LuaPackageDescriptor)_packages[parts[0]];

            if (!desc.HasFunction(parts[1]))
            {
                Console.WriteLine("Package " + parts[0] + " doesn't have a " + parts[1] + " function.");

                return;
            }

            Console.WriteLine(desc.WriteHelp(parts[1]));
        }
        /// <summary>
        /// Registers the Lua-attributed functions in the target object.
        /// </summary>
        /// <param name="target">The target to load Lua-attributed functions from.</param>
        /// <param name="package">The package to register the functions under.</param>
        /// <param name="packageDocumentation">The documentation for the package.</param>
        public void RegisterLuaFunctions( object target, string package, string packageDocumentation )
        {
            // Sanity checks
            if ( target == null || _lua == null || _functions == null || _packages == null )
                return;

            try
            {
                LuaPackageDescriptor pPackage = null;

                Console.WriteLine("Loading Lua library: " + target.ToString());

                if ( package != null )
                {
                    // Check if the package already exists
                    if ( !_packages.ContainsKey( "package" ) )
                    {
                        // Create a new package
                        _lua.DoString( package + " = {}" );
                        pPackage = new LuaPackageDescriptor( package, packageDocumentation );
                    }
                    else	// Access the old package
                        pPackage = (LuaPackageDescriptor) _packages["package"];
                }

                // Get the target type
                Type targetType = target.GetType();

                // ... and simply iterate through all its methods
                foreach ( MethodInfo info in targetType.GetMethods() )
                {
                    // ... then through all this method's attributes
                    foreach ( Attribute attr in Attribute.GetCustomAttributes( info ) )
                    {
                        // ... and if they happen to be one of our LuaFunctionAttribute attributes
                        if ( attr.GetType() == typeof( LuaFunctionAttribute ) )
                        {
                            LuaFunctionAttribute luaAttr = (LuaFunctionAttribute) attr;
                            ArrayList paramList = new ArrayList();
                            ArrayList paramDocs = new ArrayList();

                            // Get the desired function name and doc string, along with parameter info
                            string fName = luaAttr.FunctionName;
                            string fDoc = luaAttr.FunctionDocumentation;
                            string[] pDocs = luaAttr.FunctionParameters;

                            // Now get the expected parameters from the MethodInfo object
                            ParameterInfo[] pInfo = info.GetParameters();

                            // If they don't match, someone forgot to add some documentation to the
                            // attribute, complain and go to the next method
                            if ( pDocs != null && ( pInfo.Length != pDocs.Length ) )
                            {
                                Console.WriteLine( "Function " + info.Name + " (exported as " +
                                    fName + ") argument number mismatch. Declared " +
                                    pDocs.Length + " but requires " + pInfo.Length + "." );

                                break;
                            }

                            // Build a parameter <-> parameter doc hashtable
                            for ( int i = 0; i < pInfo.Length; i++ )
                            {
                                paramList.Add( pInfo[i].Name );
                                paramDocs.Add( pDocs[i] );
                            }

                            // Get a new function descriptor from this information
                            LuaFunctionDescriptor func = new LuaFunctionDescriptor( fName, fDoc, paramList,
                                paramDocs );

                            if ( pPackage != null )
                            {
                                // Check if the package already contains the function
                                if ( !pPackage.Functions.ContainsKey( fName ) )
                                {
                                    // Add the new package function
                                    pPackage.AddFunction( func );
                                    _lua.RegisterFunction( package + fName, target, info );
                                    _lua.DoString( package + "." + fName + " = " + package + fName );
                                    _lua.DoString( package + fName + " = nil" );
                                }
                            }
                            else
                            {
                                // Check if the function has already been loaded
                                if ( !_functions.ContainsKey( fName ) )
                                {
                                    // Add it to the global hashtable
                                    _functions.Add( fName, func );

                                    // And tell the VM to register it
                                    _lua.RegisterFunction( fName, target, info );
                                }
                            }
                        }
                    }
                }

                if ( pPackage != null && !_packages.ContainsKey( package ) )
                    _packages.Add( package, pPackage );
            }
            catch ( Exception e )
            {
            }
            finally
            {
            }
        }
        /// <summary>
        /// Registers the Lua-attributed functions in the target object.
        /// </summary>
        /// <param name="target">The target to load Lua-attributed functions from.</param>
        /// <param name="package">The package to register the functions under.</param>
        /// <param name="packageDocumentation">The documentation for the package.</param>
        public void RegisterLuaFunctions(object target, string package, string packageDocumentation)
        {
            // Sanity checks
            if (target == null || _lua == null || _functions == null || _packages == null)
            {
                return;
            }

            try
            {
                LuaPackageDescriptor pPackage = null;

                Console.WriteLine("Loading Lua library: " + target.ToString());

                if (package != null)
                {
                    // Check if the package already exists
                    if (!_packages.ContainsKey("package"))
                    {
                        // Create a new package
                        _lua.DoString(package + " = {}");
                        pPackage = new LuaPackageDescriptor(package, packageDocumentation);
                    }
                    else                        // Access the old package
                    {
                        pPackage = (LuaPackageDescriptor)_packages["package"];
                    }
                }

                // Get the target type
                Type targetType = target.GetType();

                // ... and simply iterate through all its methods
                foreach (MethodInfo info in targetType.GetMethods())
                {
                    // ... then through all this method's attributes
                    foreach (Attribute attr in Attribute.GetCustomAttributes(info))
                    {
                        // ... and if they happen to be one of our LuaFunctionAttribute attributes
                        if (attr.GetType() == typeof(LuaFunctionAttribute))
                        {
                            LuaFunctionAttribute luaAttr   = (LuaFunctionAttribute)attr;
                            ArrayList            paramList = new ArrayList();
                            ArrayList            paramDocs = new ArrayList();

                            // Get the desired function name and doc string, along with parameter info
                            string   fName = luaAttr.FunctionName;
                            string   fDoc  = luaAttr.FunctionDocumentation;
                            string[] pDocs = luaAttr.FunctionParameters;

                            // Now get the expected parameters from the MethodInfo object
                            ParameterInfo[] pInfo = info.GetParameters();

                            // If they don't match, someone forgot to add some documentation to the
                            // attribute, complain and go to the next method
                            if (pDocs != null && (pInfo.Length != pDocs.Length))
                            {
                                Console.WriteLine("Function " + info.Name + " (exported as " +
                                                  fName + ") argument number mismatch. Declared " +
                                                  pDocs.Length + " but requires " + pInfo.Length + ".");

                                break;
                            }

                            // Build a parameter <-> parameter doc hashtable
                            for (int i = 0; i < pInfo.Length; i++)
                            {
                                paramList.Add(pInfo[i].Name);
                                paramDocs.Add(pDocs[i]);
                            }

                            // Get a new function descriptor from this information
                            LuaFunctionDescriptor func = new LuaFunctionDescriptor(fName, fDoc, paramList,
                                                                                   paramDocs);

                            if (pPackage != null)
                            {
                                // Check if the package already contains the function
                                if (!pPackage.Functions.ContainsKey(fName))
                                {
                                    // Add the new package function
                                    pPackage.AddFunction(func);
                                    _lua.RegisterFunction(package + fName, target, info);
                                    _lua.DoString(package + "." + fName + " = " + package + fName);
                                    _lua.DoString(package + fName + " = nil");
                                }
                            }
                            else
                            {
                                // Check if the function has already been loaded
                                if (!_functions.ContainsKey(fName))
                                {
                                    // Add it to the global hashtable
                                    _functions.Add(fName, func);

                                    // And tell the VM to register it
                                    _lua.RegisterFunction(fName, target, info);
                                }
                            }
                        }
                    }
                }

                if (pPackage != null && !_packages.ContainsKey(package))
                {
                    _packages.Add(package, pPackage);
                }
            }
            catch (Exception e)
            {
            }
            finally
            {
            }
        }