public IEnumerable <LSLLibraryFunctionSignature> LSLFunctions()
        {
            var sigs = new HashSet <LSLLibraryFunctionSignature>();

            foreach (var f in _scriptLibrary.Functions)
            {
                var matches = _functionSig.Regex.Matches(f.Desc);

                if (matches.Count == 0)
                {
                    Log.WriteLineWithHeader("[FirestormLibraryData]: ", "script_library name={0}: function {1} has no signature in doc string",
                                            _scriptLibrary.Name, f.Name);
                    yield break;
                }

                foreach (Match match in matches)
                {
                    if (match.Success)
                    {
                        var sig = LSLLibraryFunctionSignature.Parse(match.ToString());

                        sig.DocumentationString = _functionSig.Regex.Replace(f.Desc, "");

                        if (!sigs.Contains(sig))
                        {
                            sigs.Add(sig);

                            yield return(sig);
                        }
                    }
                }
            }
        }
        public IReadOnlyGenericArray <LSLLibraryFunctionSignature> LSLFunctionOverloads(string name)
        {
            var sigs = new HashSet <LSLLibraryFunctionSignature>();

            foreach (var overload in _scriptLibrary.Functions.Get(name))
            {
                var matches = _functionSig.Regex.Matches(overload.Desc);


                foreach (Match match in matches)
                {
                    if (match.Success)
                    {
                        var sig = LSLLibraryFunctionSignature.Parse(match.ToString());

                        sig.DocumentationString = _functionSig.Regex.Replace(overload.Desc, "");

                        if (!sigs.Contains(sig))
                        {
                            Log.WriteLineWithHeader("[FirestormLibraryData]: ", "script_library name={0}: function {1} signature {2} found in doc string",
                                                    _scriptLibrary.Name, overload.Name, sig.SignatureString);
                            sigs.Add(sig);
                        }
                        else if (matches.Count == 1)
                        {
                            Log.WriteLineWithHeader("[FirestormLibraryData]: ", "function {1} has a duplicate overload caused by multiple xml node definitions",
                                                    _scriptLibrary.Name, sig.Name);
                        }
                        else
                        {
                            Log.WriteLineWithHeader("[FirestormLibraryData]: ", "script_library name={0}: function {1} has a duplicate overload caused by the documentation signature",
                                                    _scriptLibrary.Name, overload.Name);
                        }
                    }
                    else
                    {
                        Log.WriteLineWithHeader("[FirestormLibraryData]: ", "script_library name={0}: function {1} has no signature in doc string",
                                                _scriptLibrary.Name, overload.Name);
                    }
                }
            }

            return(sigs.ToGenericArray());
        }
        public IEnumerable <IReadOnlyGenericArray <LSLLibraryFunctionSignature> > LSLFunctionOverloadGroups()
        {
            foreach (var fs in _scriptLibrary.Functions.OverloadGroups)
            {
                var sigs = new HashSet <LSLLibraryFunctionSignature>();
                foreach (var f in fs)
                {
                    var matches = _functionSig.Regex.Matches(f.Desc);


                    if (matches.Count == 0)
                    {
                        Log.WriteLineWithHeader("[FirestormLibraryData]: ", "script_library name={0}: function {1} has no signature in doc string",
                                                _scriptLibrary.Name, f.Name);
                        continue;
                    }

                    foreach (Match match in matches)
                    {
                        if (match.Success)
                        {
                            var sig = LSLLibraryFunctionSignature.Parse(match.ToString());
                            sig.DocumentationString = _functionSig.Regex.Replace(f.Desc, "");

                            if (!sigs.Contains(sig))
                            {
                                sigs.Add(sig);
                            }
                            else if (matches.Count == 1)
                            {
                                Log.WriteLineWithHeader("[FirestormLibraryData]: ", "script_library name={0}: function {1} has a duplicate overload caused by multiple xml node definitions",
                                                        _scriptLibrary.Name, sig.Name);
                            }
                            else
                            {
                                Log.WriteLineWithHeader("[FirestormLibraryData]: ", "script_library name={0}: function {1} has a duplicate overload caused by the documentation signature",
                                                        _scriptLibrary.Name, sig.Name);
                            }
                        }
                    }
                }
                yield return(sigs.ToGenericArray());
            }
        }
