From 1e779014523bf774664e738d2395223b5caa85ba Mon Sep 17 00:00:00 2001 From: mattias Date: Mon, 7 Feb 2022 21:00:20 +0100 Subject: [PATCH] pastojs: changed library exports to export const statements --- packages/pastojs/src/fppas2js.pp | 36 +++++++++++++++++++++------- packages/pastojs/tests/tcmodules.pas | 12 ++++++---- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index 54a7d393b8..72921f3e5f 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -18040,6 +18040,16 @@ end; procedure TPasToJSConverter.CreateExportsSection(El: TPasLibrary; Src: TJSSourceElements; AContext: TConvertContext); +// functions: +// export const func1 = pas.unit1.func1; +// variables: +// export const vars = {}; +// Object.defineProperties(vars, { +// Var1: { +// get: function(){return pas.unit1.Var1;}, +// set: function(v){pas.unit1.Var1 = v;}, +// } +// }); var ExportSymbols: TFPList; aResolver: TPas2JSResolver; @@ -18048,20 +18058,19 @@ var Symb: TPasExportSymbol; Ref: TResolvedReference; NamePath: String; + AliasName: TJSString; EvalValue: TResEvalValue; - ExpNameJS: TJSExportNameElement; Decl: TPasElement; ResolvedEl: TPasResolverResult; + VarSt: TJSVariableStatement; + VarDecl: TJSVarDeclaration; begin ExportSymbols:=El.LibrarySection.ExportSymbols; if ExportSymbols.Count=0 then exit; aResolver:=AContext.Resolver; - ExpSt:=TJSExportStatement(CreateElement(TJSExportStatement,El)); - AddToSourceElements(Src,ExpSt); for i:=0 to ExportSymbols.Count-1 do begin - ExpNameJS:=ExpSt.ExportNames.AddElement; Symb:=TObject(ExportSymbols[i]) as TPasExportSymbol; // name @@ -18078,9 +18087,9 @@ begin Decl:=Ref.Declaration; end; NamePath:=CreateReferencePath(Decl,AContext,rpkPathAndName,true); - ExpNameJS.Name:=TJSString(NamePath); // alias + AliasName:=''; if Symb.ExportName<>nil then begin EvalValue:=aResolver.Eval(Symb.ExportName,[refConst]); @@ -18089,10 +18098,10 @@ begin case EvalValue.Kind of {$ifdef FPC_HAS_CPSTRING} revkString: - ExpNameJS.Alias:=TJSString(TResEvalString(EvalValue).S); + AliasName:=TJSString(TResEvalString(EvalValue).S); {$endif} revkUnicodeString: - ExpNameJS.Alias:=TResEvalUTF16(EvalValue).S; + AliasName:=TResEvalUTF16(EvalValue).S; else RaiseNotSupported(Symb.ExportName,AContext,20211020144404); end; @@ -18102,8 +18111,19 @@ begin begin if Decl.Name='' then RaiseNotSupported(Symb,AContext,20211020144730); - ExpNameJS.Alias:=TJSString(Decl.Name); + AliasName:=TJSString(Decl.Name); end; + + // "export const AliasName = NamePath;" + ExpSt:=TJSExportStatement(CreateElement(TJSExportStatement,Symb)); + AddToSourceElements(Src,ExpSt); + VarSt:=TJSVariableStatement(CreateElement(TJSVariableStatement,Symb)); + ExpSt.Declaration:=VarSt; + VarSt.VarType:=vtConst; + VarDecl:=TJSVarDeclaration(CreateElement(TJSVarDeclaration,Symb)); + VarSt.VarDecl:=VarDecl; + VarDecl.Name:=AliasName; + VarDecl.Init:=CreatePrimitiveDotExpr(NamePath,Symb); end; end; diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index b4c6afe6cf..8fb718e294 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/packages/pastojs/tests/tcmodules.pas @@ -20,7 +20,7 @@ unit TCModules; {$mode objfpc}{$H+} -{$Optimization } + interface uses @@ -954,7 +954,6 @@ type Procedure TestLibrary_ExportUnitFunc; // ToDo: test delayed specialization init // ToDo: shortrefoptimization - // ToDo linklib end; function LinesToStr(Args: array of const): string; @@ -34794,7 +34793,9 @@ begin ' };', '});', 'rtl.run("library");', - 'export { pas.library.Run as Run, pas.library.Run as Foo, pas.library.Run as Test1Run };', + 'export const Run = pas.library.Run;', + 'export const Foo = pas.library.Run;', + 'export const Test1Run = pas.library.Run;', ''])); CheckResolverUnexpectedHints(); end; @@ -34849,7 +34850,7 @@ begin ' };', '});', 'rtl.run("library");', - 'export { pas.library.Wing as Wing };', + 'export const Wing = pas.library.Wing;', ''])); CheckResolverUnexpectedHints(); end; @@ -34889,7 +34890,8 @@ begin ' };', '});', 'rtl.run("library");', - 'export { pas.Unit1.Fly as Fly, pas.Unit1.TAnt.Crawl as Crawl };', + 'export const Fly = pas.Unit1.Fly;', + 'export const Crawl = pas.Unit1.TAnt.Crawl;', ''])); CheckResolverUnexpectedHints(); end;