fcl-passrc: fixed search include file mode objfpc in dir of current include file

This commit is contained in:
mattias 2020-12-07 23:17:57 +00:00
parent 2865164d2b
commit 31103c3c9f
2 changed files with 40 additions and 10 deletions

View File

@ -123,8 +123,11 @@ begin
D:=ExtractFilePath(FileName); D:=ExtractFilePath(FileName);
If (D='') then If (D='') then
D:='.'; D:='.';
FResolver.ModuleDirectory:=D;
FResolver.BaseDirectory:=D; FResolver.BaseDirectory:=D;
FResolver.AddIncludePath(D);
FResolver.AddIncludePath(D); // still needed?
FScanner:=TPascalScanner.Create(FResolver); FScanner:=TPascalScanner.Create(FResolver);
FScanner.OpenFile(FileName); FScanner.OpenFile(FileName);
FContainer:=TSrcContainer.Create; FContainer:=TSrcContainer.Create;

View File

@ -490,12 +490,15 @@ type
TBaseFileResolver = class TBaseFileResolver = class
private private
FBaseDirectory: string; FBaseDirectory: string;
FMode: TModeSwitch;
FModuleDirectory: string;
FResourcePaths, FResourcePaths,
FIncludePaths: TStringList; FIncludePaths: TStringList;
FStrictFileCase : Boolean; FStrictFileCase : Boolean;
Protected Protected
function FindIncludeFileName(const aFilename: string): String; virtual; abstract; function FindIncludeFileName(const aFilename: string): String; virtual; abstract;
procedure SetBaseDirectory(AValue: string); virtual; procedure SetBaseDirectory(AValue: string); virtual;
procedure SetModuleDirectory(AValue: string); virtual;
procedure SetStrictFileCase(AValue: Boolean); virtual; procedure SetStrictFileCase(AValue: Boolean); virtual;
Property IncludePaths: TStringList Read FIncludePaths; Property IncludePaths: TStringList Read FIncludePaths;
Property ResourcePaths: TStringList Read FResourcePaths; Property ResourcePaths: TStringList Read FResourcePaths;
@ -507,8 +510,10 @@ type
function FindResourceFileName(const AName: string): String; virtual; abstract; function FindResourceFileName(const AName: string): String; virtual; abstract;
function FindSourceFile(const AName: string): TLineReader; virtual; abstract; function FindSourceFile(const AName: string): TLineReader; virtual; abstract;
function FindIncludeFile(const AName: string): TLineReader; virtual; abstract; function FindIncludeFile(const AName: string): TLineReader; virtual; abstract;
Property StrictFileCase : Boolean Read FStrictFileCase Write SetStrictFileCase; property BaseDirectory: string read FBaseDirectory write SetBaseDirectory; // e.g. current path of include file
property BaseDirectory: string read FBaseDirectory write SetBaseDirectory; property Mode: TModeSwitch read FMode write FMode;
property ModuleDirectory: string read FModuleDirectory write SetModuleDirectory; // e.g. path of module file
property StrictFileCase : Boolean Read FStrictFileCase Write SetStrictFileCase;
end; end;
TBaseFileResolverClass = Class of TBaseFileResolver; TBaseFileResolverClass = Class of TBaseFileResolver;
@ -2454,22 +2459,30 @@ end;
procedure TBaseFileResolver.SetBaseDirectory(AValue: string); procedure TBaseFileResolver.SetBaseDirectory(AValue: string);
begin begin
AValue:=IncludeTrailingPathDelimiter(AValue);
if FBaseDirectory=AValue then Exit; if FBaseDirectory=AValue then Exit;
FBaseDirectory:=AValue; FBaseDirectory:=AValue;
end; end;
procedure TBaseFileResolver.SetModuleDirectory(AValue: string);
begin
AValue:=IncludeTrailingPathDelimiter(AValue);
if FModuleDirectory=AValue then Exit;
FModuleDirectory:=AValue;
end;
procedure TBaseFileResolver.SetStrictFileCase(AValue: Boolean); procedure TBaseFileResolver.SetStrictFileCase(AValue: Boolean);
begin begin
if FStrictFileCase=AValue then Exit; if FStrictFileCase=AValue then Exit;
FStrictFileCase:=AValue; FStrictFileCase:=AValue;
end; end;
constructor TBaseFileResolver.Create; constructor TBaseFileResolver.Create;
begin begin
inherited Create; inherited Create;
FIncludePaths := TStringList.Create; FIncludePaths := TStringList.Create;
FResourcePaths := TStringList.Create; FResourcePaths := TStringList.Create;
FMode:=msFPC;
end; end;
destructor TBaseFileResolver.Destroy; destructor TBaseFileResolver.Destroy;
@ -2556,15 +2569,27 @@ function TFileResolver.FindIncludeFileName(const AName: string): String;
begin begin
Result:=''; Result:='';
// search in BaseDirectory (not in mode Delphi)
if (BaseDirectory<>'')
and ((ModuleDirectory='') or not (Mode in [msDelphi,msDelphiUnicode])) then
begin
Result:=SearchLowUpCase(BaseDirectory+FN);
if Result<>'' then exit;
end;
// search in ModuleDirectory
if (ModuleDirectory<>'') then
begin
Result:=SearchLowUpCase(ModuleDirectory+FN);
if Result<>'' then exit;
end;
// search in include paths
I:=0; I:=0;
While (Result='') and (I<FIncludePaths.Count) do While (I<FIncludePaths.Count) do
begin begin
Result:=SearchLowUpCase(FIncludePaths[i]+FN); Result:=SearchLowUpCase(FIncludePaths[i]+FN);
if Result<>'' then exit;
Inc(I); Inc(I);
end; end;
// search in BaseDirectory
if (Result='') and (BaseDirectory<>'') then
Result:=SearchLowUpCase(BaseDirectory+FN);
end; end;
var var
@ -2930,6 +2955,7 @@ begin
aPath:=ExtractFilePath(FCurFilename); aPath:=ExtractFilePath(FCurFilename);
if (aPath<>'') then if (aPath<>'') then
aPath:=IncludeTrailingPathDelimiter(aPath); aPath:=IncludeTrailingPathDelimiter(aPath);
FileResolver.ModuleDirectory := aPath;
FileResolver.BaseDirectory := aPath; FileResolver.BaseDirectory := aPath;
{$ENDIF} {$ENDIF}
if LogEvent(sleFile) then if LogEvent(sleFile) then
@ -3371,9 +3397,9 @@ begin
PushStackItem; PushStackItem;
FCurSourceFile:=NewSourceFile; FCurSourceFile:=NewSourceFile;
FCurFilename := Param; FCurFilename := Param;
if FCurSourceFile is TFileLineReader then if FCurSourceFile is TLineReader then
begin begin
aFileName:=TFileLineReader(FCurSourceFile).Filename; aFileName:=TLineReader(FCurSourceFile).Filename;
FileResolver.BaseDirectory := ExtractFilePath(aFileName); FileResolver.BaseDirectory := ExtractFilePath(aFileName);
FCurFilename := aFileName; // nicer error messages FCurFilename := aFileName; // nicer error messages
end; end;
@ -3717,6 +3743,7 @@ procedure TPascalScanner.HandleMode(const Param: String);
SetNonToken(tkotherwise); SetNonToken(tkotherwise);
end; end;
Handled:=false; Handled:=false;
FileResolver.Mode:=LangMode;
if Assigned(OnModeChanged) then if Assigned(OnModeChanged) then
OnModeChanged(Self,LangMode,false,Handled); OnModeChanged(Self,LangMode,false,Handled);
end; end;