diff options
author | mattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-11-20 16:11:18 +0000 |
---|---|---|
committer | mattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-11-20 16:11:18 +0000 |
commit | 39ccf0c4e75d11fcf68067b8001af93c278af21f (patch) | |
tree | 195d188ad59a2550731ac88fc12135015249a50f /packages | |
parent | 9001752c1c820d53c5d112caa9d7a4a82dc9edba (diff) | |
download | fpc-39ccf0c4e75d11fcf68067b8001af93c278af21f.tar.gz |
pastojs: fixed search include file mode objfpc in dir of current include file
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@47493 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages')
-rw-r--r-- | packages/pastojs/src/pas2jsfilecache.pp | 51 | ||||
-rw-r--r-- | packages/pastojs/src/pas2jsfs.pp | 6 | ||||
-rw-r--r-- | packages/pastojs/tests/tcmodules.pas | 2 | ||||
-rw-r--r-- | packages/pastojs/tests/tcunitsearch.pas | 52 |
4 files changed, 95 insertions, 16 deletions
diff --git a/packages/pastojs/src/pas2jsfilecache.pp b/packages/pastojs/src/pas2jsfilecache.pp index fee9d389a8..8ea388c1f1 100644 --- a/packages/pastojs/src/pas2jsfilecache.pp +++ b/packages/pastojs/src/pas2jsfilecache.pp @@ -259,7 +259,7 @@ type function FindUnitJSFileName(const aUnitFilename: string): String; override; function FindUnitFileName(const aUnitname, InFilename, ModuleDir: string; out IsForeign: boolean): String; override; function FindResourceFileName(const aFilename, ModuleDir: string): String; override; - function FindIncludeFileName(const aFilename, ModuleDir: string): String; override; + function FindIncludeFileName(const aFilename, SrcDir, ModuleDir: string; Mode: TModeSwitch): String; override; function AddIncludePaths(const Paths: string; FromCmdLine: boolean; out ErrorMsg: string): boolean; function AddUnitPaths(const Paths: string; FromCmdLine: boolean; out ErrorMsg: string): boolean; function AddSrcUnitPaths(const Paths: string; FromCmdLine: boolean; out ErrorMsg: string): boolean; @@ -1832,25 +1832,52 @@ begin UsePointDirectory, AlwaysRequireSharedBaseFolder, RelPath); end; -function TPas2jsFilesCache.FindIncludeFileName(const aFilename, - ModuleDir: string): String; +function TPas2jsFilesCache.FindIncludeFileName(const aFilename, SrcDir, + ModuleDir: string; Mode: TModeSwitch): String; function SearchCasedInIncPath(const Filename: string): string; var + SearchedDir: array of string; + + function SearchDir(Dir: string): boolean; + var + i: Integer; + CurFile: String; + begin + Dir:=IncludeTrailingPathDelimiter(Dir); + for i:=0 to length(SearchedDir)-1 do + if SearchedDir[i]=Dir then exit; + CurFile:=Dir+Filename; + //writeln('SearchDir aFilename=',aFilename,' SrcDir=',SrcDir,' ModDir=',ModuleDir,' Mode=',Mode,' CurFile=',CurFile); + Result:=SearchLowUpCase(CurFile); + if Result then + SearchCasedInIncPath:=CurFile + else begin + i:=length(SearchedDir); + SetLength(SearchedDir,i+1); + SearchedDir[i]:=Dir; + end; + end; + + var i: Integer; begin // file name is relative - // first search in the same directory as the unit + SearchedDir:=nil; + + // first search in the same directory as the include file + if not (Mode in [msDelphi,msDelphiUnicode]) + and (SrcDir<>'') then + if SearchDir(SrcDir) then exit; + + // then search in the same directory as the unit if ModuleDir<>'' then - begin - Result:=IncludeTrailingPathDelimiter(ModuleDir)+Filename; - if SearchLowUpCase(Result) then exit; - end; + if SearchDir(ModuleDir) then exit; + // then search in include path - for i:=0 to IncludePaths.Count-1 do begin - Result:=IncludeTrailingPathDelimiter(IncludePaths[i])+Filename; - if SearchLowUpCase(Result) then exit; - end; + for i:=0 to IncludePaths.Count-1 do + if SearchDir(IncludePaths[i]) then exit; + Result:=''; end; diff --git a/packages/pastojs/src/pas2jsfs.pp b/packages/pastojs/src/pas2jsfs.pp index 2dd9146beb..587589c901 100644 --- a/packages/pastojs/src/pas2jsfs.pp +++ b/packages/pastojs/src/pas2jsfs.pp @@ -98,7 +98,7 @@ Type Public // Public Abstract. Must be overridden function FindResourceFileName(const aFilename, ModuleDir: string): String; virtual; abstract; - function FindIncludeFileName(const aFilename, ModuleDir: string): String; virtual; abstract; + function FindIncludeFileName(const aFilename, SrcDir, ModuleDir: string; Mode: TModeSwitch): String; virtual; abstract; function LoadFile(Filename: string; Binary: boolean = false): TPas2jsFile; virtual; abstract; Function FileExists(Const aFileName: String): Boolean; virtual; abstract; function FindUnitJSFileName(const aUnitFilename: string): String; virtual; abstract; @@ -421,7 +421,7 @@ var Filename: String; begin Result:=nil; - Filename:=FS.FindIncludeFileName(aFilename,BaseDirectory); + Filename:=FS.FindIncludeFileName(aFilename,BaseDirectory,ModuleDirectory,Mode); if Filename='' then exit; try Result:=FindSourceFile(Filename); @@ -444,7 +444,7 @@ end; function TPas2jsFSResolver.FindIncludeFileName(const aFilename: string): String; begin - Result:=FS.FindIncludeFileName(aFilename,BaseDirectory); + Result:=FS.FindIncludeFileName(aFilename,BaseDirectory,ModuleDirectory,Mode); end; diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index 6d020e6d3e..124d64ba44 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/packages/pastojs/tests/tcmodules.pas @@ -233,7 +233,7 @@ type Published Procedure TestReservedWords; - // program/units + // program, units, includes Procedure TestEmptyProgram; Procedure TestEmptyProgramUseStrict; Procedure TestEmptyUnit; diff --git a/packages/pastojs/tests/tcunitsearch.pas b/packages/pastojs/tests/tcunitsearch.pas index 3c8945e2e0..4cc0c52d7f 100644 --- a/packages/pastojs/tests/tcunitsearch.pas +++ b/packages/pastojs/tests/tcunitsearch.pas @@ -143,7 +143,11 @@ type procedure TestUS_Program_FU; procedure TestUS_Program_FU_o; procedure TestUS_Program_FE_o; + + // include files procedure TestUS_IncludeSameDir; + Procedure TestUS_Include_NestedDelphi; + Procedure TestUS_Include_NestedObjFPC; // uses 'in' modifier procedure TestUS_UsesInFile; @@ -728,6 +732,54 @@ begin Compile(['test1.pas','-Fusub','-FElib','-ofoo.js']); end; +procedure TTestCLI_UnitSearch.TestUS_Include_NestedDelphi; +begin + AddUnit('system.pp',[''],['']); + AddFile('sub/inc1.inc',[ + 'type number = longint;', + '{$I sub/deep/inc2.inc}', + '']); + AddFile('sub/deep/inc2.inc',[ + 'type numero = number;', + '{$I sub/inc3.inc}', + '']); + AddFile('sub/inc3.inc',[ + 'type nummer = numero;', + '']); + AddFile('test1.pas',[ + '{$mode delphi}', + '{$i sub/inc1.inc}', + 'var', + ' n: nummer;', + 'begin', + 'end.']); + Compile(['test1.pas','-Jc']); +end; + +procedure TTestCLI_UnitSearch.TestUS_Include_NestedObjFPC; +begin + AddUnit('system.pp',[''],['']); + AddFile('sub/inc1.inc',[ + 'type number = longint;', + '{$I deep/inc2.inc}', + '']); + AddFile('sub/deep/inc2.inc',[ + 'type numero = number;', + '{$I ../inc3.inc}', + '']); + AddFile('sub/inc3.inc',[ + 'type nummer = numero;', + '']); + AddFile('test1.pas',[ + '{$mode objfpc}', + '{$i sub/inc1.inc}', + 'var', + ' n: nummer;', + 'begin', + 'end.']); + Compile(['test1.pas','-Jc']); +end; + procedure TTestCLI_UnitSearch.TestUS_UsesInFile; begin AddUnit('system.pp',[''],['']); |