Browse Source

Fix:A LuaObject cannot reference another LuaObject

Akeit0 11 months ago
parent
commit
c8e8052258

+ 6 - 6
src/Lua.SourceGenerator/LuaObjectGenerator.Emit.cs

@@ -6,7 +6,7 @@ namespace Lua.SourceGenerator;
 
 partial class LuaObjectGenerator
 {
-    static bool TryEmit(TypeMetadata typeMetadata, CodeBuilder builder, SymbolReferences references, Compilation compilation, in SourceProductionContext context)
+    static bool TryEmit(TypeMetadata typeMetadata, CodeBuilder builder, SymbolReferences references, Compilation compilation, in SourceProductionContext context, Dictionary<INamedTypeSymbol, TypeMetadata> metaDict)
     {
         try
         {
@@ -42,7 +42,7 @@ partial class LuaObjectGenerator
                 error = true;
             }
 
-            if (!ValidateMembers(typeMetadata, compilation, references, context))
+            if (!ValidateMembers(typeMetadata, compilation, references, context, metaDict))
             {
                 error = true;
             }
@@ -126,7 +126,7 @@ partial class LuaObjectGenerator
         }
     }
 
-    static bool ValidateMembers(TypeMetadata typeMetadata, Compilation compilation, SymbolReferences references, in SourceProductionContext context)
+    static bool ValidateMembers(TypeMetadata typeMetadata, Compilation compilation, SymbolReferences references, in SourceProductionContext context, Dictionary<INamedTypeSymbol, TypeMetadata> metaDict)
     {
         var isValid = true;
 
@@ -136,7 +136,7 @@ partial class LuaObjectGenerator
             if (SymbolEqualityComparer.Default.Equals(property.Type, typeMetadata.Symbol)) continue;
 
             var conversion = compilation.ClassifyConversion(property.Type, references.LuaValue);
-            if (!conversion.Exists)
+            if (!conversion.Exists && (property.Type is not INamedTypeSymbol namedTypeSymbol || !metaDict.ContainsKey(namedTypeSymbol)))
             {
                 context.ReportDiagnostic(Diagnostic.Create(
                     DiagnosticDescriptors.InvalidPropertyType,
@@ -165,7 +165,7 @@ partial class LuaObjectGenerator
                 if (SymbolEqualityComparer.Default.Equals(typeSymbol, typeMetadata.Symbol)) goto PARAMETERS;
 
                 var conversion = compilation.ClassifyConversion(typeSymbol, references.LuaValue);
-                if (!conversion.Exists)
+                if (!conversion.Exists && (typeSymbol is not INamedTypeSymbol namedTypeSymbol || !metaDict.ContainsKey(namedTypeSymbol)))
                 {
                     context.ReportDiagnostic(Diagnostic.Create(
                         DiagnosticDescriptors.InvalidReturnType,
@@ -184,7 +184,7 @@ partial class LuaObjectGenerator
                 if (SymbolEqualityComparer.Default.Equals(typeSymbol, typeMetadata.Symbol)) continue;
 
                 var conversion = compilation.ClassifyConversion(typeSymbol, references.LuaValue);
-                if (!conversion.Exists)
+                if (!conversion.Exists && (typeSymbol is not INamedTypeSymbol namedTypeSymbol || !metaDict.ContainsKey(namedTypeSymbol)))
                 {
                     context.ReportDiagnostic(Diagnostic.Create(
                         DiagnosticDescriptors.InvalidParameterType,

+ 9 - 4
src/Lua.SourceGenerator/LuaObjectGenerator.cs

@@ -30,13 +30,19 @@ public partial class LuaObjectGenerator : IIncrementalGenerator
 
                 var builder = new CodeBuilder();
 
-                var targetTypes = new List<TypeMetadata>();
+                var metaDict = new Dictionary<INamedTypeSymbol, TypeMetadata>(SymbolEqualityComparer.Default);
 
                 foreach (var (x, _) in list)
                 {
-                    var typeMeta = new TypeMetadata((TypeDeclarationSyntax)x.TargetNode, (INamedTypeSymbol)x.TargetSymbol, references);
+                    var symbol = (INamedTypeSymbol)x.TargetSymbol;
+                    var typeMeta = new TypeMetadata((TypeDeclarationSyntax)x.TargetNode, symbol, references);
+                    metaDict.Add(symbol, typeMeta);
+                }
 
-                    if (TryEmit(typeMeta, builder, references, compilation, in sourceProductionContext))
+                foreach (var pair in metaDict)
+                {
+                    var typeMeta = pair.Value;
+                    if (TryEmit(typeMeta, builder, references, compilation, in sourceProductionContext, metaDict))
                     {
                         var fullType = typeMeta.FullTypeName
                             .Replace("global::", "")
@@ -44,7 +50,6 @@ public partial class LuaObjectGenerator : IIncrementalGenerator
                             .Replace(">", "_");
 
                         sourceProductionContext.AddSource($"{fullType}.LuaObject.g.cs", builder.ToString());
-                        targetTypes.Add(typeMeta);
                     }
 
                     builder.Clear();