|
@@ -2,6 +2,7 @@ using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text;
|
|
using Microsoft.CodeAnalysis;
|
|
using Microsoft.CodeAnalysis;
|
|
|
|
+using Microsoft.CodeAnalysis.CSharp;
|
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
using Microsoft.CodeAnalysis.Text;
|
|
using Microsoft.CodeAnalysis.Text;
|
|
|
|
|
|
@@ -163,19 +164,68 @@ namespace Godot.SourceGenerators
|
|
continue;
|
|
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.
|
|
// Fully qualify the value to avoid issues with namespaces.
|
|
string? value = null;
|
|
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(
|
|
exportedMembers.Add(new ExportedPropertyMetadata(
|