Ejemplo n.º 1
0
		public static void GenerateByLabelDictionaries([NotNull]List<PopupMenuItem> rootItems, [NotNull]Dictionary<string, PopupMenuItem> groupsByLabel, [NotNull]Dictionary<string, PopupMenuItem> itemsByLabel)
		{
			itemsByLabel.Clear();
			groupsByLabel.Clear();

			var sb = StringBuilderPool.Create();
			for(int n = rootItems.Count - 1; n >= 0; n--)
			{
				var item = rootItems[n];
				item.FullLabel(sb, '/');
				if(item.IsGroup)
				{
					string key = sb.ToString();
					sb.Length = 0;
					if(!groupsByLabel.ContainsKey(key))
					{
						groupsByLabel.Add(key, item);
					}
					#if DEV_MODE
					else { Debug.LogWarning("groupsByLabel already contained key \""+key+"\"."); }
					#endif
					
					GenerateByLabelDictionaries(item.children, groupsByLabel, itemsByLabel);
				}
				else
				{
					string key = sb.ToString();
					sb.Length = 0;
					if(!itemsByLabel.ContainsKey(key))
					{
						itemsByLabel.Add(key, item);
					}
					#if DEV_MODE
					else { Debug.LogWarning("itemsByLabel already contained key \""+key+"\"."); }
					#endif
				}
			}
			StringBuilderPool.Dispose(ref sb);
		}
Ejemplo n.º 2
0
        private static string GetTooltip(ParameterInfo[] parameterInfos)
        {
            int count = parameterInfos.Length;

            if (count <= 0)
            {
                return("");
            }

            var sb = StringBuilderPool.Create();

            sb.Append('<');
            for (int n = 0; n < count; n++)
            {
                if (n != 0)
                {
                    sb.Append(',');
                }
                sb.Append(parameterInfos[n].ParameterType.Name);
            }
            sb.Append('>');

            return(StringBuilderPool.ToStringAndDispose(ref sb));
        }
        /// <summary>
        /// Tries to parse XML Documentation Comments from script file at path.
        /// </summary>
        /// <param name="scriptAssetPath"></param>
        /// <param name="addToCollection"></param>
        /// <param name="classTypeMustMatch"></param>
        /// <returns> False if failed, either because of write permissions, or because class definition was not found inside script asset. </returns>
        public static bool ParseComments(string scriptAssetPath, [NotNull] Dictionary <string, string> addToCollection, [CanBeNull] Type classTypeMustMatch)
        {
                        #if DEV_MODE && PI_ASSERTATIONS
            UnityEngine.Debug.Assert(scriptAssetPath.EndsWith(".cs", StringComparison.OrdinalIgnoreCase), scriptAssetPath);
                        #endif

            if (classTypeMustMatch != null)
            {
                var  mustBeFound = new List <string>(classTypeMustMatch.FullName.Split('.'));
                bool allFound    = false;

                try
                {
                    using (var reader = new StreamReader(scriptAssetPath))
                    {
                        string line;
                        int    findCount = mustBeFound.Count;

                        while ((line = reader.ReadLine()) != null)
                        {
                            for (int n = findCount - 1; n >= 0; n--)
                            {
                                if (line.IndexOf(mustBeFound[n], StringComparison.Ordinal) != -1)
                                {
                                    mustBeFound.RemoveAt(n);
                                    findCount--;
                                    if (findCount == 0)
                                    {
                                        allFound = true;
                                        break;
                                    }
                                }
                            }

                            if (allFound)
                            {
                                break;
                            }
                        }
                    }
                }
                                #if DEV_MODE
                catch (PathTooLongException e)
                {
                    UnityEngine.Debug.LogError("ParseComments PathTooLongException. Path length was was " + scriptAssetPath.Length + ".\n" + e);
                    return(false);
                }
                catch (DirectoryNotFoundException e)
                {
                    UnityEngine.Debug.LogError("ParseComments DirectoryNotFoundException. Path length was " + scriptAssetPath.Length + ".\n" + e);
                    return(false);
                }
                catch (Exception e)
                {
                    UnityEngine.Debug.LogError("ParseComments " + e.GetType().Name + ". Path length was was " + scriptAssetPath.Length + ".\n" + e);
                    return(false);
                }
                                #else
                catch
                {
                    return(false);
                }
                                #endif

                if (!allFound)
                {
                                        #if DEV_MODE && DEBUG_FAIL_PARSE
                    UnityEngine.Debug.LogWarning("Failed to find the following parts of full class name inside script asset: " + string.Join(", ", mustBeFound.ToArray()) + "\nasset path: " + scriptAssetFullPath);
                                        #endif
                    return(false);
                }
            }

            var commentXml       = StringBuilderPool.Create();
            var memberDefinition = StringBuilderPool.Create();

            try
            {
                using (var reader = new StreamReader(scriptAssetPath))
                {
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        line = line.TrimStart();
                        if (line.StartsWith("///", StringComparison.Ordinal))
                        {
                            commentXml.AppendLine(line.Substring(3));
                        }
                        else if (commentXml.Length > 0)
                        {
                            memberDefinition.AppendLine(line);

                            if (line.IndexOfAny(MemberDefinitionEndCharacters) != -1)
                            {
                                var info = new MemberCommentInfo(commentXml.ToString(), memberDefinition.ToString());
                                commentXml.Length       = 0;
                                memberDefinition.Length = 0;

                                if (info.name.Length > 0 && info.comment.Length > 0)
                                {
                                    if (addToCollection.ContainsKey(info.name))
                                    {
                                                                                #if DEV_MODE
                                        UnityEngine.Debug.LogWarning("ParseComments(" + scriptAssetPath + ") : \"" + info.name + "\" key already in dictionary");
                                                                                #endif
                                        continue;
                                    }

                                    addToCollection.Add(info.name, info.comment);
                                }
                                else
                                {
                                    info.Dispose();
                                }
                            }
                        }
                    }
                }
            }
                        #if DEV_MODE
            catch (PathTooLongException e)
            {
                UnityEngine.Debug.LogError("ParseComments PathTooLongException. Path \"" + scriptAssetPath + "\" length was " + scriptAssetPath.Length + ".\n" + e);
                StringBuilderPool.Dispose(ref commentXml);
                StringBuilderPool.Dispose(ref memberDefinition);
                return(false);
            }
            catch (DirectoryNotFoundException e)
            {
                UnityEngine.Debug.LogError("ParseComments DirectoryNotFoundException. Path was " + scriptAssetPath + ".\n" + e);
                StringBuilderPool.Dispose(ref commentXml);
                StringBuilderPool.Dispose(ref memberDefinition);
                return(false);
            }
            catch (Exception e)
            {
                UnityEngine.Debug.LogError("ParseComments " + e.GetType().Name + ". Path was " + scriptAssetPath + ".\n" + e);
                StringBuilderPool.Dispose(ref commentXml);
                StringBuilderPool.Dispose(ref memberDefinition);
                return(false);
            }
                        #else
            catch
            {
                StringBuilderPool.Dispose(ref commentXml);
                StringBuilderPool.Dispose(ref memberDefinition);
                return(false);
            }
                        #endif

            StringBuilderPool.Dispose(ref commentXml);
            StringBuilderPool.Dispose(ref memberDefinition);
            return(true);
        }