Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitae668e1

Browse files
committed
new option recompileLuaLib: Recompile the Lua standard library with custom plugins.
1 parent8a43f43 commitae668e1

File tree

9 files changed

+175
-18
lines changed

9 files changed

+175
-18
lines changed

‎package.json‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818
"dist/**/*.js",
1919
"dist/**/*.lua",
2020
"dist/**/*.ts",
21-
"dist/lualib/**/*.json"
21+
"dist/lualib/**/*.json",
22+
"src/lualib/**/*.ts",
23+
"src/lualib/**/*.json",
24+
"language-extensions/index.d.ts"
2225
],
2326
"main":"dist/index.js",
2427
"types":"dist/index.d.ts",

‎src/CompilerOptions.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export interface TypeScriptToLuaOptions {
4646
tstlVerbose?:boolean;
4747
lua51AllowTryCatchInAsyncAwait?:boolean;
4848
measurePerformance?:boolean;
49+
recompileLuaLib?:boolean;
4950
}
5051

5152
exporttypeCompilerOptions=OmitIndexSignature<ts.CompilerOptions>&

‎src/LuaLib.ts‎

Lines changed: 104 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import*aspathfrom"path";
2-
import{EmitHost}from"./transpilation";
2+
import{EmitHost,transpileProject}from"./transpilation";
33
import*asluafrom"./LuaAST";
4-
import{LuaTarget}from"./CompilerOptions";
4+
import{LuaTarget,typeCompilerOptions}from"./CompilerOptions";
55
import{getOrUpdate}from"./utils";
6+
import{createEmitOutputCollector,typeTranspiledFile}from"./transpilation/output-collector";
7+
import{parseConfigFileWithSystem}from"./cli/tsconfig";
8+
import{createDiagnosticReporter}from"./cli/report";
69

