mirror of
https://github.com/godotengine/godot.git
synced 2024-12-27 11:24:59 +08:00
43 lines
1.7 KiB
C#
43 lines
1.7 KiB
C#
|
using System.Collections.Immutable;
|
||
|
using System.Linq;
|
||
|
|
||
|
using Microsoft.CodeAnalysis;
|
||
|
using Microsoft.CodeAnalysis.CSharp;
|
||
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||
|
using Microsoft.CodeAnalysis.Diagnostics;
|
||
|
|
||
|
namespace Godot.SourceGenerators
|
||
|
{
|
||
|
[DiagnosticAnalyzer(LanguageNames.CSharp)]
|
||
|
public class GlobalClassAnalyzer : DiagnosticAnalyzer
|
||
|
{
|
||
|
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
|
||
|
=> ImmutableArray.Create(
|
||
|
Common.GlobalClassMustDeriveFromGodotObjectRule,
|
||
|
Common.GlobalClassMustNotBeGenericRule);
|
||
|
|
||
|
public override void Initialize(AnalysisContext context)
|
||
|
{
|
||
|
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
|
||
|
context.EnableConcurrentExecution();
|
||
|
context.RegisterSyntaxNodeAction(AnalyzeNode, SyntaxKind.ClassDeclaration);
|
||
|
}
|
||
|
|
||
|
private void AnalyzeNode(SyntaxNodeAnalysisContext context)
|
||
|
{
|
||
|
var typeClassDecl = (ClassDeclarationSyntax)context.Node;
|
||
|
|
||
|
// Return if not a type symbol or the type is not a global class.
|
||
|
if (context.ContainingSymbol is not INamedTypeSymbol typeSymbol ||
|
||
|
!typeSymbol.GetAttributes().Any(a => a.AttributeClass?.IsGodotGlobalClassAttribute() ?? false))
|
||
|
return;
|
||
|
|
||
|
if (typeSymbol.IsGenericType)
|
||
|
Common.ReportGlobalClassMustNotBeGeneric(context, typeClassDecl, typeSymbol);
|
||
|
|
||
|
if (!typeSymbol.InheritsFrom("GodotSharp", GodotClasses.GodotObject))
|
||
|
Common.ReportGlobalClassMustDeriveFromGodotObject(context, typeClassDecl, typeSymbol);
|
||
|
}
|
||
|
}
|
||
|
}
|