Exemplo n.º 4
0
        private IEnumerable <LSLLibraryFunctionSignature> GetLSLFunctionsFromKeywordsAll()
        {
            var data = _client.DownloadString(SecondlifeWikiBaseUrl + "Category:LSL_Keywords/All");

            var group = _functionsGroupInKeywordsAll.Match(data);

            if (group.Success)
            {
                foreach (Match functionMatch in _functionInKeywordsAll.Matches(group.ToString()))
                {
                    var sig = functionMatch.Groups[1] + " " + functionMatch.Groups[2] + functionMatch.Groups[3];


                    var result = LSLLibraryFunctionSignature.Parse(sig);
                    result.Subsets.SetSubsets(_subsets);
                    yield return(result);
                }
            }
        }
Exemplo n.º 5
0
        private LSLLibraryFunctionSignature GetSigFromFunctionPage(string url)
        {
            var page = _client.DownloadString(url);

            var matches = _functionSignature.Regex.Matches(page);

            if (matches.Count == 0)
            {
                return(null);
            }


            foreach (Match match in matches)
            {
                var functionSignature = LSLLibraryFunctionSignature.Parse(match.Groups[1].ToString());


                functionSignature.Deprecated = _deprecatedMarker.IsMatch(page);

                functionSignature.Subsets.SetSubsets(_subsets);


                if (url.ToLower() != SecondlifeWikiBaseUrl + functionSignature.Name.ToLower())
                {
                    continue;
                }


                Log.WriteLineWithHeader(
                    "[SecondlifeWikiLibraryData]: ", "Retrieved" + (functionSignature.Deprecated ? " (DEPRECATED) " : " ") +
                    "function {0}; from {1}",
                    functionSignature.SignatureString,
                    url);

                return(functionSignature);
            }
            return(null);
        }
Exemplo n.º 6
0
 public string DocumentFunction(LSLLibraryFunctionSignature function)
 {
     return("");
 }
