// Copyright (c) Wojciech Figat. All rights reserved. using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using FlaxEditor.Scripting; using FlaxEngine; namespace FlaxEditor.Modules.SourceCodeEditing { /// /// Source code documentation module. /// /// public sealed class CodeDocsModule : EditorModule { private Dictionary _typeCache = new Dictionary(); private Dictionary _memberCache = new Dictionary(); internal CodeDocsModule(Editor editor) : base(editor) { } /// /// Gets the tooltip text for the type. /// /// The type. /// The type attributes. Optional, if null type attributes will be used. /// The documentation tooltip. public string GetTooltip(Type type, object[] attributes = null) { return GetTooltip(new ScriptType(type), attributes); } /// /// Gets the tooltip text for the type. /// /// The type. /// The type attributes. Optional, if null type attributes will be used. /// The documentation tooltip. public string GetTooltip(ScriptType type, object[] attributes = null) { // Try to use cache if (_typeCache.TryGetValue(type, out var text)) return text; // Try to use tooltip attribute if (attributes == null) attributes = type.GetAttributes(false); text = type.TypeName; var tooltip = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); if (tooltip != null) text += '\n' + tooltip.Text; else if (type.Type != null) { // Try to use xml docs for managed type var xmlDoc = DebugCommands.GetXml(type.Type); if (xmlDoc != null) text += '\n' + xmlDoc; } _typeCache.Add(type, text); return text; } /// /// Gets the tooltip text for the type member. /// /// The type. /// The member name. /// The member attributes. Optional, if null member attributes will be used. /// The documentation tooltip. public string GetTooltip(Type type, string memberName, object[] attributes = null) { var member = new ScriptType(type).GetMember(memberName, MemberTypes.All, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance); return GetTooltip(member, attributes); } /// /// Gets the tooltip text for the type member. /// /// The type member. /// The member attributes. Optional, if null member attributes will be used. /// The documentation tooltip. public string GetTooltip(ScriptMemberInfo member, object[] attributes = null) { // Try to use cache if (_memberCache.TryGetValue(member, out var text)) return text; // Try to use tooltip attribute if (attributes == null) attributes = member.GetAttributes(true); var tooltip = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); if (tooltip != null) text = tooltip.Text; else if (member.Type != null) { // Try to use xml docs for managed member var xmlDoc = DebugCommands.GetXml(member.Type); if (xmlDoc != null) text = xmlDoc; } _memberCache.Add(member, text); return text; } private void OnTypesCleared() { _typeCache.Clear(); _memberCache.Clear(); DebugCommands.ClearXml(); } /// public override void OnInit() { base.OnInit(); Editor.CodeEditing.TypesCleared += OnTypesCleared; } /// public override void OnExit() { OnTypesCleared(); base.OnExit(); } } }