resharper/src/CSharp/Feature/RunMarkers/ChickensoftTestRunMarkerProvider.cs (43 lines of code) (raw):
#nullable enable
using JetBrains.Application.Settings;
using JetBrains.ProjectModel;
using JetBrains.ReSharper.Feature.Services.Daemon;
using JetBrains.ReSharper.Plugins.Godot.ProjectModel;
using JetBrains.ReSharper.Psi;
using JetBrains.ReSharper.Psi.Caches.SymbolCache;
using JetBrains.ReSharper.Psi.CSharp;
using JetBrains.ReSharper.Psi.CSharp.Tree;
using JetBrains.ReSharper.Psi.Tree;
using JetBrains.Rider.Backend.Features.RunMarkers;
namespace JetBrains.ReSharper.Plugins.Godot.CSharp.Feature.RunMarkers;
[Language(typeof(CSharpLanguage))]
// [HighlightingSource(HighlightingTypes = [typeof(ChickensoftTestRunMarkerHighlighting)])] is not allowed by contract
public class ChickensoftTestRunMarkerProvider : IRunMarkerProvider
{
public void CollectRunMarkers(IFile file, IContextBoundSettingsStore settings, IHighlightingConsumer consumer)
{
if (file.GetSolution().GetComponent<GodotTracker>().GodotDescriptor == null) return;
if (file is not ICSharpFile csharpFile) return;
foreach (var declaration in CachedDeclarationsCollector.Run<IMethodDeclaration>(csharpFile))
{
if (declaration.DeclaredElement is not { } method) continue;
if (!ChickensoftTestRunMarkerUtil.IsSuitableMethod(method)) continue;
var range = declaration.GetNameDocumentRange();
var type = method.ContainingType;
var testIdentifier = $"{type.GetClrName().ShortName}.{method.ShortName}";
var highlighting = new ChickensoftTestRunMarkerHighlighting(testIdentifier, declaration.IsValid(),
ChickensoftTestRunMarkerAttributeIds.RUN_MARKER_ID, range);
consumer.AddHighlighting(highlighting, range);
}
foreach (var declaration in CachedDeclarationsCollector.Run<IClassDeclaration>(csharpFile))
{
if (declaration.DeclaredElement is not { } @class) continue;
if (!@class.DerivesFromChickenTest()) continue;
var classNameRange = declaration.GetNameDocumentRange();
var classIdentifier = declaration.NameIdentifier.Name;
var classNameHighlighting = new ChickensoftTestRunMarkerHighlighting(classIdentifier, true,
ChickensoftTestRunMarkerAttributeIds.RUN_MARKER_ID, classNameRange);
consumer.AddHighlighting(classNameHighlighting, classNameRange);
}
}
public double Priority => RunMarkerProviderPriority.DEFAULT;
}