diff --git a/CSharp.lua/LuaAst/LuaTypeDeclarationSyntax.cs b/CSharp.lua/LuaAst/LuaTypeDeclarationSyntax.cs index e7319cc6..b3fd589a 100644 --- a/CSharp.lua/LuaAst/LuaTypeDeclarationSyntax.cs +++ b/CSharp.lua/LuaAst/LuaTypeDeclarationSyntax.cs @@ -117,7 +117,7 @@ internal void AddTypeParameters(IEnumerable typeParamet } internal bool AddGenericImport(LuaInvocationExpressionSyntax invocationExpression, string name, List argumentTypeNames, bool isFromCode, out GenericUsingDeclare genericUsingDeclare) { - if (genericUsingDeclares_.Exists(i => i.NewName == name)) { + if (IsGenericImportExists(name)) { genericUsingDeclare = null; return true; } @@ -132,6 +132,10 @@ internal bool AddGenericImport(LuaInvocationExpressionSyntax invocationExpressio return true; } + internal bool IsGenericImportExists(string name) { + return genericUsingDeclares_.Exists(i => i.NewName == name); + } + internal void AddBaseTypes(IEnumerable baseTypes, LuaSpecialGenericType genericArgument, List baseCopyFields) { bool hasLazyGenericArgument = false; if (genericArgument != null) { @@ -610,11 +614,7 @@ private void CheckGenericUsingDeclares(LuaBlockSyntax body) { if (genericUsingDeclares_.Count > 0) { genericUsingDeclares_.Sort(); foreach (var import in genericUsingDeclares_) { - LuaExpressionSyntax expression = import.InvocationExpression; - if (import.IsFromGlobal) { - expression = LuaIdentifierNameSyntax.Global.MemberAccess(expression); - } - body.AddStatement(new LuaLocalVariableDeclaratorSyntax(import.NewName, expression)); + body.AddStatement(new LuaLocalVariableDeclaratorSyntax(import.NewName, import.InvocationExpression)); } } } diff --git a/CSharp.lua/LuaSyntaxGenerator.cs b/CSharp.lua/LuaSyntaxGenerator.cs index 90355b48..03dc858b 100644 --- a/CSharp.lua/LuaSyntaxGenerator.cs +++ b/CSharp.lua/LuaSyntaxGenerator.cs @@ -283,7 +283,8 @@ public void GenerateSingleFile(string outFile, string outFolder, IEnumerable Path.GetFileName(i.FilePath)); + foreach (var luaCompilationUnit in compilationUnits) { WriteCompilationUnit(luaCompilationUnit, streamWriter); } WriteSingleFileManifest(streamWriter); @@ -2031,9 +2032,9 @@ internal LuaExpressionSyntax GetTypeName(ISymbol symbol, LuaSyntaxNodeTransform if (genericTokenPos != -1) { return name[..genericTokenPos]; } - return typeName; } + var invocationExpression = new LuaInvocationExpressionSyntax(typeName); invocationExpression.AddArguments(typeArguments); LuaExpressionSyntax luaExpression = invocationExpression; diff --git a/CSharp.lua/LuaSyntaxNodeTransform.Helper.cs b/CSharp.lua/LuaSyntaxNodeTransform.Helper.cs index fdae2b6f..d653768d 100644 --- a/CSharp.lua/LuaSyntaxNodeTransform.Helper.cs +++ b/CSharp.lua/LuaSyntaxNodeTransform.Helper.cs @@ -1051,9 +1051,15 @@ internal void ImportGenericTypeName(ref LuaExpressionSyntax luaExpression, IType } else { success = CurTypeDeclaration.TypeDeclaration.AddGenericImport(invocationExpression, newName, argumentTypeNames, symbol.IsAbsoluteFromCode(), out var declare); if (declare != null) { + CheckGenericDeclareTypeArgument(declare, invocationExpression, symbol); bool hasAdd = generator_.AddGenericImportDepend(CurTypeDeclaration.TypeSymbol, symbol.OriginalDefinition as INamedTypeSymbol); if (hasAdd && CurCompilationUnit.IsUsingDeclareConflict(invocationExpression)) { declare.IsFromGlobal = true; + declare.InvocationExpression = new LuaInvocationExpressionSyntax( + LuaIdentifierNameSyntax.Global.MemberAccess(invocationExpression.Expression), + invocationExpression.ArgumentList.Arguments); + } + if (declare.IsFromGlobal) { CurTypeDeclaration.TypeDeclaration.AddGlobalParameter(); } } @@ -1065,6 +1071,31 @@ internal void ImportGenericTypeName(ref LuaExpressionSyntax luaExpression, IType } } + private void CheckGenericDeclareTypeArgument(GenericUsingDeclare declare, LuaInvocationExpressionSyntax invocation, ITypeSymbol symbol) { + if (declare.IsFromCode) { + if (symbol is INamedTypeSymbol nameTypeSymbol) { + int i = 0; + foreach (var typeArgument in nameTypeSymbol.TypeArguments) { + if (typeArgument.Kind != SymbolKind.TypeParameter && typeArgument.IsFromCode()) { + var argumentExpression = invocation.ArgumentList.Arguments[i]; + if (argumentExpression is LuaIdentifierNameSyntax identifier) { + string name = identifier.ValueText; + int j = name.IndexOf('.'); + if (j != -1) { + name = name.Substring(0, j); + } + if (!CurTypeDeclaration.TypeDeclaration.IsGenericImportExists(name)) { + invocation.ArgumentList.Arguments[i] = LuaIdentifierNameSyntax.Global.MemberAccess(argumentExpression); + declare.IsFromGlobal = true; + } + } + } + ++i; + } + } + } + } + private static void FillGenericTypeImportName(StringBuilder sb, List argumentTypeNames, LuaInvocationExpressionSyntax invocationExpression) { static string CheckLastName(string lastName) { return lastName == "Dictionary" ? "Dict" : lastName;