181 lines
6.5 KiB
C#
181 lines
6.5 KiB
C#
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEditor;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
|
|||
|
|
namespace wvdet.CodeChecker
|
|||
|
|
{
|
|||
|
|
public class CodeChecker : EditorWindow
|
|||
|
|
{
|
|||
|
|
private Vector2 _scroll;
|
|||
|
|
private int _warningCount;
|
|||
|
|
private int _errorCount;
|
|||
|
|
|
|||
|
|
private GUIStyle kLabelStyle;
|
|||
|
|
private GUIStyle kHintStyle;
|
|||
|
|
private GUIStyle kSuggestionStyle;
|
|||
|
|
private GUIStyle kWarningStyle;
|
|||
|
|
private GUIStyle kErrorStyle;
|
|||
|
|
private GUIStyle kWaitingStyle;
|
|||
|
|
private GUIStyle kWonderfulStyle;
|
|||
|
|
private static GUIContent _sceneIcon;
|
|||
|
|
|
|||
|
|
public List<Result> Results { get; set; }
|
|||
|
|
|
|||
|
|
private static GUIContent scriptIcon => _sceneIcon ?? (_sceneIcon = EditorGUIUtility.IconContent("d_cs Script Icon"));
|
|||
|
|
|
|||
|
|
[MenuItem("Evo/Utility/优化/代码检查", false, 30)]
|
|||
|
|
public static void TopMenuItem()
|
|||
|
|
{
|
|||
|
|
var wnd = GetWindow<CodeChecker>();
|
|||
|
|
wnd.titleContent = new GUIContent("代码检查");
|
|||
|
|
wnd.minSize = new Vector2(800f, 600f);
|
|||
|
|
|
|||
|
|
EditorApplication.delayCall += () => { wnd.UpdateResults(); };
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void UpdateResults()
|
|||
|
|
{
|
|||
|
|
EditorUtility.DisplayProgressBar("", "代码检查中...", 0);
|
|||
|
|
Results = CheckerUtils.CheckCodes();
|
|||
|
|
Results.ForEach(result => { _errorCount += result.errorCount; });
|
|||
|
|
Results.ForEach(result => { _warningCount += result.warningCount; });
|
|||
|
|
EditorUtility.ClearProgressBar();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void OnGUI()
|
|||
|
|
{
|
|||
|
|
if (kLabelStyle == null)
|
|||
|
|
InitGuiStyles();
|
|||
|
|
|
|||
|
|
EditorGUILayout.Separator();
|
|||
|
|
if (GUILayout.Button("检 查", GUILayout.Height(25)))
|
|||
|
|
UpdateResults();
|
|||
|
|
|
|||
|
|
if (Results == null)
|
|||
|
|
DrawWaitingTip();
|
|||
|
|
else if (Results.Count > 0)
|
|||
|
|
DrawAllResults();
|
|||
|
|
else
|
|||
|
|
DrawWonderfulTip();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DrawAllResults()
|
|||
|
|
{
|
|||
|
|
EditorGUILayout.Separator();
|
|||
|
|
|
|||
|
|
DrawLabel($"错误:{_errorCount}\t\t警告: {_warningCount}");
|
|||
|
|
|
|||
|
|
_scroll = GUILayout.BeginScrollView(_scroll, GUILayout.Height(position.height - 40));
|
|||
|
|
{
|
|||
|
|
GUI.skin.button.alignment = TextAnchor.UpperLeft;
|
|||
|
|
{
|
|||
|
|
foreach (var result in Results)
|
|||
|
|
{
|
|||
|
|
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
|
|||
|
|
{
|
|||
|
|
scriptIcon.text = $"{result.filepath} \t\t (Warning: {result.warningCount} Error: {result.errorCount})";
|
|||
|
|
if (GUILayout.Button(scriptIcon, EditorStyles.linkLabel, GUILayout.Height(20)))
|
|||
|
|
EditorGUIUtility.PingObject(AssetDatabase.LoadAssetAtPath(result.filepath, typeof(Object)));
|
|||
|
|
|
|||
|
|
for (int i = 0; i < result.details.Count; i++)
|
|||
|
|
{
|
|||
|
|
if (i >= 1)
|
|||
|
|
DrawGUILine();
|
|||
|
|
|
|||
|
|
DrawResultDetail(result.details[i]);
|
|||
|
|
|
|||
|
|
if (i < result.details.Count - 1)
|
|||
|
|
EditorGUILayout.Separator();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
EditorGUILayout.EndVertical();
|
|||
|
|
EditorGUILayout.Separator();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
GUI.skin.button.alignment = TextAnchor.MiddleCenter;
|
|||
|
|
}
|
|||
|
|
GUILayout.EndScrollView();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DrawResultDetail(Detail detail)
|
|||
|
|
{
|
|||
|
|
var style = GetLevelStyle(detail.level);
|
|||
|
|
|
|||
|
|
if (!string.IsNullOrWhiteSpace(detail.guideline))
|
|||
|
|
DrawLabel($"规则: {detail.guideline}", style);
|
|||
|
|
|
|||
|
|
if (detail.line > 0)
|
|||
|
|
DrawLabel($"行号: {detail.line}");
|
|||
|
|
if (!string.IsNullOrWhiteSpace(detail.codeSnippet))
|
|||
|
|
EditorGUILayout.LabelField($"当前: {detail.codeSnippet}", kLabelStyle);
|
|||
|
|
// DrawLabel($"当前: {detail.codeSnippet}");
|
|||
|
|
|
|||
|
|
if (!string.IsNullOrWhiteSpace(detail.suggestion))
|
|||
|
|
DrawLabel($"建议: {detail.suggestion}", kSuggestionStyle);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DrawWaitingTip()
|
|||
|
|
{
|
|||
|
|
EditorGUILayout.LabelField("无检查记录,请重新检查", kWaitingStyle, GUILayout.Height(150f));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DrawWonderfulTip()
|
|||
|
|
{
|
|||
|
|
EditorGUILayout.LabelField("未检测出不规范的地方\n继续加油!", kWonderfulStyle, GUILayout.Height(150f));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private GUIStyle GetLevelStyle(Level level)
|
|||
|
|
{
|
|||
|
|
var style = kLabelStyle;
|
|||
|
|
if (level == Level.Hint)
|
|||
|
|
style = kHintStyle;
|
|||
|
|
else if (level == Level.Warning)
|
|||
|
|
style = kWarningStyle;
|
|||
|
|
else if (level == Level.Error)
|
|||
|
|
style = kErrorStyle;
|
|||
|
|
return style;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DrawLabel(string text, GUIStyle style = null)
|
|||
|
|
{
|
|||
|
|
// EditorGUILayout.SelectableLabel($"{space}{text}", style ?? kNormalStyle, GUILayout.Height(16f));
|
|||
|
|
EditorGUILayout.LabelField(text, style ?? kLabelStyle, GUILayout.Height(16f));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void InitGuiStyles()
|
|||
|
|
{
|
|||
|
|
kLabelStyle = new GUIStyle(EditorStyles.label);
|
|||
|
|
kLabelStyle.fontSize = 12;
|
|||
|
|
// kLabelStyle.wordWrap = false;
|
|||
|
|
|
|||
|
|
kHintStyle = new GUIStyle(kLabelStyle);
|
|||
|
|
kHintStyle.normal.textColor = Color.cyan;
|
|||
|
|
|
|||
|
|
kSuggestionStyle = new GUIStyle(kLabelStyle);
|
|||
|
|
kSuggestionStyle.normal.textColor = Color.green;
|
|||
|
|
|
|||
|
|
kWarningStyle = new GUIStyle(kLabelStyle);
|
|||
|
|
kWarningStyle.normal.textColor = Color.yellow;
|
|||
|
|
|
|||
|
|
kErrorStyle = new GUIStyle(kLabelStyle);
|
|||
|
|
kErrorStyle.normal.textColor = Color.red;
|
|||
|
|
|
|||
|
|
kWaitingStyle = new GUIStyle(EditorStyles.label);
|
|||
|
|
kWaitingStyle.fontSize = 30;
|
|||
|
|
kWaitingStyle.fontStyle = FontStyle.Bold;
|
|||
|
|
kWaitingStyle.alignment = TextAnchor.MiddleCenter;
|
|||
|
|
kWaitingStyle.normal.textColor = Color.grey;
|
|||
|
|
|
|||
|
|
kWonderfulStyle = new GUIStyle(kWaitingStyle);
|
|||
|
|
kWonderfulStyle.normal.textColor = Color.green;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void DrawGUILine(int height = 1)
|
|||
|
|
{
|
|||
|
|
Rect rect = EditorGUILayout.GetControlRect(false, height);
|
|||
|
|
rect.height = height;
|
|||
|
|
EditorGUI.DrawRect(rect, new Color(0.5f, 0.5f, 0.5f, 1));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|