Exemplo n.º 7
0
        public IReadOnlyGenericArray <LSLLibraryFunctionSignature> LSLFunctionOverloads(string name)
        {
            var map = GetFunctionOSDMap(_data, name);

            if (map == null)
            {
                return(new GenericArray <LSLLibraryFunctionSignature> ());
            }

            LSLType returnType = LSLType.Void;

            if (map.ContainsKey("return"))
            {
                var value = map["return"].AsString();
                if (value != "void")
                {
                    returnType = LSLTypeTools.FromLSLTypeName(value);
                }
            }

            LSLLibraryFunctionSignature func = new LSLLibraryFunctionSignature(returnType, name)
            {
                DocumentationString = DocumentFunction(_data, name)
            };

            func.Subsets.SetSubsets(_subsets);
            func.Deprecated = map.ContainsKey("deprecated");


            if (!map.ContainsKey("arguments"))
            {
                return new GenericArray <LSLLibraryFunctionSignature> {
                           func
                }
            }
            ;



            var args = map["arguments"] as OSDArray;

            if (args == null)
            {
                return new GenericArray <LSLLibraryFunctionSignature> {
                           func
                }
            }
            ;


            var paramNameDuplicates = new HashMap <string, int>();

            foreach (var arg in args.Cast <OSDMap>())
            {
                var argName = arg.Keys.First();

                var paramDetails = (OSDMap)arg[argName];

                if (paramNameDuplicates.ContainsKey(argName))
                {
                    //rename duplicates with a trailing number
                    int curValue = paramNameDuplicates[argName];
                    int newValue = curValue + 1;
                    paramNameDuplicates[argName] = newValue;

                    argName = argName + "_" + newValue;
                }
                else
                {
                    paramNameDuplicates.Add(argName, 0);
                }


                func.AddParameter(new LSLParameterSignature(
                                      LSLTypeTools.FromLSLTypeName(paramDetails["type"].AsString()), argName, false));
            }

            return(new GenericArray <LSLLibraryFunctionSignature> {
                func
            });
        }
 /// <summary>
 ///     Allows modification a function signature after its basic information has been serialized, before its returned.
 /// </summary>
 /// <param name="serializer">The <see cref="LSLLibraryDataReflectionSerializer" /> this add-on belongs to.</param>
 /// <param name="info">The <see cref="MethodInfo" /> object the library function signature was serialized from.</param>
 /// <param name="signature">The signature.</param>
 /// <returns><c>true</c> if the method needs to be filtered from the results.</returns>
 public bool MutateSignature(LSLLibraryDataReflectionSerializer serializer, MethodInfo info,
                             LSLLibraryFunctionSignature signature)
 {
     return(MutateSignatureFunction != null && MutateSignatureFunction(serializer, info, signature));
 }
        public string DocumentFunction(LSLLibraryFunctionSignature function)
        {
            var scriptLibraryHasFunction = _scriptLibrary.Functions.Contains(function.Name);

            if (scriptLibraryHasFunction)
            {
                var doc               = "";
                var hasDocSig         = false;
                var hasMatchingDocSig = false;

                foreach (var f in _scriptLibrary.Functions.Get(function.Name))
                {
                    var matches = _functionSig.Regex.Matches(f.Desc);


                    foreach (Match match in matches)
                    {
                        if (match.Success)
                        {
                            hasDocSig = true;
                            var sig = LSLLibraryFunctionSignature.Parse(match.ToString());

                            doc = _functionSig.Regex.Replace(f.Desc, "");

                            if (!sig.SignatureEquivalent(function))
                            {
                                continue;
                            }

                            hasMatchingDocSig = true;

                            break;
                        }

                        doc       = f.Desc;
                        hasDocSig = false;
                    }
                }

                /*
                 * if (function.Name == "lsSetWindlightScene")
                 * {
                 *  Console.WriteLine("test");
                 * }*/

                if (hasDocSig)
                {
                    if (hasMatchingDocSig)
                    {
                        Log.WriteLineWithHeader("[FirestormDocumentationScraper]: ", "script_library name={0}: Matching docstring signature found for function {1}",
                                                _scriptLibrary.Name, function.Name);
                        return(doc);
                    }
                    Log.WriteLineWithHeader("[FirestormDocumentationScraper]: ", "script_library name={0}: Docstring signature found for function {1} mismatches passed function signature",
                                            _scriptLibrary.Name, function.Name);
                    return(doc);
                }

                if (string.IsNullOrWhiteSpace(doc))
                {
                    Log.WriteLineWithHeader("[FirestormDocumentationScraper]: ", "script_library name={0}: Docstring for function {1} is empty",
                                            _scriptLibrary.Name, function.Name);
                    return(null);
                }

                Log.WriteLineWithHeader("[FirestormDocumentationScraper]: ", "script_library name={0}: Docstring found for function {1} did not contain a signature",
                                        _scriptLibrary.Name, function.Name);
                return(doc);
            }

            Log.WriteLineWithHeader("[FirestormDocumentationScraper]: ", "script_library name={0}: Function {1} not defined in firestorm data",
                                    _scriptLibrary.Name, function.Name);

            return(null);
        }
        private IEnumerable <LSLLibraryFunctionSignature> ModuleMethods(Type containerType)
        {
            const BindingFlags bindingFlags = BindingFlags.Default | BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic;


            if (ScriptModuleConstantAttribute == null)
            {
                yield break;
            }


            var methods = containerType.GetMethods(bindingFlags)
                          .Where(x =>
                                 x.GetCustomAttributes(ScriptModuleFunctionAttribute, true).Any());


            var subsets = _subsetsMap[containerType];

            foreach (var v in methods)
            {
                var returnType = LslTypeFromCsharpType(v.ReturnType);


                var pTypes = new GenericArray <LSLParameterSignature>();

                foreach (var p in v.GetParameters().Skip(2))
                {
                    var isVariadic = IsParams(p);
                    if (p.ParameterType == (typeof(object[])) && isVariadic)
                    {
                        pTypes.Add(new LSLParameterSignature(LSLType.Void, p.Name, true));
                        goto omitRestOfParameters;
                    }
                    if (isVariadic)
                    {
                        Log.WriteLineWithHeader("[OpenSimLibraryDataReflector]: ",
                                                "Optional script module function {0} of type {1}, variadic parameter {2} is an un-recognized data type ({3}), function omitted",
                                                v.Name, containerType.Name, p.Name, p.ParameterType.Name);
                        goto omitFunction;
                    }

                    var type = LslTypeFromCsharpParameterType(p.ParameterType);
                    if (type != null)
                    {
                        pTypes.Add(new LSLParameterSignature(type.Value, p.Name, false));
                    }
                    else
                    {
                        Log.WriteLineWithHeader("[OpenSimLibraryDataReflector]: ",
                                                "Optional script module function {0} of type {1}, parameter {2} is an un-recognized data type ({3}), function omitted",
                                                v.Name, containerType.Name, p.Name, p.ParameterType.Name);
                        goto omitFunction;
                    }
                }

omitRestOfParameters:


                if (returnType != null)
                {
                    var f = new LSLLibraryFunctionSignature(returnType.Value, v.Name, pTypes);
                    f.DocumentationString = _documentationProvider.DocumentFunction(f);
                    f.Subsets.SetSubsets(subsets);
                    f.ModInvoke = true;
                    yield return(f);
                }
                else
                {
                    Log.WriteLineWithHeader("[OpenSimLibraryDataReflector]: ",
                                            "Optional script module  {0} of type {1} return type is an un-recognized data type ({2})",
                                            v.Name, containerType.Name, v.ReturnType.Name);
                }

omitFunction:
                ;
            }
        }
        private IEnumerable <LSLLibraryFunctionSignature> InterfaceMethods(Type containerType)
        {
            foreach (var v in containerType.GetMethods())
            {
                var subsets = _subsetsMap[containerType];

                var returnType = LslTypeFromCsharpType(v.ReturnType);

                var pTypes = new GenericArray <LSLParameterSignature>();

                foreach (var p in v.GetParameters())
                {
                    var isVariadic = IsParams(p);
                    if (p.ParameterType == (typeof(object[])) && isVariadic)
                    {
                        pTypes.Add(new LSLParameterSignature(LSLType.Void, p.Name, true));
                        goto omitRestOfParameters;
                    }

                    if (isVariadic)
                    {
                        Log.WriteLineWithHeader("[OpenSimLibraryDataReflector]: ",
                                                "Interface function {0} of type {1}, variadic parameter {2} is an un-recognized data type ({3}), function omitted",
                                                v.Name, containerType.Name, p.Name, p.ParameterType.Name);
                        goto omitFunction;
                    }

                    var type = LslTypeFromCsharpParameterType(p.ParameterType);
                    if (type != null)
                    {
                        pTypes.Add(new LSLParameterSignature(type.Value, p.Name, false));
                    }
                    else
                    {
                        Log.WriteLineWithHeader("[OpenSimLibraryDataReflector]: ",
                                                "Interface function {0} of type {1}, parameter {2} is an un-recognized data type ({3}), function omitted",
                                                v.Name, containerType.Name, p.Name, p.ParameterType.Name);

                        goto omitFunction;
                    }
                }

omitRestOfParameters:

                if (returnType != null)
                {
                    var f = new LSLLibraryFunctionSignature(returnType.Value, v.Name, pTypes);
                    f.DocumentationString = _documentationProvider.DocumentFunction(f);
                    f.Subsets.SetSubsets(subsets);

                    yield return(f);
                }
                else
                {
                    Log.WriteLineWithHeader("[OpenSimLibraryDataReflector]: ",
                                            "function {0} of type {1} return type is an un-recognized data type ({2})",
                                            v.Name, containerType.Name, v.ReturnType.Name);
                }

omitFunction:
                ;
            }
        }
Exemplo n.º 12
0
 public string DocumentFunction(LSLLibraryFunctionSignature function)
 {
     return
         _providers.Select(documentationProvider => documentationProvider.DocumentFunction(function))
             .FirstOrDefault(d => !string.IsNullOrWhiteSpace(d));
 }
Exemplo n.º 13
0
 /// <summary>
 ///     Allows modification a function signature after its basic information has been serialized, before its returned.
 /// </summary>
 /// <param name="serializer">The <see cref="LSLLibraryDataReflectionSerializer" /> this add-on belongs to.</param>
 /// <param name="info">The <see cref="MethodInfo" /> object the library function signature was serialized from.</param>
 /// <param name="signature">The signature.</param>
 /// <returns><c>true</c> if the method needs to be filtered from the results.</returns>
 public bool MutateSignature(LSLLibraryDataReflectionSerializer serializer, MethodInfo info,
                             LSLLibraryFunctionSignature signature)
 {
     return(Filters.Any(filter => filter.MutateSignature(serializer, info, signature)));
 }
        public string DocumentFunction(LSLLibraryFunctionSignature function)
        {
            var v = LLSDLibraryData.DocumentFunction(_data, function.Name);

            return(v);
        }