From 004339b81e8d6633c820a3d703d40c8818e21464 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Fri, 2 May 2025 13:48:53 +0300 Subject: [PATCH 1/3] Improve XML documentation reference parsing and overall performance --- .../SourceCodeEditing/CodeDocsModule.cs | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs b/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs index 48cbda951..09b1f25d1 100644 --- a/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs +++ b/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs @@ -310,6 +310,7 @@ namespace FlaxEditor.Modules.SourceCodeEditing using (var xmlReader = XmlReader.Create(new StreamReader(xmlFilePath))) { result = new Dictionary(); + StringBuilder content = new StringBuilder(2048); while (xmlReader.Read()) { if (xmlReader.NodeType == XmlNodeType.Element && string.Equals(xmlReader.Name, "member", StringComparison.Ordinal)) @@ -318,9 +319,39 @@ namespace FlaxEditor.Modules.SourceCodeEditing var memberReader = xmlReader.ReadSubtree(); if (memberReader.ReadToDescendant("summary")) { - // Remove and replace them with the captured group (the content of the cref). Additionally, getting rid of prefixes - const string crefPattern = @""; - result[rawName] = Regex.Replace(memberReader.ReadInnerXml(), crefPattern, "$1").Replace('\n', ' ').Trim(); + content.Clear(); + do + { + if (memberReader.NodeType == XmlNodeType.Element && memberReader.Read()) + { + while (memberReader.NodeType == XmlNodeType.Text) + { + content.Append(memberReader.Value); + if (memberReader.Read() && memberReader.NodeType == XmlNodeType.Element) + { + var nodeRef = TrimRef(memberReader.GetAttribute("cref")); // + if (nodeRef == null) + nodeRef = memberReader.GetAttribute("name"); // + content.Append(nodeRef); + memberReader.Read(); + + string TrimRef(string str) + { + if (str == null) + return null; + if (str.IndexOf(":FlaxEngine.") == 1) + return str.Substring("T:FlaxEngine.".Length); + return str.Substring("T:".Length); + } + } + } + } + + if (memberReader.NodeType == XmlNodeType.EndElement && memberReader.Name == "summary") + break; + } while (memberReader.Read()); + + result[rawName] = content.ToString().Trim(' ', '\r', '\n'); } } } From c916fb18444969bafdbe9639430ff749abf3abe7 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Fri, 2 May 2025 13:49:41 +0300 Subject: [PATCH 2/3] Avoid clearing cached XML documentation data for Editor assembly --- Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs b/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs index 09b1f25d1..fe50e022f 100644 --- a/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs +++ b/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs @@ -374,7 +374,12 @@ namespace FlaxEditor.Modules.SourceCodeEditing { _typeCache.Clear(); _memberCache.Clear(); - _xmlCache.Clear(); + + foreach (var asm in _xmlCache.Keys.ToArray()) + { + if (asm.IsCollectible) + _xmlCache.Remove(asm); + } } /// From c2e8e492d76c6013ce2a8e398add1204e152af4b Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Fri, 2 May 2025 14:03:14 +0300 Subject: [PATCH 3/3] Defer loading XML documentation during while loading the editor --- Source/Editor/CustomEditors/CustomEditorPresenter.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/Editor/CustomEditors/CustomEditorPresenter.cs b/Source/Editor/CustomEditors/CustomEditorPresenter.cs index 62db53cab..058e712d0 100644 --- a/Source/Editor/CustomEditors/CustomEditorPresenter.cs +++ b/Source/Editor/CustomEditors/CustomEditorPresenter.cs @@ -325,6 +325,7 @@ namespace FlaxEditor.CustomEditors } private bool _buildOnUpdate; + private bool _initialized; private bool _readOnly; /// @@ -412,6 +413,7 @@ namespace FlaxEditor.CustomEditors ClearLayout(); _buildOnUpdate = false; + _initialized = true; Editor.Setup(this); Panel.IsLayoutLocked = false; @@ -488,7 +490,11 @@ namespace FlaxEditor.CustomEditors /// protected virtual void OnSelectionChanged() { - BuildLayout(); + // Defer building the layout after we have initialized to improve initial loading times + if (!_initialized) + _buildOnUpdate = true; + else + BuildLayout(); SelectionChanged?.Invoke(); }