Browse Source

pastojs: option -FE

git-svn-id: trunk@38983 -
Mattias Gaertner 7 years ago
parent
commit
8a5c519f2d

+ 1 - 1
packages/fcl-passrc/src/pasresolveeval.pas

@@ -172,6 +172,7 @@ const
   nCantAssignValuesToConstVariable = 3110;
   nIllegalAssignmentToForLoopVar = 3111;
   nFunctionHidesIdentifier_NonProc = 3112;
+  // Note: use one of the free IDs above
 
   // using same IDs as FPC
   nVirtualMethodXHasLowerVisibility = 3250;
@@ -286,7 +287,6 @@ resourcestring
   sMissingFieldsX = 'Missing fields: "%s"';
   sCantAssignValuesToConstVariable = 'Can''t assign values to const variable';
   sIllegalAssignmentToForLoopVar = 'Illegal assignment to for-loop variable "%s"';
-  // sFunctionHidesIdentifier_NonProc = sFunctionHidesIdentifier
 
 type
   { TResolveData - base class for data stored in TPasElement.CustomData }

+ 3 - 0
packages/pastojs/src/pas2jscompiler.pp

@@ -3129,6 +3129,7 @@ begin
           inc(p);
           case c of
           'e': Log.OutputFilename:=String(p);
+          'E': FileCache.MainOutputPath:=String(p);
           'i': if not FileCache.AddIncludePaths(String(p),FromCmdLine,ErrorMsg) then
                  ParamFatal('invalid include path (-Fi) "'+ErrorMsg+'"');
           'N': if not FileCache.AddNamespaces(String(p),FromCmdLine,ErrorMsg) then
@@ -3972,6 +3973,7 @@ begin
   l('    R     : Object checks. Verify method calls and object type casts.');
   l('  -F...   Set file names and paths:');
   l('   -Fe<x> : Redirect output to file <x>. UTF-8 encoded.');
+  l('   -FE<x> : Set main output path to <x>');
   l('   -Fi<x> : Add <x> to include paths');
   l('   -FN<x> : add <x> to namespaces. Namespaces with trailing - are removed.');
   l('            Delphi calls this flag "unit scope names".');
@@ -4144,6 +4146,7 @@ begin
   for i:=0 to FileCache.IncludePaths.Count-1 do
     WriteFolder('include path',FileCache.IncludePaths[i]);
   WriteFolder('unit output path',FileCache.UnitOutputPath);
+  WriteFolder('main output path',FileCache.MainOutputPath);
   Log.LogMsgIgnoreFilter(nNameValue,['output file',QuoteStr(FileCache.MainJSFile)]);
 end;
 

+ 28 - 8
packages/pastojs/src/pas2jsfilecache.pp

@@ -261,6 +261,7 @@ type
   TPas2jsFilesCache = class
   private
     FBaseDirectory: string;
+    FDefaultOutputPath: string;
     FDirectoryCache: TPas2jsCachedDirectories;
     FFiles: TAVLTree; // tree of TPas2jsCachedFile sorted for Filename
     FForeignUnitPaths: TStringList;
@@ -295,6 +296,7 @@ type
     procedure SetBaseDirectory(AValue: string);
     function AddSearchPaths(const Paths: string; Kind: TPas2jsSearchPathKind;
       FromCmdLine: boolean; var List: TStringList; var CmdLineCount: integer): string;
+    procedure SetDefaultOutputPath(AValue: string);
     procedure SetMainJSFile(AValue: string);
     procedure SetOptions(AValue: TP2jsFileCacheOptions);
     procedure SetSearchLikeFPC(const AValue: boolean);
@@ -332,6 +334,7 @@ type
   public
     property AllJSIntoMainJS: Boolean read GetAllJSIntoMainJS write SetAllJSIntoMainJS;
     property BaseDirectory: string read FBaseDirectory write SetBaseDirectory; // includes trailing pathdelim
+    property MainOutputPath: string read FDefaultOutputPath write SetDefaultOutputPath; // includes trailing pathdelim
     property DirectoryCache: TPas2jsCachedDirectories read FDirectoryCache;
     property ForeignUnitPaths: TStringList read FForeignUnitPaths;
     property ForeignUnitPathsFromCmdLine: integer read FForeignUnitPathsFromCmdLine;
@@ -1651,6 +1654,13 @@ begin
   end;
 end;
 
+procedure TPas2jsFilesCache.SetDefaultOutputPath(AValue: string);
+begin
+  AValue:=ExpandDirectory(AValue,BaseDirectory);
+  if FDefaultOutputPath=AValue then Exit;
+  FDefaultOutputPath:=AValue;
+end;
+
 procedure TPas2jsFilesCache.SetMainJSFile(AValue: string);
 begin
   if FMainJSFile=AValue then Exit;
@@ -1904,21 +1914,31 @@ begin
       FMainJSFileResolved:=''
     else begin
       FMainJSFileResolved:=MainJSFile;
-      if FMainJSFileResolved='' then
+      if FMainJSFileResolved<>'' then
       begin
+        // has option -o
+        if ExtractFilePath(FMainJSFileResolved)='' then
+        begin
+          // -o<FileWithoutPath>
+          if MainOutputPath<>'' then
+            FMainJSFileResolved:=MainOutputPath+FMainJSFileResolved
+          else if UnitOutputPath<>'' then
+            FMainJSFileResolved:=UnitOutputPath+FMainJSFileResolved;
+        end;
+      end else begin
         // no option -o
-        if UnitOutputPath<>'' then
+        FMainJSFileResolved:=ChangeFileExt(MainSrcFile,'.js');
+        if MainOutputPath<>'' then
+        begin
+          // option -FE and no -o => put into MainOutputPath
+          FMainJSFileResolved:=MainOutputPath+ExtractFilename(FMainJSFileResolved)
+        end else if UnitOutputPath<>'' then
         begin
           // option -FU and no -o => put into UnitOutputPath
-          FMainJSFileResolved:=UnitOutputPath+ChangeFileExt(ExtractFilename(MainSrcFile),'.js')
+          FMainJSFileResolved:=UnitOutputPath+ExtractFilename(FMainJSFileResolved)
         end else begin
           // no -FU and no -o => put into source directory
-          FMainJSFileResolved:=ChangeFileExt(MainSrcFile,'.js');
         end;
-      end else begin
-        // has option -o
-        if (ExtractFilePath(FMainJSFileResolved)='') and (UnitOutputPath<>'') then
-          FMainJSFileResolved:=UnitOutputPath+FMainJSFileResolved;
       end;
     end;
     Include(FStates,cfsMainJSFileResolved);

+ 1 - 0
utils/pas2js/docs/translation.html

@@ -139,6 +139,7 @@ Put + after a boolean switch option to enable it, - to disable it
     R     : Object checks. Verify method calls and object type casts.
   -F...   Set file names and paths:
    -Fe&lt;x&gt; : Redirect output to file &lt;x&gt;. UTF-8 encoded.
+   -FE&lt;x&gt; : Set main output path to &lt;x&gt;
    -Fi&lt;x&gt; : Add &lt;x&gt; to include paths
    -FN&lt;x&gt; : add &lt;x&gt; to namespaces. Namespaces with trailing - are removed.
                   Delphi calls this flag "unit scope names".