Browse Source

pastojs: pcu srcmap

git-svn-id: trunk@43809 -
Mattias Gaertner 5 years ago
parent
commit
9a496c2470
2 changed files with 48 additions and 17 deletions
  1. 39 16
      packages/pastojs/src/fppjssrcmap.pp
  2. 9 1
      packages/pastojs/src/pas2jspcucompiler.pp

+ 39 - 16
packages/pastojs/src/fppjssrcmap.pp

@@ -44,6 +44,7 @@ type
 
   TPas2JSMapper = class(TBufferWriter)
   private
+    FPCUExt: string;
     FDestFileName: String;
     FSrcMap: TPas2JSSrcMap;
     procedure SetSrcMap(const AValue: TPas2JSSrcMap);
@@ -52,16 +53,19 @@ type
     FGeneratedStartLine: integer; // first line where CurElement was set or a line was written
     // last valid CurElement position
     FSrcFilename: String;
+    FSrcIsBinary: boolean;
     FSrcLine: integer;
     FSrcColumn: integer;
     procedure SetCurElement(const AValue: TJSElement); override;
+    procedure SetSrcFilename(Value: string); virtual;
     procedure Writing; override;
   public
     property SrcMap: TPas2JSSrcMap read FSrcMap write SetSrcMap;
     destructor Destroy; override;
     procedure WriteFile(Src, Filename: string);
     // Final destination filename. Usually unit, unless combining javascript in single file.
-    Property DestFileName : String Read FDestFileName Write FDestFileName;
+    property DestFileName : String read FDestFileName Write FDestFileName;
+    property PCUExt: string read FPCUExt write FPCUExt;
   end;
 
 implementation
@@ -97,6 +101,7 @@ end;
 procedure TPas2JSMapper.SetCurElement(const AValue: TJSElement);
 var
   C: TClass;
+  NewSrcFilename: String;
 begin
   {$IFDEF VerboseSrcMap}
   system.write('TPas2JSMapper.SetCurElement ',CurLine,',',CurColumn);
@@ -112,22 +117,33 @@ begin
       or (C=TJSEmptyStatement) then
     exit; // do not switch position on brackets
 
-  if (AValue<>nil) and (AValue.Source<>'') then
+  if (AValue<>nil) then
     begin
-    if (FSrcFilename<>AValue.Source)
-        or (FSrcLine<>AValue.Line)
-        or (FSrcColumn<>AValue.Column) then
+    NewSrcFilename:=AValue.Source;
+    if NewSrcFilename<>'' then
       begin
-      FNeedMapping:=true;
-      FSrcFilename:=AValue.Source;
-      FSrcLine:=AValue.Line;
-      FSrcColumn:=AValue.Column;
+      if (FSrcFilename<>NewSrcFilename)
+          or (FSrcLine<>AValue.Line)
+          or (FSrcColumn<>AValue.Column) then
+        begin
+        FNeedMapping:=true;
+        SetSrcFilename(NewSrcFilename);
+        FSrcLine:=AValue.Line;
+        FSrcColumn:=AValue.Column;
+        end;
       end;
     end;
   if FGeneratedStartLine<1 then
     FGeneratedStartLine:=CurLine;
 end;
 
+procedure TPas2JSMapper.SetSrcFilename(Value: string);
+begin
+  if FSrcFilename=Value then exit;
+  FSrcFilename:=Value;
+  FSrcIsBinary:=SameText(ExtractFileExt(Value),FPCUExt);
+end;
+
 procedure TPas2JSMapper.Writing;
 var
   S: TJSString;
@@ -144,15 +160,22 @@ begin
   if FSrcFilename='' then
     exit; // built-in element -> do not add a mapping
 
-  CurSrcFilename:=FSrcFilename;
-  CurSrcLine:=FSrcLine;
-  CurSrcColumn:=FSrcColumn;
-  //system.writeln('TPas2JSMapper.Writing ',FSrcFilename);
-  if ExtractFileExt(CurSrcFilename)='.pju' then
+  if FSrcIsBinary then
     begin
     // precompiled js -> map to js
-    exit;
+    CurSrcFilename:=DestFileName;
+    CurSrcLine:=CurLine;
+    CurSrcColumn:=CurColumn;
+    FSrcLine:=CurLine;
+    FSrcColumn:=1;
+    end
+  else
+    begin
+    CurSrcFilename:=FSrcFilename;
+    CurSrcLine:=FSrcLine;
+    CurSrcColumn:=FSrcColumn;
     end;
+  //system.writeln('TPas2JSMapper.Writing ',FSrcFilename);
 
   FNeedMapping:=false;
   //system.writeln('TPas2JSMapper.Writing Generated.Line=',CurLine,',Col=',CurColumn-1,
@@ -201,7 +224,7 @@ var
   l, p, LineStart: integer;
 begin
   if Src='' then exit;
-  FSrcFilename:=Filename;
+  SetSrcFilename(Filename);
   FSrcLine:=1;
   FSrcColumn:=1;
   l:=length(Src);

+ 9 - 1
packages/pastojs/src/pas2jspcucompiler.pp

@@ -34,7 +34,7 @@ uses
   PasTree, PScanner, PasResolveEval,
   FPPas2Js,
   Pas2jsCompiler, Pas2JSFS, Pas2JSFSCompiler, Pas2JsFiler,
-  Pas2jsLogger, Pas2jsFileUtils;
+  Pas2jsLogger, Pas2jsFileUtils, FPPJsSrcMap;
 
 Type
 
@@ -79,6 +79,7 @@ Type
   Private
     FPrecompileFormat: TPas2JSPrecompileFormat;
   Protected
+    function CreateJSMapper: TPas2JSMapper; override;
     procedure WritePrecompiledFormats; override;
     function CreateCompilerFile(const PasFileName, PCUFilename: String): TPas2jsCompilerFile; override;
     procedure HandleOptionPCUFormat(Value: string); override;
@@ -397,6 +398,13 @@ end;
 
 { TPas2jsPCUCompiler }
 
+function TPas2jsPCUCompiler.CreateJSMapper: TPas2JSMapper;
+begin
+  Result:=inherited CreateJSMapper;
+  if PrecompileFormat<>nil then
+    Result.PCUExt:='.'+PrecompileFormat.Ext;
+end;
+
 procedure TPas2jsPCUCompiler.WritePrecompiledFormats;
 Var
   I: Integer;