Bladeren bron

* Modifications so it compiles for target browser

git-svn-id: trunk@40461 -
michael 6 jaren geleden
bovenliggende
commit
78b3b8ee4e

+ 5 - 0
packages/pastojs/src/pas2js_defines.inc

@@ -19,6 +19,11 @@
   {$DEFINE UTF8_RTL}
   {$DEFINE HasStdErr}
   {$DEFINE HasPas2jsFiler}
+  {$DEFINE HASFILESYSTEM}
+{$ENDIF}
+
+{$IFDEF NODEJS}
+{$DEFINE HASFILESYSTEM}
 {$ENDIF}
 
 

+ 56 - 13
packages/pastojs/src/pas2jscompiler.pp

@@ -545,6 +545,14 @@ type
     procedure RegisterMessages;
     procedure SetAllJSIntoMainJS(AValue: Boolean);
   protected
+    // Create various other classes. Virtual so they can be overridden in descendents
+    function CreateJSMapper: TPas2JSMapper;virtual;
+    function CreateJSWriter(aFileWriter: TPas2JSMapper): TJSWriter; virtual;
+    function CreateLog: TPas2jsLogger; virtual;
+    function CreateMacroEngine: TPas2jsMacroEngine;virtual;
+    function CreateSrcMap(const aFileName: String): TPas2JSSrcMap; virtual;
+    function CreateOptimizer: TPas2JSWPOptimizer;
+    // These are mandatory !
     function CreateSetOfCompilerFiles(keyType: TKeyCompareType): TPasAnalyzerKeySet; virtual; abstract;
     function CreateFS : TPas2JSFS; virtual; abstract;
     Function FormatPath(Const aPath : String) : String;
@@ -1906,12 +1914,18 @@ begin
   Result:=aFile.NeedBuild;
 end;
 
+Function TPas2jsCompiler.CreateOptimizer : TPas2JSWPOptimizer;
+
+begin
+  Result:=TPas2JSWPOptimizer.Create;
+end;
+
 procedure TPas2jsCompiler.OptimizeProgram(aFile: TPas2jsCompilerFile);
 begin
   if not AllJSIntoMainJS then exit;
   if coKeepNotUsedDeclarationsWPO in Options then exit;
   if not (aFile.PasModule is TPasProgram) then exit;
-  FWPOAnalyzer:=TPas2JSWPOptimizer.Create;
+  FWPOAnalyzer:=CreateOptimizer;
   FWPOAnalyzer.Resolver:=aFile.PascalResolver;
   FWPOAnalyzer.Options:=FWPOAnalyzer.Options+[paoOnlyExports];
   FWPOAnalyzer.AnalyzeWholeProgram(TPasProgram(aFile.PasModule));
@@ -2004,6 +2018,24 @@ begin
   if aWriter=nil then ;
 end;
 
+Function TPas2jsCompiler.CreateJSWriter(aFileWriter: TPas2JSMapper): TJSWriter;
+
+begin
+  Result:=TJSWriter.Create(aFileWriter);
+end;
+
+Function TPas2JSCompiler.CreateJSMapper : TPas2JSMapper;
+
+begin
+  Result:=TPas2JSMapper.Create(4096);
+end;
+
+Function TPas2JSCompiler.CreateSrcMap(Const aFileName : String) : TPas2JSSrcMap;
+
+begin
+  Result:=TPas2JSSrcMap.Create(aFileName);
+end;
+
 procedure TPas2jsCompiler.WriteJSFiles(aFile: TPas2jsCompilerFile;
   var CombinedFileWriter: TPas2JSMapper; Checked: TPasAnalyzerKeySet);
 
@@ -2031,11 +2063,11 @@ var
   var
     SrcMap: TPas2JSSrcMap;
   begin
-    aFileWriter:=TPas2JSMapper.Create(4096);
+    aFileWriter:=CreateJSMapper;
     FreeWriter:=true;
     if SrcMapEnable then
     begin
-      SrcMap:=TPas2JSSrcMap.Create(ExtractFilename(aFilename));
+      SrcMap:=CreateSrcMap(ExtractFilename(aFilename));
       aFileWriter.SrcMap:=SrcMap;
       SrcMap.Release;// release the refcount from the Create
       SrcMap.SourceRoot:=SrcMapSourceRoot;
@@ -2091,7 +2123,7 @@ begin
     end;
 
     // write JavaScript
-    aJSWriter:=TJSWriter.Create(aFileWriter);
+    aJSWriter:=CreateJSWriter(aFileWriter);
     aJSWriter.Options:=DefaultJSWriterOptions;
     aJSWriter.IndentSize:=2;
     try
@@ -2146,12 +2178,12 @@ begin
 
         // check output directory
         DestDir:=ChompPathDelim(ExtractFilePath(DestFilename));
-        if (DestDir<>'') and not DirectoryExists(DestDir) then
+        if (DestDir<>'') and not FS.DirectoryExists(DestDir) then
         begin
           Log.LogMsg(nOutputDirectoryNotFound,[FullFormatPath(DestDir)]);
           Terminate(ExitCodeFileNotFound);
         end;
-        if DirectoryExists(DestFilename) then
+        if FS.DirectoryExists(DestFilename) then
         begin
           Log.LogMsg(nFileIsFolder,[FullFormatPath(DestFilename)]);
           Terminate(ExitCodeWriteError);
@@ -3593,28 +3625,39 @@ begin
   Result:=QuoteStr(FormatPath(aPath));
 end;
 
+Function TPas2jsCompiler.CreateMacroEngine : TPas2jsMacroEngine;
+
+begin
+  Result:=TPas2jsMacroEngine.Create;
+end;
+
+Function TPas2jsCompiler.CreateLog : TPas2jsLogger;
+
+begin
+  Result:=TPas2jsLogger.Create;
+end;
 
 constructor TPas2jsCompiler.Create;
+
 begin
   FOptions:=DefaultP2jsCompilerOptions;
   FNamespaces:=TStringList.Create;
-  FLog:=TPas2jsLogger.Create;
-  FParamMacros:=TPas2jsMacroEngine.Create;
-  RegisterMessages;
+  FDefines:=TStringList.Create;
   FInsertFilenames:=TStringList.Create;
+  FLog:=CreateLog;
+  FLog.OnFormatPath:=@FormatPath;
+  FParamMacros:=CreateMacroEngine;
+  RegisterMessages;
   FS:=CreateFS;
   FOwnsFS:=true;
-  FLog.OnFormatPath:=@FormatPath;
 
-  FDefines:=TStringList.Create;
   // Done by Reset: TStringList(FDefines).Sorted:=True;
   // Done by Reset: TStringList(FDefines).Duplicates:=dupError;
-
   //FConditionEval.OnEvalFunction:=@ConditionEvalFunction;
 
   FFiles:=CreateSetOfCompilerFiles(kcFilename);
-  FReadingModules:=TFPList.Create;
   FUnits:=CreateSetOfCompilerFiles(kcUnitName);
+  FReadingModules:=TFPList.Create;
   InitParamMacros;
   Reset;
 end;

+ 2 - 1
packages/pastojs/src/pas2jsfs.pp

@@ -22,6 +22,7 @@
 unit pas2jsfs;
 
 {$mode objfpc}{$H+}
+{$I pas2js_defines.inc}
 
 interface
 
@@ -153,7 +154,7 @@ Type
 
   { TPas2jsFSResolver }
 
-  TPas2jsFSResolver = class(TFileResolver)
+  TPas2jsFSResolver = class({$IFDEF HASFILESYSTEM}TFileResolver{$ELSE}TBaseFileResolver{$ENDIF})
   private
     FFS: TPas2jsFS;
   public

+ 60 - 9
packages/pastojs/src/pas2jslogger.pp

@@ -28,10 +28,13 @@ interface
 
 uses
   {$IFDEF Pas2JS}
-  JS, NodeJSFS,
+  JS,
   {$ENDIF}
-  Classes, SysUtils, PasTree, PScanner, jstree, jsbase, jswriter, fpjson,
-  Pas2jsFileUtils;
+  pas2jsutils,
+  {$IFDEF HASFILESYSTEM}
+  pas2jsfileutils,
+  {$ENDIF}
+  Classes, SysUtils, PasTree, PScanner, jstree, jsbase, jswriter, fpjson;
 
 const
   ExitCodeErrorInternal = 1; // internal error
@@ -95,6 +98,16 @@ type
 
   TPas2jsLogEvent = Procedure (Sender : TObject; Const Msg : String) Of Object;
 
+
+  { TConsoleFileWriter }
+
+  TConsoleFileWriter = Class(TTextWriter)
+  Public
+    Constructor Create(aFileName : String); reintroduce;
+    Function DoWrite(Const S : TJSWriterString) : Integer; override;
+    Procedure Flush;
+  end;
+
   { TPas2jsLogger }
 
   TPas2jsLogger = class
@@ -111,7 +124,7 @@ type
     FMsg: TFPList; // list of TPas2jsMessage
     FOnFormatPath: TPScannerFormatPathEvent;
     FOnLog: TPas2jsLogEvent;
-    FOutputFile: TFileWriter;
+    FOutputFile: TTextWriter; // TFileWriter;
     FOutputFilename: string;
     FShowMsgNumbers: boolean;
     FShowMsgTypes: TMessageTypes;
@@ -129,6 +142,9 @@ type
     procedure SetSorted(AValue: boolean);
     procedure DoLogRaw(const Msg: string; SkipEncoding : Boolean);
     function Concatenate(Args: array of {$IFDEF Pas2JS}jsvalue{$ELSE}const{$ENDIF}): string;
+  Protected
+    // so it can be overridden
+    function CreateTextWriter(const aFileName: string): TTextWriter; virtual;
   public
     constructor Create;
     destructor Destroy; override;
@@ -484,6 +500,27 @@ begin
   end;
 end;
 
+{ TConsoleFileWriter }
+
+constructor TConsoleFileWriter.Create(aFileName: String);
+begin
+  Inherited Create;
+  Write('Opening console log: '+aFileName);
+end;
+
+Function TConsoleFileWriter.DoWrite(Const S : TJSWriterString) : Integer;
+
+begin
+  Result:=Length(S);
+  Writeln(S);
+end;
+
+procedure TConsoleFileWriter.FLush;
+
+begin
+end;
+
+
 {$IFDEF Pas2JS}
 { TPas2jsFileStream }
 
@@ -1017,14 +1054,26 @@ begin
   end;
 end;
 
+Function TPas2jsLogger.CreateTextWriter(const aFileName : string) : TTextWriter;
+
+begin
+{$IFDEF HASFILESYSTEM}
+  Result:=TFileWriter.Create(aFilename);
+{$ELSE}
+  Result:=TConsoleFileWriter.Create(aFileName);
+{$ENDIF}
+end;
+
 procedure TPas2jsLogger.OpenOutputFile;
 begin
+{$IFDEF HASFILESYSTEM}
   if FOutputFile<>nil then exit;
   if OutputFilename='' then
     raise Exception.Create('Log has empty OutputFilename');
-  if DirectoryExists(OutputFilename) then
+   if DirectoryExists(OutputFilename) then
     raise Exception.Create('Log is directory: "'+OutputFilename+'"');
-  FOutputFile:=TFileWriter.Create(OutputFilename);
+{$ENDIF}
+  FOutputFile:=CreateTextWriter(OutputFileName);
   {$IFDEF FPC_HAS_CPSTRING}
   if (Encoding='') or (Encoding='utf8') then
     FOutputFile.Write(UTF8BOM);
@@ -1033,14 +1082,16 @@ end;
 
 procedure TPas2jsLogger.Flush;
 begin
-  if FOutputFile<>nil then
-    FOutputFile.Flush;
+{$IFDEF HASFILESYSTEM}
+  if Assigned(FOutputFile) and (FoutputFile is TFileWriter) then
+    TFileWriter(FOutputFile).Flush;
+{$ENDIF}
 end;
 
 procedure TPas2jsLogger.CloseOutputFile;
 begin
   if FOutputFile=nil then exit;
-  FOutputFile.Flush;
+  Flush;
   FreeAndNil(FOutputFile);
 end;