You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Add MustBeVariant attribute and analyzer
- MustBeVariant attribute can be used to enforce that generic types must be a marshable from/to Variant. - Also renames all diagnostic ids to be valid unicode identifiers.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using System.Linq;
|
||||
using Microsoft.CodeAnalysis;
|
||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||
using Microsoft.CodeAnalysis.Diagnostics;
|
||||
|
||||
namespace Godot.SourceGenerators
|
||||
{
|
||||
@@ -19,7 +20,7 @@ namespace Godot.SourceGenerators
|
||||
"must be declared with the partial modifier.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GODOT-G0001",
|
||||
new DiagnosticDescriptor(id: "GD0001",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
@@ -51,7 +52,7 @@ namespace Godot.SourceGenerators
|
||||
"containing types must be declared with the partial modifier.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GODOT-G0002",
|
||||
new DiagnosticDescriptor(id: "GD0002",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
@@ -78,7 +79,7 @@ namespace Godot.SourceGenerators
|
||||
" Remove the 'static' modifier or the '[Export]' attribute.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GODOT-G0101",
|
||||
new DiagnosticDescriptor(id: "GD0101",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
@@ -104,7 +105,7 @@ namespace Godot.SourceGenerators
|
||||
string description = $"{message}. Use a supported type or remove the '[Export]' attribute.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GODOT-G0102",
|
||||
new DiagnosticDescriptor(id: "GD0102",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
@@ -132,7 +133,7 @@ namespace Godot.SourceGenerators
|
||||
$"{message}. Exported properties must be writable.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GODOT-G0103",
|
||||
new DiagnosticDescriptor(id: "GD0103",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
@@ -156,7 +157,7 @@ namespace Godot.SourceGenerators
|
||||
string description = $"{message}. Exported properties must be readable.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GODOT-G0104",
|
||||
new DiagnosticDescriptor(id: "GD0104",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
@@ -181,7 +182,7 @@ namespace Godot.SourceGenerators
|
||||
string description = $"{message}. Rename the delegate accordingly or remove the '[Signal]' attribute.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GODOT-G0201",
|
||||
new DiagnosticDescriptor(id: "GD0201",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
@@ -205,7 +206,7 @@ namespace Godot.SourceGenerators
|
||||
string description = $"{message}. Use supported types only or remove the '[Signal]' attribute.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GODOT-G0202",
|
||||
new DiagnosticDescriptor(id: "GD0202",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
@@ -229,7 +230,7 @@ namespace Godot.SourceGenerators
|
||||
string description = $"{message}. Return void or remove the '[Signal]' attribute.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GODOT-G0203",
|
||||
new DiagnosticDescriptor(id: "GD0203",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
@@ -239,5 +240,97 @@ namespace Godot.SourceGenerators
|
||||
location,
|
||||
location?.SourceTree?.FilePath));
|
||||
}
|
||||
|
||||
public static readonly DiagnosticDescriptor GenericTypeArgumentMustBeVariantRule =
|
||||
new DiagnosticDescriptor(id: "GD0301",
|
||||
title: "The generic type argument must be a Variant compatible type",
|
||||
messageFormat: "The generic type argument must be a Variant compatible type: {0}",
|
||||
category: "Usage",
|
||||
DiagnosticSeverity.Error,
|
||||
isEnabledByDefault: true,
|
||||
"The generic type argument must be a Variant compatible type. Use a Variant compatible type as the generic type argument.");
|
||||
|
||||
public static void ReportGenericTypeArgumentMustBeVariant(
|
||||
SyntaxNodeAnalysisContext context,
|
||||
SyntaxNode typeArgumentSyntax,
|
||||
ISymbol typeArgumentSymbol)
|
||||
{
|
||||
string message = "The generic type argument " +
|
||||
$"must be a Variant compatible type: '{typeArgumentSymbol.ToDisplayString()}'";
|
||||
|
||||
string description = $"{message}. Use a Variant compatible type as the generic type argument.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GD0301",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
DiagnosticSeverity.Error,
|
||||
isEnabledByDefault: true,
|
||||
description),
|
||||
typeArgumentSyntax.GetLocation(),
|
||||
typeArgumentSyntax.SyntaxTree.FilePath));
|
||||
}
|
||||
|
||||
public static readonly DiagnosticDescriptor GenericTypeParameterMustBeVariantAnnotatedRule =
|
||||
new DiagnosticDescriptor(id: "GD0302",
|
||||
title: "The generic type parameter must be annotated with the MustBeVariant attribute",
|
||||
messageFormat: "The generic type argument must be a Variant type: {0}",
|
||||
category: "Usage",
|
||||
DiagnosticSeverity.Error,
|
||||
isEnabledByDefault: true,
|
||||
"The generic type argument must be a Variant type. Use a Variant type as the generic type argument.");
|
||||
|
||||
public static void ReportGenericTypeParameterMustBeVariantAnnotated(
|
||||
SyntaxNodeAnalysisContext context,
|
||||
SyntaxNode typeArgumentSyntax,
|
||||
ISymbol typeArgumentSymbol)
|
||||
{
|
||||
string message = "The generic type parameter must be annotated with the MustBeVariant attribute";
|
||||
|
||||
string description = $"{message}. Add the MustBeVariant attribute to the generic type parameter.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GD0302",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
DiagnosticSeverity.Error,
|
||||
isEnabledByDefault: true,
|
||||
description),
|
||||
typeArgumentSyntax.GetLocation(),
|
||||
typeArgumentSyntax.SyntaxTree.FilePath));
|
||||
}
|
||||
|
||||
public static readonly DiagnosticDescriptor TypeArgumentParentSymbolUnhandledRule =
|
||||
new DiagnosticDescriptor(id: "GD0303",
|
||||
title: "The generic type parameter must be annotated with the MustBeVariant attribute",
|
||||
messageFormat: "The generic type argument must be a Variant type: {0}",
|
||||
category: "Usage",
|
||||
DiagnosticSeverity.Error,
|
||||
isEnabledByDefault: true,
|
||||
"The generic type argument must be a Variant type. Use a Variant type as the generic type argument.");
|
||||
|
||||
public static void ReportTypeArgumentParentSymbolUnhandled(
|
||||
SyntaxNodeAnalysisContext context,
|
||||
SyntaxNode typeArgumentSyntax,
|
||||
ISymbol parentSymbol)
|
||||
{
|
||||
string message = $"Symbol '{parentSymbol.ToDisplayString()}' parent of a type argument " +
|
||||
"that must be Variant compatible was not handled.";
|
||||
|
||||
string description = $"{message}. Handle type arguments that are children of the unhandled symbol type.";
|
||||
|
||||
context.ReportDiagnostic(Diagnostic.Create(
|
||||
new DiagnosticDescriptor(id: "GD0303",
|
||||
title: message,
|
||||
messageFormat: message,
|
||||
category: "Usage",
|
||||
DiagnosticSeverity.Error,
|
||||
isEnabledByDefault: true,
|
||||
description),
|
||||
typeArgumentSyntax.GetLocation(),
|
||||
typeArgumentSyntax.SyntaxTree.FilePath));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user