上传新的package
This commit is contained in:
181
Assets/09.CodeChecker/Editor/CodeChecker.cs
Normal file
181
Assets/09.CodeChecker/Editor/CodeChecker.cs
Normal file
@@ -0,0 +1,181 @@
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user