Skip to content

Commit ae3f881

Browse files
committed
fix #323
1 parent 2b2ac83 commit ae3f881

File tree

7 files changed

+101
-43
lines changed

7 files changed

+101
-43
lines changed

CSharp.lua.Launcher/Program.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class Program {
4545
-metadata : export all metadata, use @CSharpLua.Metadata annotations for precise control
4646
-module : the currently compiled assembly needs to be referenced, it's useful for multiple module compiled
4747
-inline-property: inline some single-line properties
48+
-include : the root directory of the CoreSystem library, adds all the dependencies to a single file named out.lua
4849
";
4950
public static void Main(string[] args) {
5051
if (args.Length > 0) {
@@ -77,12 +78,14 @@ public static void Main(string[] args) {
7778
bool isModule = cmds.ContainsKey("-module");
7879
bool isInlineSimpleProperty = cmds.ContainsKey("-inline-property");
7980
bool isNotConstantForEnum = cmds.ContainsKey("-ei");
81+
string include = cmds.GetArgument("-include", true);
8082
Compiler c = new Compiler(input, output, lib, meta, csc, isClassic, atts, enums) {
8183
IsExportMetadata = isExportMetadata,
8284
IsModule = isModule,
8385
IsInlineSimpleProperty = isInlineSimpleProperty,
8486
IsPreventDebugObject = isPreventDebugObject,
8587
IsNotConstantForEnum = isNotConstantForEnum,
88+
Include = include,
8689
};
8790
c.Compile();
8891
Console.WriteLine($"Compiled Success, cost {sw.Elapsed.TotalSeconds}s");

CSharp.lua/Compiler.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ limitations under the License.
1616

1717
using System;
1818
using System.Collections.Generic;
19+
using System.Diagnostics.Contracts;
1920
using System.IO;
2021
using System.Linq;
2122
using System.Reflection;
@@ -40,6 +41,7 @@ public sealed class Compiler {
4041
public bool IsInlineSimpleProperty { get; set; }
4142
public bool IsPreventDebugObject { get; set; }
4243
public bool IsNotConstantForEnum { get; set; }
44+
public string Include { get; set; }
4345

4446
public Compiler(string input, string output, string lib, string meta, string csc, bool isClassic, string atts, string enums) {
4547
input_ = input;
@@ -117,11 +119,36 @@ private static List<string> GetLibs(IEnumerable<string> additionalLibs, out List
117119
}
118120

119121
public void Compile() {
120-
GetGenerator().Generate(output_);
122+
if (Include == null) {
123+
GetGenerator().Generate(output_);
124+
} else {
125+
var luaSystemLibs = GetIncludeCorSysemPaths(Include);
126+
GetGenerator().GenerateSingleFile("out.lua", output_, luaSystemLibs);
127+
}
121128
}
122129

123-
public void CompileSingleFile(string fileName, IEnumerable<string> luaSystemLibs) {
124-
GetGenerator().GenerateSingleFile(fileName, output_, luaSystemLibs);
130+
private static IEnumerable<string> GetIncludeCorSysemPaths(string dir) {
131+
const string kBeinMark = "load(\"";
132+
133+
string allFilePath = Path.Combine(dir, "All.lua");
134+
if (!File.Exists(allFilePath)) {
135+
throw new ArgumentException($"-include: {dir} is not root directory of the CoreSystem library");
136+
}
137+
138+
List<string> luaSystemLibs = new();
139+
var lines = File.ReadAllLines(allFilePath);
140+
foreach (string line in lines) {
141+
int i = line.IndexOf(kBeinMark);
142+
if (i != -1) {
143+
int begin = i + kBeinMark.Length;
144+
int end = line.IndexOf('"', begin);
145+
Contract.Assert(end != -1);
146+
string name = line[begin..end].Replace('.', '/');
147+
string path = Path.Combine(dir, "CoreSystem", $"{name}.lua");
148+
luaSystemLibs.Add(path);
149+
}
150+
}
151+
return luaSystemLibs;
125152
}
126153

127154
private IEnumerable<string> GetSourceFiles(out bool isDirectory) {

CSharp.lua/CoreSystem.Lua/CoreSystem/Core.lua

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1569,9 +1569,11 @@ function System.init(t)
15691569
end
15701570

15711571
System.config = rawget(global, "CSharpLuaSystemConfig") or {}
1572-
1573-
return function (config)
1574-
if config then
1575-
System.config = config
1572+
local isSingleFile = rawget(global, "CSharpLuaSingleFile")
1573+
if not isSingleFile then
1574+
return function (config)
1575+
if config then
1576+
System.config = config
1577+
end
15761578
end
15771579
end

CSharp.lua/LuaAst/LuaCompilationUnitSyntax.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,17 @@ public sealed class LuaCompilationUnitSyntax : LuaSyntaxNode {
6565
internal readonly List<UsingDeclare> UsingDeclares = new List<UsingDeclare>();
6666
internal readonly List<GenericUsingDeclare> GenericUsingDeclares = new List<GenericUsingDeclare>();
6767

68-
public LuaCompilationUnitSyntax(string filePath = "") {
68+
public LuaCompilationUnitSyntax(string filePath = "", bool hasGeneratedMark = true) {
6969
FilePath = filePath;
70-
var info = Assembly.GetExecutingAssembly().GetName();
71-
LuaShortCommentStatement versonStatement = new LuaShortCommentStatement($" Generated by {info.Name} Compiler");
72-
AddStatement(versonStatement);
73-
70+
if (hasGeneratedMark) {
71+
AddStatement(new LuaShortCommentStatement(GeneratedMarkString));
72+
}
7473
var system = LuaIdentifierNameSyntax.System;
7574
AddImport(system, system);
7675
}
7776

77+
public static string GeneratedMarkString => $" Generated by {Assembly.GetExecutingAssembly().GetName().Name} Compiler";
78+
7879
public void AddStatement(LuaStatementSyntax statement) {
7980
Statements.Add(statement);
8081
}

CSharp.lua/LuaSyntaxGenerator.cs

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -197,22 +197,22 @@ public LuaSyntaxGenerator(IEnumerable<(string Text, string Path)> codes, IEnumer
197197
DoPretreatment();
198198
}
199199

200-
private LuaCompilationUnitSyntax CreateCompilationUnit(SyntaxTree syntaxTree) {
200+
private LuaCompilationUnitSyntax CreateCompilationUnit(SyntaxTree syntaxTree, bool isSingleFile) {
201201
var semanticModel = GetSemanticModel(syntaxTree);
202202
var compilationUnitSyntax = (CompilationUnitSyntax)syntaxTree.GetRoot();
203203
var transfor = new LuaSyntaxNodeTransform(this, semanticModel);
204-
return compilationUnitSyntax.Accept<LuaCompilationUnitSyntax>(transfor);
204+
return transfor.VisitCompilationUnit(compilationUnitSyntax, isSingleFile);
205205
}
206206

207-
private Task<LuaCompilationUnitSyntax> CreateCompilationUnitAsync(SyntaxTree syntaxTree) {
208-
return Task.Factory.StartNew(o => CreateCompilationUnit(syntaxTree), null);
207+
private Task<LuaCompilationUnitSyntax> CreateCompilationUnitAsync(SyntaxTree syntaxTree, bool isSingleFile) {
208+
return Task.Factory.StartNew(o => CreateCompilationUnit(syntaxTree, isSingleFile), null);
209209
}
210210

211-
private IEnumerable<LuaCompilationUnitSyntax> Create() {
211+
private IEnumerable<LuaCompilationUnitSyntax> Create(bool isSingleFile = false) {
212212
List<LuaCompilationUnitSyntax> luaCompilationUnits;
213213
if (kIsConcurrent) {
214214
try {
215-
var tasks = compilation_.SyntaxTrees.Select(CreateCompilationUnitAsync);
215+
var tasks = compilation_.SyntaxTrees.Select(i => CreateCompilationUnitAsync(i, isSingleFile));
216216
luaCompilationUnits = Task.WhenAll(tasks).Result.ToList();
217217
} catch (AggregateException e) {
218218
if (e.InnerExceptions.Count > 0) {
@@ -222,7 +222,7 @@ private IEnumerable<LuaCompilationUnitSyntax> Create() {
222222
}
223223
}
224224
} else {
225-
luaCompilationUnits = compilation_.SyntaxTrees.Select(CreateCompilationUnit).ToList();
225+
luaCompilationUnits = compilation_.SyntaxTrees.Select(i => CreateCompilationUnit(i, isSingleFile)).ToList();
226226
}
227227

228228
CheckExportEnums();
@@ -254,21 +254,49 @@ public void Generate(string outFolder) {
254254
public void GenerateSingleFile(string outFile, string outFolder, IEnumerable<string> luaSystemLibs) {
255255
outFile = GetOutFileRelativePath(outFile, outFolder, out _);
256256
using var streamWriter = new StreamWriter(outFile, false, Encoding);
257+
streamWriter.WriteLine("CSharpLuaSingleFile = true");
258+
bool isFirst = true;
257259
foreach (var luaSystemLib in luaSystemLibs) {
258-
WriteLuaSystemLib(luaSystemLib, streamWriter);
260+
WriteLuaSystemLib(luaSystemLib, streamWriter, isFirst);
261+
isFirst = false;
259262
}
260-
foreach (var luaCompilationUnit in Create()) {
263+
streamWriter.WriteLine();
264+
streamWriter.WriteLine(LuaSyntaxNode.Tokens.ShortComment + LuaCompilationUnitSyntax.GeneratedMarkString);
265+
foreach (var luaCompilationUnit in Create(true)) {
261266
WriteCompilationUnit(luaCompilationUnit, streamWriter);
262267
}
263-
if (mainEntryPoint_ is null) {
264-
throw new CompilationErrorException("Program has no main entry point.");
268+
WriteSingleFileManifest(streamWriter);
269+
}
270+
271+
private static string GetSystemLibName(string path) {
272+
const string begin = "CoreSystem";
273+
int index = path.LastIndexOf(begin);
274+
return path.Substring(index + begin.Length + 1);
275+
}
276+
277+
private static void RemoveLicenseComments(ref string code) {
278+
const string kBegin = "--[[";
279+
const string kEnd = "--]]";
280+
int i = code.IndexOf(kBegin);
281+
if (i != -1) {
282+
bool isSpace = code.Take(i).All(char.IsWhiteSpace);
283+
if (isSpace) {
284+
int j = code.IndexOf(kEnd, i + kBegin.Length);
285+
Contract.Assert(j != -1);
286+
code = code.Substring(j + kEnd.Length).Trim();
287+
}
265288
}
266-
WriteManifest(streamWriter);
267289
}
268290

269-
private void WriteLuaSystemLib(string filePath, TextWriter writer) {
291+
private void WriteLuaSystemLib(string filePath, TextWriter writer, bool isFirst) {
292+
writer.WriteLine();
293+
writer.WriteLine("-- CoreSystemLib: {0}", GetSystemLibName(filePath));
270294
writer.WriteLine(LuaSyntaxNode.Keyword.Do);
271-
writer.WriteLine(File.ReadAllText(filePath));
295+
string code = File.ReadAllText(filePath);
296+
if (!isFirst) {
297+
RemoveLicenseComments(ref code);
298+
}
299+
writer.WriteLine(code);
272300
writer.WriteLine(LuaSyntaxNode.Keyword.End);
273301
}
274302

@@ -279,25 +307,20 @@ private void WriteCompilationUnit(LuaCompilationUnitSyntax luaCompilationUnit, T
279307
writer.WriteLine(LuaSyntaxNode.Keyword.End);
280308
}
281309

282-
private void WriteManifest(TextWriter writer) {
283-
const string kManifestFuncName = "InitCSharp";
310+
private void WriteSingleFileManifest(TextWriter writer) {
284311
var types = GetExportTypes();
285312
if (types.Count > 0) {
286-
var functionExpression = new LuaFunctionExpressionSyntax();
287-
var initCSharpFunctionDeclarationStatement = new LuaLocalVariablesSyntax() { Initializer = new LuaEqualsValueClauseListSyntax(functionExpression.ArrayOf()) };
288-
initCSharpFunctionDeclarationStatement.Variables.Add(new LuaSymbolNameSyntax(new LuaIdentifierLiteralExpressionSyntax(kManifestFuncName)));
289-
290313
LuaTableExpression typeTable = new LuaTableExpression();
291314
typeTable.Add("types", new LuaTableExpression(types.Select(i => new LuaStringLiteralExpressionSyntax(GetTypeShortName(i)))));
292-
var methodName = mainEntryPoint_.Name;
293-
var methodTypeName = GetTypeName(mainEntryPoint_.ContainingType);
294-
var entryPointInvocation = new LuaInvocationExpressionSyntax(methodTypeName.MemberAccess(methodName));
295-
functionExpression.AddStatement(LuaIdentifierNameSyntax.SystemInit.Invocation(typeTable));
296-
functionExpression.AddStatement(entryPointInvocation);
297-
298-
LuaCompilationUnitSyntax luaCompilationUnit = new LuaCompilationUnitSyntax();
299-
luaCompilationUnit.AddStatement(new LuaLocalDeclarationStatementSyntax(initCSharpFunctionDeclarationStatement));
300-
315+
LuaCompilationUnitSyntax luaCompilationUnit = new LuaCompilationUnitSyntax(hasGeneratedMark: false);
316+
luaCompilationUnit.AddStatement(LuaIdentifierNameSyntax.SystemInit.Invocation(typeTable));
317+
if (mainEntryPoint_ != null) {
318+
luaCompilationUnit.AddStatement(LuaBlankLinesStatement.One);
319+
var methodName = mainEntryPoint_.Name;
320+
var methodTypeName = GetTypeName(mainEntryPoint_.ContainingType);
321+
var entryPointInvocation = new LuaInvocationExpressionSyntax(methodTypeName.MemberAccess(methodName));
322+
luaCompilationUnit.AddStatement(entryPointInvocation);
323+
}
301324
Write(luaCompilationUnit, writer);
302325
writer.WriteLine();
303326
}

CSharp.lua/LuaSyntaxNodeTransform.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,8 @@ private void ReleaseTempIdentifier(LuaIdentifierNameSyntax tempName) {
230230
--CurFunction.TempCount;
231231
}
232232

233-
public override LuaSyntaxNode VisitCompilationUnit(CompilationUnitSyntax node) {
234-
LuaCompilationUnitSyntax compilationUnit = new LuaCompilationUnitSyntax(node.SyntaxTree.FilePath);
233+
public LuaCompilationUnitSyntax VisitCompilationUnit(CompilationUnitSyntax node, bool isSingleFile = false) {
234+
LuaCompilationUnitSyntax compilationUnit = new LuaCompilationUnitSyntax(node.SyntaxTree.FilePath, !isSingleFile);
235235
compilationUnits_.Push(compilationUnit);
236236

237237
var statements = VisitTriviaAndNode(node, node.Members, false);

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ Options
7171
-p : do not use debug.setmetatable, in some Addon/Plugin environment debug object cannot be used
7272
-metadata : export all metadata, use @CSharpLua.Metadata annotations for precise control
7373
-module : the currently compiled assembly needs to be referenced, it's useful for multiple module compiled
74+
-inline-property: inline some single-line properties
75+
-include : the root directory of the CoreSystem library, adds all the dependencies to a single file named out.lua
7476
```
7577
Make sure that .NET 5.0 is installed.
7678
https://dotnet.microsoft.com/download/dotnet/5.0

0 commit comments

Comments
 (0)