You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Merge pull request #65907 from magian1127/4.0FixPropertiesGenerator
C#: Fix Generated ScriptProperty Error.
This commit is contained in:
@@ -2,6 +2,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.CodeAnalysis;
|
||||
using Microsoft.CodeAnalysis.CSharp;
|
||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||
using Microsoft.CodeAnalysis.Text;
|
||||
|
||||
@@ -163,19 +164,68 @@ namespace Godot.SourceGenerators
|
||||
continue;
|
||||
}
|
||||
|
||||
// TODO: Detect default value from simple property getters (currently we only detect from initializers)
|
||||
|
||||
EqualsValueClauseSyntax? initializer = property.DeclaringSyntaxReferences
|
||||
.Select(r => r.GetSyntax() as PropertyDeclarationSyntax)
|
||||
.Select(s => s?.Initializer ?? null)
|
||||
.FirstOrDefault();
|
||||
var propertyDeclarationSyntax = property.DeclaringSyntaxReferences
|
||||
.Select(r => r.GetSyntax() as PropertyDeclarationSyntax).FirstOrDefault();
|
||||
|
||||
// Fully qualify the value to avoid issues with namespaces.
|
||||
string? value = null;
|
||||
if (initializer != null)
|
||||
if (propertyDeclarationSyntax != null)
|
||||
{
|
||||
var sm = context.Compilation.GetSemanticModel(initializer.SyntaxTree);
|
||||
value = initializer.Value.FullQualifiedSyntax(sm);
|
||||
if (propertyDeclarationSyntax.Initializer != null)
|
||||
{
|
||||
var sm = context.Compilation.GetSemanticModel(propertyDeclarationSyntax.Initializer.SyntaxTree);
|
||||
value = propertyDeclarationSyntax.Initializer.Value.FullQualifiedSyntax(sm);
|
||||
}
|
||||
else
|
||||
{
|
||||
var propertyGet = propertyDeclarationSyntax.AccessorList?.Accessors.Where(a => a.Keyword.IsKind(SyntaxKind.GetKeyword)).FirstOrDefault();
|
||||
if (propertyGet != null)
|
||||
{
|
||||
if (propertyGet.ExpressionBody != null)
|
||||
{
|
||||
if (propertyGet.ExpressionBody.Expression is IdentifierNameSyntax identifierNameSyntax)
|
||||
{
|
||||
var sm = context.Compilation.GetSemanticModel(identifierNameSyntax.SyntaxTree);
|
||||
var fieldSymbol = sm.GetSymbolInfo(identifierNameSyntax).Symbol as IFieldSymbol;
|
||||
EqualsValueClauseSyntax? initializer = fieldSymbol?.DeclaringSyntaxReferences
|
||||
.Select(r => r.GetSyntax())
|
||||
.OfType<VariableDeclaratorSyntax>()
|
||||
.Select(s => s.Initializer)
|
||||
.FirstOrDefault(i => i != null);
|
||||
|
||||
if (initializer != null)
|
||||
{
|
||||
sm = context.Compilation.GetSemanticModel(initializer.SyntaxTree);
|
||||
value = initializer.Value.FullQualifiedSyntax(sm);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var returns = propertyGet.DescendantNodes().OfType<ReturnStatementSyntax>();
|
||||
if (returns.Count() == 1)
|
||||
{// Generate only single return
|
||||
var returnStatementSyntax = returns.Single();
|
||||
if (returnStatementSyntax.Expression is IdentifierNameSyntax identifierNameSyntax)
|
||||
{
|
||||
var sm = context.Compilation.GetSemanticModel(identifierNameSyntax.SyntaxTree);
|
||||
var fieldSymbol = sm.GetSymbolInfo(identifierNameSyntax).Symbol as IFieldSymbol;
|
||||
EqualsValueClauseSyntax? initializer = fieldSymbol?.DeclaringSyntaxReferences
|
||||
.Select(r => r.GetSyntax())
|
||||
.OfType<VariableDeclaratorSyntax>()
|
||||
.Select(s => s.Initializer)
|
||||
.FirstOrDefault(i => i != null);
|
||||
|
||||
if (initializer != null)
|
||||
{
|
||||
sm = context.Compilation.GetSemanticModel(initializer.SyntaxTree);
|
||||
value = initializer.Value.FullQualifiedSyntax(sm);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exportedMembers.Add(new ExportedPropertyMetadata(
|
||||
|
||||
Reference in New Issue
Block a user