diff --git a/packages/pastojs/src/pas2jscompiler.pp b/packages/pastojs/src/pas2jscompiler.pp index c5c93bd8ac..49b19340dd 100644 --- a/packages/pastojs/src/pas2jscompiler.pp +++ b/packages/pastojs/src/pas2jscompiler.pp @@ -412,6 +412,8 @@ type FInterfaceType: TPasClassInterfaceType; FRTLVersionCheck: TP2jsRTLVersionCheck; FPrecompileGUID: TGUID; + FInsertFilenames: TStringList; + procedure AddInsertJSFilename(const aFilename: string); procedure ConditionEvalLog(Sender: TCondDirectiveEvaluator; Args: array of {$ifdef pas2js}jsvalue{$else}const{$endif}); function ConditionEvalVariable(Sender: TCondDirectiveEvaluator; @@ -431,10 +433,13 @@ type function GetWriteDebugLog: boolean; function GetWriteMsgToStdErr: boolean; function HandleOptionOptimization(C: Char; aValue: String): Boolean; + function IndexOfInsertJSFilename(const aFilename: string): integer; + procedure InsertCustomJSFiles(aWriter: TPas2JSMapper); function OnMacroCfgDir(Sender: TObject; var Params: string; Lvl: integer ): boolean; function OnMacroEnv(Sender: TObject; var Params: string; Lvl: integer ): boolean; + procedure RemoveInsertJSFilename(const aFilename: string); procedure SetCompilerExe(AValue: string); procedure SetFileCache(AValue: TPas2jsFilesCache); procedure SetMode(AValue: TP2jsMode); @@ -580,6 +585,7 @@ type property WriteDebugLog: boolean read GetWriteDebugLog write SetWriteDebugLog; property WriteMsgToStdErr: boolean read GetWriteMsgToStdErr write SetWriteMsgToStdErr; property ExitCode: longint read GetExitCode write SetExitCode; + property InsertFilenames: TStringList read FInsertFilenames; end; @@ -1566,7 +1572,7 @@ var FoundPasUnitName:=TestUnitName; end else begin // search pas in unit path - FoundPasFilename:=Compiler.FileCache.FindUnitFileName(TestUnitName,'',FoundPasIsForeign,FileResolver.StrictFileCase); + FoundPasFilename:=Compiler.FileCache.FindUnitFileName(TestUnitName,'',FoundPasIsForeign); if FoundPasFilename<>'' then FoundPasUnitName:=TestUnitName; end; @@ -1631,7 +1637,7 @@ begin if FoundPasFilename='' then begin // search Pascal file - FoundPasFilename:=Compiler.FileCache.FindUnitFileName(UseUnitname,InFilename,FoundPasIsForeign,FileResolver.StrictFileCase); + FoundPasFilename:=Compiler.FileCache.FindUnitFileName(UseUnitname,InFilename,FoundPasIsForeign); if FoundPasFilename<>'' then begin if InFilename<>'' then @@ -2273,7 +2279,7 @@ begin DestFilename:=FileCache.GetResolvedMainJSFile; CreateFileWriter(DestFilename); CombinedFileWriter:=aFileWriter; - FileCache.InsertCustomJSFiles(CombinedFileWriter); + InsertCustomJSFiles(CombinedFileWriter); end else begin DestFilename:=aFile.JSFilename; end; @@ -2290,7 +2296,7 @@ begin // create writer for this file CreateFileWriter(DestFilename); if aFile.IsMainFile and not FileCache.AllJSIntoMainJS then - FileCache.InsertCustomJSFiles(aFileWriter); + InsertCustomJSFiles(aFileWriter); end; // write JavaScript @@ -3154,9 +3160,9 @@ begin if aValue='' then Result:=False else - FileCache.RemoveInsertJSFilename(aValue); + RemoveInsertJSFilename(aValue); end else - FileCache.AddInsertJSFilename(aValue); + AddInsertJSFilename(aValue); end; 'l': SetOption(coLowercase,aValue<>'-'); 'm': @@ -3983,6 +3989,7 @@ begin FLog:=TPas2jsLogger.Create; FParamMacros:=TPas2jsMacroEngine.Create; RegisterMessages; + FInsertFilenames:=TStringList.Create; FFileCache:=TPas2jsFilesCache.Create(Log); FFileCache.BaseDirectory:=GetCurrentDirPJ; @@ -4017,6 +4024,7 @@ destructor TPas2jsCompiler.Destroy; procedure FreeStuff; begin FreeAndNil(FWPOAnalyzer); + FreeAndNil(FInsertFilenames); FMainFile:=nil; FreeAndNil(FUnits); @@ -4137,7 +4145,7 @@ begin FUnits.Clear; FReadingModules.Clear; FFiles.FreeItems; - + FInsertFilenames.Clear; FPostProcs.Clear; FCompilerExe:=''; FOptions:=DefaultP2jsCompilerOptions; @@ -4751,5 +4759,57 @@ begin Result:=ExpandFileNamePJ(Filename,FileCache.BaseDirectory); end; +procedure TPas2jsCompiler.InsertCustomJSFiles(aWriter: TPas2JSMapper); +var + i: Integer; + Filename: String; + FileResolver: TPas2jsFileResolver; + aFile: TPas2jsCachedFile; +begin + if InsertFilenames.Count=0 then exit; + FileResolver:=FileCache.CreateResolver; + try + for i:=0 to InsertFilenames.Count-1 do begin + Filename:=FileCache.FindCustomJSFileName(ResolveDots(InsertFilenames[i])); + if Filename='' then + begin + Log.LogMsg(nCustomJSFileNotFound,[InsertFilenames[i]]); + raise EFileNotFoundError.Create(''); + end; + aFile:=FileCache.LoadFile(Filename); + if aFile.Source='' then continue; + aWriter.WriteFile(aFile.Source,Filename); + end + finally + FileResolver.Free; + end; +end; + +function TPas2jsCompiler.IndexOfInsertJSFilename(const aFilename: string + ): integer; +var + i: Integer; +begin + for i:=0 to FInsertFilenames.Count-1 do + if CompareFilenames(aFilename,InsertFilenames[i])=0 then + exit(i); + Result:=-1; +end; + +procedure TPas2jsCompiler.AddInsertJSFilename(const aFilename: string); +begin + if IndexOfInsertJSFilename(aFilename)<0 then + InsertFilenames.Add(aFilename); +end; + +procedure TPas2jsCompiler.RemoveInsertJSFilename(const aFilename: string); +var + i: Integer; +begin + i:=IndexOfInsertJSFilename(aFilename); + if i>=0 then + InsertFilenames.Delete(i); +end; + end. diff --git a/packages/pastojs/src/pas2jsfilecache.pp b/packages/pastojs/src/pas2jsfilecache.pp index 01afbfb7fe..7311c3f8ef 100644 --- a/packages/pastojs/src/pas2jsfilecache.pp +++ b/packages/pastojs/src/pas2jsfilecache.pp @@ -269,7 +269,6 @@ type FForeignUnitPathsFromCmdLine: integer; FIncludePaths: TStringList; FIncludePathsFromCmdLine: integer; - FInsertFilenames: TStringList; FLog: TPas2jsLogger; FMainJSFile: string; FMainJSFileResolved: string; // only valid if cfsMainJSFileResolved in FStates @@ -284,13 +283,13 @@ type FResetStamp: TChangeStamp; FSrcMapBaseDir: string; FStates: TPas2jsFileCacheStates; + FStrictFileCase: Boolean; FUnitOutputPath: string; FUnitPaths: TStringList; FUnitPathsFromCmdLine: integer; function FileExistsILogged(var Filename: string): integer; function FileExistsLogged(const Filename: string): boolean; - function FindCustomJSFileName(const aFilename: string): String; - function FindSourceFileName(const aFilename: string; StrictFileCase: Boolean): String; + function FindSourceFileName(const aFilename: string): String; function GetAllJSIntoMainJS: Boolean; function GetSearchLikeFPC: boolean; function GetShowFullFilenames: boolean; @@ -317,10 +316,11 @@ type constructor Create(aLog: TPas2jsLogger); destructor Destroy; override; procedure Reset; virtual; - function SearchLowUpCase(var Filename: string; StrictFileCase : Boolean): boolean; + function SearchLowUpCase(var Filename: string): boolean; + function FindCustomJSFileName(const aFilename: string): String; function FindUnitJSFileName(const aUnitFilename: string): String; - function FindUnitFileName(const aUnitname, InFilename: string; out IsForeign: boolean; StrictFileCase: Boolean): String; virtual; - function FindIncludeFileName(const aFilename: string; StrictFileCase : Boolean): String; virtual; + function FindUnitFileName(const aUnitname, InFilename: string; out IsForeign: boolean): String; virtual; + function FindIncludeFileName(const aFilename: string): String; virtual; function AddIncludePaths(const Paths: string; FromCmdLine: boolean; out ErrorMsg: string): boolean; function AddNamespaces(const Paths: string; FromCmdLine: boolean; out ErrorMsg: string): boolean; function AddUnitPaths(const Paths: string; FromCmdLine: boolean; out ErrorMsg: string): boolean; @@ -335,10 +335,6 @@ type function FindFile(Filename: string): TPas2jsCachedFile; function LoadFile(Filename: string; Binary: boolean = false): TPas2jsCachedFile; function NormalizeFilename(const Filename: string; RaiseOnError: boolean): string; - procedure InsertCustomJSFiles(aWriter: TPas2JSMapper); - function IndexOfInsertJSFilename(const aFilename: string): integer; - procedure AddInsertJSFilename(const aFilename: string); - procedure RemoveInsertJSFilename(const aFilename: string); procedure GetListing(const aDirectory: string; var Files: TStrings; FullPaths: boolean = true); procedure RaiseDuplicateFile(aFilename: string); @@ -354,7 +350,6 @@ type property ForeignUnitPathsFromCmdLine: integer read FForeignUnitPathsFromCmdLine; property IncludePaths: TStringList read FIncludePaths; property IncludePathsFromCmdLine: integer read FIncludePathsFromCmdLine; - property InsertFilenames: TStringList read FInsertFilenames; property Log: TPas2jsLogger read FLog; property MainJSFile: string read FMainJSFile write SetMainJSFile; property MainSrcFileShort: string read FMainSrcFileShort write FMainSrcFileShort; @@ -373,6 +368,7 @@ type property UnitPathsFromCmdLine: integer read FUnitPathsFromCmdLine; property OnReadFile: TPas2jsReadFileEvent read FOnReadFile write FOnReadFile; property OnWriteFile: TPas2jsWriteFileEvent read FOnWriteFile write FOnWriteFile; + Property StrictFileCase : Boolean Read FStrictFileCase Write FStrictFileCase; end; @@ -1312,7 +1308,7 @@ var Filename: String; begin Result:=nil; - Filename:=Cache.FindIncludeFileName(aFilename,StrictFileCase); + Filename:=Cache.FindIncludeFileName(aFilename); if Filename='' then exit; try Result:=FindSourceFile(Filename); @@ -1324,7 +1320,7 @@ end; function TPas2jsFileResolver.FindIncludeFileName(const aFilename: string): String; begin - Result:=Cache.FindIncludeFileName(aFilename,StrictFileCase); + Result:=Cache.FindIncludeFileName(aFilename); end; @@ -1334,7 +1330,7 @@ var CurFilename: String; begin - CurFilename:=Cache.FindSourceFileName(aFileName,StrictFileCase); + CurFilename:=Cache.FindSourceFileName(aFileName); Result:=Cache.LoadFile(CurFilename).CreateLineReader(false); end; @@ -1663,7 +1659,6 @@ begin FLog:=aLog; FOptions:=DefaultPas2jsFileCacheOptions; FIncludePaths:=TStringList.Create; - FInsertFilenames:=TStringList.Create; FForeignUnitPaths:=TStringList.Create; FNamespaces:=TStringList.Create; FUnitPaths:=TStringList.Create; @@ -1683,7 +1678,6 @@ begin FFiles.FreeItems; FreeAndNil(FDirectoryCache); FreeAndNil(FFiles); - FreeAndNil(FInsertFilenames); FreeAndNil(FIncludePaths); FreeAndNil(FForeignUnitPaths); FreeAndNil(FNamespaces); @@ -1710,7 +1704,6 @@ begin FUnitPathsFromCmdLine:=0; FIncludePaths.Clear; FIncludePathsFromCmdLine:=0; - FInsertFilenames.Clear; FStates:=FStates-[cfsMainJSFileResolved]; FNamespaces.Clear; FNamespacesFromCmdLine:=0; @@ -1865,57 +1858,6 @@ begin raise EFileNotFoundError.Create('invalid file name "'+Filename+'"'); end; -procedure TPas2jsFilesCache.InsertCustomJSFiles(aWriter: TPas2JSMapper); -var - i: Integer; - Filename: String; - FileResolver: TPas2jsFileResolver; - aFile: TPas2jsCachedFile; -begin - if InsertFilenames.Count=0 then exit; - FileResolver:=CreateResolver; - try - for i:=0 to InsertFilenames.Count-1 do begin - Filename:=FindCustomJSFileName(ResolveDots(InsertFilenames[i])); - if Filename='' then - begin - Log.LogMsg(nCustomJSFileNotFound,[InsertFilenames[i]]); - raise EFileNotFoundError.Create(''); - end; - aFile:=LoadFile(Filename); - if aFile.Source='' then continue; - aWriter.WriteFile(aFile.Source,Filename); - end - finally - FileResolver.Free; - end; -end; - -function TPas2jsFilesCache.IndexOfInsertJSFilename(const aFilename: string - ): integer; -var - i: Integer; -begin - for i:=0 to FInsertFilenames.Count-1 do - if CompareFilenames(aFilename,InsertFilenames[i])=0 then - exit(i); - Result:=-1; -end; - -procedure TPas2jsFilesCache.AddInsertJSFilename(const aFilename: string); -begin - if IndexOfInsertJSFilename(aFilename)<0 then - InsertFilenames.Add(aFilename); -end; - -procedure TPas2jsFilesCache.RemoveInsertJSFilename(const aFilename: string); -var - i: Integer; -begin - i:=IndexOfInsertJSFilename(aFilename); - if i>=0 then - InsertFilenames.Delete(i); -end; procedure TPas2jsFilesCache.GetListing(const aDirectory: string; var Files: TStrings; FullPaths: boolean); @@ -2066,7 +2008,7 @@ begin Result:=ExpandFileNamePJ(Filename,BaseDirectory); end; -function TPas2jsFilesCache.FindIncludeFileName(const aFilename: string; StrictFileCase : Boolean): String; +function TPas2jsFilesCache.FindIncludeFileName(const aFilename: string): String; function SearchCasedInIncPath(const Filename: string): string; var @@ -2077,12 +2019,12 @@ function TPas2jsFilesCache.FindIncludeFileName(const aFilename: string; StrictFi if BaseDirectory<>'' then begin Result:=BaseDirectory+Filename; - if SearchLowUpCase(Result,StrictFileCase) then exit; + if SearchLowUpCase(Result) then exit; end; // then search in include path for i:=0 to IncludePaths.Count-1 do begin Result:=IncludeTrailingPathDelimiter(IncludePaths[i])+Filename; - if SearchLowUpCase(Result,StrictFileCase) then exit; + if SearchLowUpCase(Result) then exit; end; Result:=''; end; @@ -2100,7 +2042,7 @@ begin if FilenameIsAbsolute(Filename) then begin Result:=Filename; - if not SearchLowUpCase(Result,StrictFileCase) then + if not SearchLowUpCase(Result) then Result:=''; exit; end; @@ -2121,7 +2063,7 @@ begin end; end; -function TPas2jsFilesCache.FindSourceFileName(const aFilename: string; StrictFileCase : Boolean): String; +function TPas2jsFilesCache.FindSourceFileName(const aFilename: string): String; Var Found: Boolean; @@ -2142,18 +2084,18 @@ begin raise EFileNotFoundError.Create(aFilename) end; -function TPas2jsFilesCache.FindUnitFileName(const aUnitname, InFilename: string; out IsForeign: boolean; StrictFileCase : Boolean): String; +function TPas2jsFilesCache.FindUnitFileName(const aUnitname, InFilename: string; out IsForeign: boolean): String; function SearchInDir(Dir: string; var Filename: string): boolean; // search in Dir for pp, pas, p times given case, lower case, upper case begin Dir:=IncludeTrailingPathDelimiter(Dir); Filename:=Dir+aUnitname+'.pp'; - if SearchLowUpCase(Filename,StrictFileCase) then exit(true); + if SearchLowUpCase(Filename) then exit(true); Filename:=Dir+aUnitname+'.pas'; - if SearchLowUpCase(Filename,StrictFileCase) then exit(true); + if SearchLowUpCase(Filename) then exit(true); Filename:=Dir+aUnitname+'.p'; - if SearchLowUpCase(Filename,StrictFileCase) then exit(true); + if SearchLowUpCase(Filename) then exit(true); Result:=false; end; @@ -2170,11 +2112,11 @@ begin Result:=ResolveDots(aFilename); if FilenameIsAbsolute(Result) then begin - if SearchLowUpCase(Result,StrictFileCase) then exit; + if SearchLowUpCase(Result) then exit; end else begin Result:=ResolveDots(BaseDirectory+Result); - if SearchLowUpCase(Result,StrictFileCase) then exit; + if SearchLowUpCase(Result) then exit; end; exit(''); end; @@ -2286,7 +2228,7 @@ begin Log.LogMsgIgnoreFilter(nSearchingFileNotFound,[FormatPath(Filename)]); end; -function TPas2jsFilesCache.SearchLowUpCase(var Filename: string; StrictFileCase : Boolean): boolean; +function TPas2jsFilesCache.SearchLowUpCase(var Filename: string): boolean; var i: Integer; {$IFNDEF CaseInsensitiveFilenames} diff --git a/packages/pastojs/src/pas2jspcucompiler.pp b/packages/pastojs/src/pas2jspcucompiler.pp index 022f7d8f48..f21f00840e 100644 --- a/packages/pastojs/src/pas2jspcucompiler.pp +++ b/packages/pastojs/src/pas2jspcucompiler.pp @@ -35,7 +35,7 @@ Type Function Compiler : TPas2JSCompiler; Function HandleException(E: exception) : Boolean; override; function FindPCU(const UseUnitName: string): string;override; - function FindPCU(const UseUnitName: string; out aFormat: TPas2JSPrecompileFormat): string; + function FindPCU(const UseUnitName: string; out aFormat: TPas2JSPrecompileFormat): string; Function HasReader : Boolean; override; Function ReadContinue: Boolean; override; Function ReadCanContinue : Boolean; override; @@ -199,7 +199,7 @@ function TFilerPCUSupport.FindPCU(const UseUnitName: string; out aFormat: TPas2 CurFormat:=PrecompileFormats[i]; if not CurFormat.Enabled then continue; Filename:=DirPath+UseUnitName+'.'+CurFormat.Ext; - if Compiler.FileCache.SearchLowUpCase(Filename,MyFile.FileResolver.StrictFileCase) then + if Compiler.FileCache.SearchLowUpCase(Filename) then begin FindPCU:=Filename; aFormat:=CurFormat;