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));
|
||
}
|
||
}
|
||
} |