< Summary

Information
Class: Hertzole.ScriptableValues.Generator.IncorrectAttributeUsageAnalyzer
Assembly: Hertzole.ScriptableValues.Generator
File(s): Generator/Hertzole.ScriptableValues.Generator/Analyzers/IncorrectAttributeUsageAnalyzer.cs
Tag: 52_28197466029
Line coverage
0%
Covered lines: 0
Uncovered lines: 24
Coverable lines: 24
Total lines: 70
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 14
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.cctor()100%110%
Initialize(...)100%110%
Action(...)0%14140%

File(s)

Generator/Hertzole.ScriptableValues.Generator/Analyzers/IncorrectAttributeUsageAnalyzer.cs

#LineLine coverage
 1using System.Collections.Immutable;
 2using Microsoft.CodeAnalysis;
 3using Microsoft.CodeAnalysis.CSharp;
 4using Microsoft.CodeAnalysis.CSharp.Syntax;
 5using Microsoft.CodeAnalysis.Diagnostics;
 6
 7namespace Hertzole.ScriptableValues.Generator;
 8
 9[DiagnosticAnalyzer(LanguageNames.CSharp)]
 10public sealed class IncorrectAttributeUsageAnalyzer : DiagnosticAnalyzer
 11{
 012    private static readonly ImmutableArray<DiagnosticDescriptor> supportedDescriptors =
 013        ImmutableArray.Create(DiagnosticRules.IncorrectAttributeUsage);
 14
 015    private static readonly SyntaxKind[] supportedSyntaxKinds = [SyntaxKind.Attribute];
 16
 17    /// <inheritdoc />
 18    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
 19    {
 020        get { return supportedDescriptors; }
 21    }
 22
 23    /// <inheritdoc />
 24    public override void Initialize(AnalysisContext context)
 25    {
 026        context.EnableConcurrentExecution();
 027        context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
 28
 029        context.RegisterSyntaxNodeAction(Action, supportedSyntaxKinds);
 030    }
 31
 32    private static void Action(SyntaxNodeAnalysisContext context)
 33    {
 034        if (context.Node is not AttributeSyntax attributeSyntax)
 35        {
 036            return;
 37        }
 38
 39        // Get symbol
 040        INamedTypeSymbol? attributeSymbol = attributeSyntax.GetAttributeSymbol(context.SemanticModel, context.Cancellati
 041        if (attributeSymbol == null || !attributeSymbol.TryGetCallbackAttribute(out CallbackType _))
 42        {
 43            // This is not a callback attribute, so we don't need to do anything.
 044            return;
 45        }
 46
 47        // Get member declaration
 048        MemberDeclarationSyntax? memberDeclaration = attributeSyntax.FirstAncestorOrSelf<MemberDeclarationSyntax>();
 049        if (memberDeclaration == null)
 50        {
 051            return;
 52        }
 53
 54        // Get wrapper
 055        if (!memberDeclaration.TryGetFieldOrPropertyWrapper(context.SemanticModel, out ImmutableArray<FieldOrPropertyWra
 056            wrappers.IsDefaultOrEmpty)
 57        {
 058            return;
 59        }
 60
 061        FieldOrPropertyWrapper wrapper = wrappers.ItemRef(0);
 062        if (ScriptableValueHelper.TryGetScriptableType(context.SemanticModel, (INamedTypeSymbol) wrapper.Type, out _, ou
 63        {
 64            // The type is a scriptable type, so we don't need to do anything.
 065            return;
 66        }
 67
 068        context.ReportDiagnostic(Diagnostic.Create(DiagnosticRules.IncorrectAttributeUsage, attributeSyntax.GetLocation(
 069    }
 70}