710
exportenumLuaLibFeature{
811
ArrayAt="ArrayAt",
@@ -139,12 +142,16 @@ export function resolveLuaLibDir(luaTarget: LuaTarget) {
139142
exportconstluaLibModulesInfoFileName="lualib_module_info.json";
140143
constluaLibModulesInfo=newMap<LuaTarget,LuaLibModulesInfo>();
141144

142-
exportfunctiongetLuaLibModulesInfo(luaTarget:LuaTarget,emitHost:EmitHost):LuaLibModulesInfo{
143-
if(!luaLibModulesInfo.has(luaTarget)){
145+
exportfunctiongetLuaLibModulesInfo(luaTarget:LuaTarget,emitHost:EmitHost,useCache=true):LuaLibModulesInfo{
146+
if(!useCache||!luaLibModulesInfo.has(luaTarget)){
144147
constlualibPath=path.join(resolveLuaLibDir(luaTarget),luaLibModulesInfoFileName);
145148
constresult=emitHost.readFile(lualibPath);
146149
if(result!==undefined){
147-
luaLibModulesInfo.set(luaTarget,JSON.parse(result)asLuaLibModulesInfo);
150+
constinfo=JSON.parse(result)asLuaLibModulesInfo;
151+
if(!useCache){
152+
returninfo;
153+
}
154+
luaLibModulesInfo.set(luaTarget,info);
148155
}else{
149156
thrownewError(`Could not load lualib dependencies from '${lualibPath}'`);
150157
}
@@ -175,7 +182,21 @@ export function getLuaLibExportToFeatureMap(
175182

176183
constlualibFeatureCache=newMap<LuaTarget,Map<LuaLibFeature,string>>();
177184

178-
exportfunctionreadLuaLibFeature(feature:LuaLibFeature,luaTarget:LuaTarget,emitHost:EmitHost):string{
185+
exportfunctionreadLuaLibFeature(
186+
feature:LuaLibFeature,
187+
luaTarget:LuaTarget,
188+
emitHost:EmitHost,
189+
useCache=true
190+
):string{
191+
if(!useCache){
192+
constfeaturePath=path.join(resolveLuaLibDir(luaTarget),`${feature}.lua`);
193+
constluaLibFeature=emitHost.readFile(featurePath);
194+
if(luaLibFeature===undefined){
195+
thrownewError(`Could not load lualib feature from '${featurePath}'`);
196+
}
197+
returnluaLibFeature;
198+
}
199+
179200
constfeatureMap=getOrUpdate(lualibFeatureCache,luaTarget,()=>newMap());
180201
if(!featureMap.has(feature)){
181202
constfeaturePath=path.join(resolveLuaLibDir(luaTarget),`${feature}.lua`);
@@ -257,9 +278,68 @@ export function loadImportedLualibFeatures(
257278
returnstatements;
258279
}
259280

281+
constrecompileLualibCache=newWeakMap<EmitHost,TranspiledFile[]>();
282+
283+
functionrecompileLuaLibFiles(sourceOptions:CompilerOptions,emitHost:EmitHost):TranspiledFile[]{
284+
lettranspiledFiles=recompileLualibCache.get(emitHost);
285+
if(!transpiledFiles){
286+
consttsconfigPath=
287+
sourceOptions.luaTarget===LuaTarget.Lua50
288+
?path.join(__dirname,"./lualib/tsconfig.lua50.json")
289+
:path.join(__dirname,"./lualib/tsconfig.json");
290+
constconfig=parseConfigFileWithSystem(tsconfigPath);
291+
constoptions=config.options;
292+
options.luaPlugins=[...(options.luaPlugins??[]), ...(sourceOptions.luaPlugins??[])];
293+
294+
constcollector=createEmitOutputCollector(options.extension);
295+
constreportDiagnostic=createDiagnosticReporter(false);
296+
297+
const{ diagnostics}=transpileProject(tsconfigPath,options,collector.writeFile);
298+
diagnostics.forEach(reportDiagnostic);
299+
300+
transpiledFiles=collector.files;
301+
recompileLualibCache.set(emitHost,transpiledFiles);
302+
}
303+
304+
returntranspiledFiles;
305+
}
306+
307+
functionrecompileLuaLibBundle(sourceOptions:CompilerOptions,emitHost:EmitHost):string|undefined{
308+
consttranspiledFiles=recompileLuaLibFiles(sourceOptions,emitHost);
309+
constlualibBundle=transpiledFiles.find(f=>f.outPath.endsWith("lualib_bundle.lua"));
310+
returnlualibBundle?.lua;
311+
}
312+
313+
exportfunctionrecompileInlineLualibFeatures(
314+
features:Iterable<LuaLibFeature>,
315+
options:CompilerOptions,
316+
emitHost:EmitHost
317+
):string{
318+
constluaTarget=options.luaTarget??LuaTarget.Universal;
319+
consttranspiledFiles=recompileLuaLibFiles(options,emitHost);
320+
emitHost={
321+
readFile(filePath:string){
322+
constfile=transpiledFiles.find(f=>f.outPath===filePath);
323+
returnfile ?file.text :undefined;
324+
},
325+
}asanyasEmitHost;
326+
constmoduleInfo=getLuaLibModulesInfo(luaTarget,emitHost,false);
327+
returnresolveRecursiveLualibFeatures(features,luaTarget,emitHost,moduleInfo)
328+
.map(feature=>readLuaLibFeature(feature,luaTarget,emitHost,false))
329+
.join("\n");
330+
}
331+
260332
constluaLibBundleContent=newMap<string,string>();
261333

262-
exportfunctiongetLuaLibBundle(luaTarget:LuaTarget,emitHost:EmitHost):string{
334+
exportfunctiongetLuaLibBundle(luaTarget:LuaTarget,emitHost:EmitHost,options:CompilerOptions):string{
335+
if(options.recompileLuaLib){
336+
constresult=recompileLuaLibBundle(options,emitHost);
337+
if(!result){
338+
thrownewError(`Failed to recompile lualib bundle`);
339+
}
340+
returnresult;
341+
}
342+
263343
constlualibPath=path.join(resolveLuaLibDir(luaTarget),"lualib_bundle.lua");
264344
if(!luaLibBundleContent.has(lualibPath)){
265345
constresult=emitHost.readFile(lualibPath);
@@ -279,13 +359,26 @@ export function getLualibBundleReturn(exportedValues: string[]): string {
279359

280360
exportfunctionbuildMinimalLualibBundle(
281361
features:Iterable<LuaLibFeature>,
282-
luaTarget:LuaTarget,
362+
options:CompilerOptions,
283363
emitHost:EmitHost
284364
):string{
285-
constcode=loadInlineLualibFeatures(features,luaTarget,emitHost);
286-
constmoduleInfo=getLuaLibModulesInfo(luaTarget,emitHost);
287-
constexports=Array.from(features).flatMap(feature=>moduleInfo[feature].exports);
365+
constluaTarget=options.luaTarget??LuaTarget.Universal;
366+
letcode;
367+
if(options.recompileLuaLib){
368+
code=recompileInlineLualibFeatures(features,options,emitHost);
369+
consttranspiledFiles=recompileLuaLibFiles(options,emitHost);
370+
emitHost={
371+
readFile(filePath:string){
372+
constfile=transpiledFiles.find(f=>f.outPath===filePath);
373+
returnfile ?file.text :undefined;
374+
},
375+
}asanyasEmitHost;
376+
}else{
377+
code=loadInlineLualibFeatures(features,luaTarget,emitHost);
378+
}
288379

380+
constmoduleInfo=getLuaLibModulesInfo(luaTarget,emitHost,!options.recompileLuaLib);
381+
constexports=Array.from(features).flatMap(feature=>moduleInfo[feature].exports);
289382
returncode+getLualibBundleReturn(exports);
290383
}
291384

‎src/LuaPrinter.ts‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ import { Mapping, SourceMapGenerator, SourceNode } from "source-map";
33
import*astsfrom"typescript";
44
import{CompilerOptions,isBundleEnabled,LuaLibImportKind,LuaTarget}from"./CompilerOptions";
55
import*asluafrom"./LuaAST";
6-
import{loadImportedLualibFeatures,loadInlineLualibFeatures,LuaLibFeature}from"./LuaLib";
6+
import{
7+
loadImportedLualibFeatures,
8+
loadInlineLualibFeatures,
9+
LuaLibFeature,
10+
recompileInlineLualibFeatures,
11+
}from"./LuaLib";
712
import{isValidLuaIdentifier,shouldAllowUnicode}from"./transformation/utils/safe-names";
813
import{EmitHost,getEmitPath}from"./transpilation";
914
import{intersperse,normalizeSlashes}from"./utils";
@@ -246,7 +251,11 @@ export class LuaPrinter {
246251
}elseif(luaLibImport===LuaLibImportKind.Inline&&file.luaLibFeatures.size>0){
247252
// Inline lualib features
248253
sourceChunks.push("-- Lua Library inline imports\n");
249-
sourceChunks.push(loadInlineLualibFeatures(file.luaLibFeatures,luaTarget,this.emitHost));
254+
if(this.options.recompileLuaLib){
255+
sourceChunks.push(recompileInlineLualibFeatures(file.luaLibFeatures,this.options,this.emitHost));
256+
}else{
257+
sourceChunks.push(loadInlineLualibFeatures(file.luaLibFeatures,luaTarget,this.emitHost));
258+
}
250259
sourceChunks.push("-- End of Lua Library inline imports\n");
251260
}
252261

‎src/transpilation/output-collector.ts‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ export interface TranspiledFile {
1212
js?:string;
1313
/**@internal */
1414
jsSourceMap?:string;
15+
/**@internal */
16+
text?:string;
1517
}
1618

1719
exportfunctioncreateEmitOutputCollector(luaExtension=".lua"){
@@ -38,6 +40,7 @@ export function createEmitOutputCollector(luaExtension = ".lua") {
3840
}elseif(fileName.endsWith(".d.ts.map")){
3941
file.declarationMap=data;
4042
}
43+
file.text=data;
4144
};
4245

4346
return{ writeFile, files};

‎src/transpilation/transpile.ts‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,16 @@ export function getProgramTranspileResult(
145145
transpiledFiles=[];
146146
}
147147

148+
constproxyEmitHost=
149+
writeFileResult!==emitHost.writeFile
150+
?newProxy(emitHost,{
151+
get:(target,prop)=>(prop==="writeFile" ?writeFileResult :target[propaskeyofEmitHost]),
152+
})
153+
:emitHost;
154+
148155
for(constpluginofplugins){
149156
if(plugin.afterPrint){
150-
constpluginDiagnostics=plugin.afterPrint(program,options,emitHost,transpiledFiles)??[];
157+
constpluginDiagnostics=plugin.afterPrint(program,options,proxyEmitHost,transpiledFiles)??[];
151158
diagnostics.push(...pluginDiagnostics);
152159
}
153160
}

‎src/transpilation/transpiler.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,9 @@ export class Transpiler {
162162
this.emitHost,
163163
resolvedFiles.map(f=>f.code)
164164
);
165-
returnbuildMinimalLualibBundle(usedFeatures,luaTarget,this.emitHost);
165+
returnbuildMinimalLualibBundle(usedFeatures,options,this.emitHost);
166166
}else{
167-
returngetLuaLibBundle(luaTarget,this.emitHost);
167+
returngetLuaLibBundle(luaTarget,this.emitHost,options);
168168
}
169169
}
170170
}

‎test/transpile/lualib.spec.ts‎

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import*astsfrom"typescript";
2-
import{LuaLibFeature,LuaTarget}from"../../src";
2+
import{LuaLibFeature,LuaLibImportKind,LuaTarget}from"../../src";
33
import{readLuaLibFeature}from"../../src/LuaLib";
44
import*asutilfrom"../util";
5+
importpath= require("path");
56

67
test.each(Object.entries(LuaLibFeature))("Lualib does not use ____exports (%p)",(_,feature)=>{
78
constlualibCode=readLuaLibFeature(feature,LuaTarget.Lua54,ts.sys);
@@ -29,3 +30,39 @@ test("Lualib bundle does not assign globals", () => {
2930
.withLanguageExtensions()
3031
.expectNoExecutionError();
3132
});
33+
34+
test("Lualib bundle recompile",()=>{
35+
const{ transpiledFiles}=util.testExpression`Array.isArray({})`
36+
.setOptions({
37+
recompileLuaLib:true,
38+
luaPlugins:[{name:path.join(__dirname,"./plugins/beforeEmit.ts")}],
39+
})
40+
.expectToHaveNoDiagnostics()
41+
.getLuaResult();
42+
constlualubBundle=transpiledFiles.find(f=>path.basename(f.outPath)==="lualib_bundle.lua");
43+
expect(lualubBundle?.lua).toContain(
44+
"-- Comment added by beforeEmit plugin\n-- Comment added by beforeEmit plugin\n"
45+
);
46+
});
47+
48+
test("Lualib require minimal recompile",()=>{
49+
util.testExpression`Array.isArray(123)`
50+
.setOptions({
51+
luaLibImport:LuaLibImportKind.RequireMinimal,
52+
recompileLuaLib:true,
53+
luaPlugins:[{name:path.join(__dirname,"./plugins/visitor.ts")}],
54+
})
55+
.expectToHaveNoDiagnostics()
56+
.expectToEqual(true);
57+
});
58+
59+
test("Lualib inline recompile",()=>{
60+
util.testExpression`Array.isArray(123)`
61+
.setOptions({
62+
luaLibImport:LuaLibImportKind.Inline,
63+
recompileLuaLib:true,
64+
luaPlugins:[{name:path.join(__dirname,"./plugins/visitor.ts")}],
65+
})
66+
.expectToHaveNoDiagnostics()
67+
.expectToEqual(true);
68+
});

‎tsconfig-schema.json‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@
102102
"measurePerformance": {
103103
"description":"Measure and report performance of the tstl compiler.",
104104
"type":"boolean"
105+
},
106+
"recompileLuaLib": {
107+
"description":"Recompile the Lua standard library with custom plugins.",
108+
"type":"boolean"
105109
}
106110
},
107111
"dependencies": {

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp