Browse Source

pastojs: added libpas2js hook SetPas2JSUnitAliasCallBack

git-svn-id: trunk@43811 -
Mattias Gaertner 5 years ago
parent
commit
4dc84b2a78

+ 10 - 2
packages/pastojs/src/pas2jscompiler.pp

@@ -660,8 +660,9 @@ type
     function IsDefined(const aName: String): boolean;
     procedure SetOption(Flag: TP2jsCompilerOption; Enable: boolean);
 
-    function GetUnitInfo(const UseUnitName, InFileName, ModuleDir: String;
+    function GetUnitInfo(UseUnitName, InFileName, ModuleDir: String;
       PCUSupport: TPCUSupport): TFindUnitInfo;
+    procedure CheckUnitAlias(var UseUnitName: string); virtual;
     function FindFileWithUnitFilename(UnitFilename: string): TPas2jsCompilerFile;
     procedure LoadModuleFile(UnitFilename, UseUnitName: string;
       out aFile: TPas2jsCompilerFile; isPCU: Boolean);
@@ -5056,7 +5057,7 @@ begin
   Result:=FMainJSFileResolved;
 end;
 
-function TPas2jsCompiler.GetUnitInfo(const UseUnitName, InFileName,
+function TPas2jsCompiler.GetUnitInfo(UseUnitName, InFileName,
   ModuleDir: String; PCUSupport: TPCUSupport): TFindUnitInfo;
 
 var
@@ -5116,6 +5117,8 @@ begin
 
   if InFilename='' then
   begin
+    CheckUnitAlias(UseUnitName);
+
     if Pos('.',UseUnitname)<1 then
     begin
       // generic unit name -> search with namespaces
@@ -5175,6 +5178,11 @@ begin
   end;
 end;
 
+procedure TPas2jsCompiler.CheckUnitAlias(var UseUnitName: string);
+begin
+  if UseUnitName='' then ;
+end;
+
 function TPas2jsCompiler.LoadUsedUnit(Info: TLoadUnitInfo;
   Context: TPas2jsCompilerFile): TPas2jsCompilerFile;
 

+ 35 - 4
packages/pastojs/src/pas2jslibcompiler.pp

@@ -25,7 +25,7 @@ unit pas2jslibcompiler;
 interface
 
 uses
-  SysUtils, Classes,
+  SysUtils, Classes, Math,
   FPPJsSrcMap, Pas2jsFileCache, Pas2JSCompiler, Pas2jsPCUCompiler,
   Pas2JSCompilerCfg, Pas2JSCompilerPP;
 
@@ -47,6 +47,8 @@ Type
     AFileData : PAnsiChar; Var AFileDataLen: Int32); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
   TReadDirCallBack = Function (Data : Pointer;
     P : PDirectoryCache; ADirPath: PAnsiChar): boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
+  TUnitAliasCallBack = Function (Data: Pointer;
+    AUnitName: PAnsiChar; AUnitNameMaxLen: Integer): boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
 
   { TLibraryPas2JSCompiler }
 
@@ -60,6 +62,8 @@ Type
     FOnReadDirData: Pointer;
     FOnReadPasData: Pointer;
     FOnReadPasFile: TReadPasCallBack;
+    FOnUnitAlias: TUnitAliasCallBack;
+    FOnUnitAliasData: Pointer;
     FOnWriteJSCallBack: TWriteJSCallBack;
     FOnWriteJSData: Pointer;
     FReadBufferLen: Cardinal;
@@ -71,6 +75,7 @@ Type
     Function ReadDirectory(Dir: TPas2jsCachedDirectory): boolean; virtual;
   Public
     Constructor Create; override;
+    procedure CheckUnitAlias(var UseUnitName: string); override;
     Procedure DoLibraryLog(Sender : TObject; Const Msg : String);
     Function LibraryRun(ACompilerExe, AWorkingDir : PAnsiChar; CommandLine : PPAnsiChar; DoReset : Boolean) :Boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
     Property LastError : String Read FLastError Write FLastError;
@@ -84,6 +89,8 @@ Type
     Property ReadBufferLen : Cardinal Read FReadBufferLen Write FReadBufferLen;
     Property OnReadDir: TReadDirCallBack read FOnReadDir write FOnReadDir;
     Property OnReadDirData: Pointer read FOnReadDirData write FOnReadDirData;
+    Property OnUnitAlias: TUnitAliasCallBack read FOnUnitAlias write FOnUnitAlias;
+    Property OnUnitAliasData: Pointer read FOnUnitAliasData write FOnUnitAliasData;
   end;
 
 Type
@@ -95,6 +102,7 @@ Procedure SetPas2JSReadPasCallBack(P : PPas2JSCompiler; ACallBack : TReadPasCall
 Procedure SetPas2JSReadDirCallBack(P : PPas2JSCompiler; ACallBack : TReadDirCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
 Procedure AddPas2JSDirectoryEntry(P: PDirectoryCache; AFilename: PAnsiChar;
   AAge: TPas2jsFileAgeTime; AAttr: TPas2jsFileAttr; ASize: TPas2jsFileSize); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
+Procedure SetPas2JSUnitAliasCallBack(P : PPas2JSCompiler; ACallBack : TUnitAliasCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
 Function RunPas2JSCompiler(P : PPas2JSCompiler; ACompilerExe, AWorkingDir : PAnsiChar; CommandLine : PPAnsiChar; DoReset : Boolean) : Boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
 Procedure FreePas2JSCompiler(P : PPas2JSCompiler); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
 Function GetPas2JSCompiler : PPas2JSCompiler; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
@@ -129,8 +137,8 @@ begin
 end;
 
 procedure TLibraryPas2JSCompiler.GetLastError(AError: PAnsiChar;
-  Var AErrorLength: Longint; AErrorClass: PAnsiChar;
-  Var AErrorClassLength: Longint);
+  var AErrorLength: Longint; AErrorClass: PAnsiChar;
+  var AErrorClassLength: Longint);
 
 Var
   L : Integer;
@@ -192,6 +200,23 @@ begin
   PostProcessorSupport:=TPas2JSFSPostProcessorSupport.Create(Self);
 end;
 
+procedure TLibraryPas2JSCompiler.CheckUnitAlias(var UseUnitName: string);
+var
+  UnitNameLen, UnitNameMaxLen: Integer;
+  s: String;
+begin
+  inherited CheckUnitAlias(UseUnitName);
+  UnitNameLen:=length(UseUnitName);
+  if (UnitNameLen>0) and Assigned(OnUnitAlias) then
+    begin
+    UnitNameMaxLen:=Max(UnitNameLen,255);
+    s:=UseUnitName;
+    SetLength(s,UnitNameMaxLen);
+    if OnUnitAlias(OnUnitAliasData,Pointer(s),UnitNameLen,UnitNameMaxLen) then
+      UseUnitName:=LeftStr(s,UnitNameLen);
+    end;
+end;
+
 procedure TLibraryPas2JSCompiler.DoLibraryLog(Sender: TObject; const Msg: String);
 begin
   if Assigned(FOnLibLogCallBack) then
@@ -286,10 +311,16 @@ begin
   TPas2jsCachedDirectory(P).Add(AFilename,AAge,AAttr,ASize);
 end;
 
+procedure SetPas2JSUnitAliasCallBack(P: PPas2JSCompiler;
+  ACallBack: TUnitAliasCallBack; CallBackData: Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
+begin
+  TLibraryPas2JSCompiler(P).OnUnitAlias:=ACallBack;
+  TLibraryPas2JSCompiler(P).OnUnitAliasData:=CallBackData;
+end;
+
 function RunPas2JSCompiler(P: PPas2JSCompiler; ACompilerExe,
   AWorkingDir: PAnsiChar; CommandLine: PPAnsiChar; DoReset: Boolean): Boolean;
   {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
-
 begin
   Result:=TLibraryPas2JSCompiler(P).LibraryRun(ACompilerExe,AWorkingDir,CommandLine,DoReset)
 end;

+ 1 - 0
utils/pas2js/pas2jslib.pp

@@ -15,6 +15,7 @@ exports
   SetPas2JSWriteJSCallBack,
   SetPas2JSReadDirCallBack,
   AddPas2JSDirectoryEntry,
+  SetPas2JSUnitAliasCallBack,
   SetPas2JSCompilerLogCallBack,
   GetPas2JSCompilerLastError;