* Includefile also must set basename

git-svn-id: trunk@47468 -
This commit is contained in:
michael 2020-11-20 09:09:44 +00:00
parent 8ff5adeb4f
commit ec4df539c3
2 changed files with 68 additions and 18 deletions

View File

@ -821,6 +821,7 @@ type
procedure HandleWarn(Param: String); virtual; procedure HandleWarn(Param: String); virtual;
procedure HandleWarnIdentifier(Identifier, Value: String); virtual; procedure HandleWarnIdentifier(Identifier, Value: String); virtual;
procedure PushStackItem; virtual; procedure PushStackItem; virtual;
procedure PopStackItem; virtual;
function DoFetchTextToken: TToken; function DoFetchTextToken: TToken;
function DoFetchToken: TToken; function DoFetchToken: TToken;
procedure ClearFiles; procedure ClearFiles;
@ -2757,6 +2758,8 @@ begin
Inc(J); Inc(J);
end; end;
end; end;
if (I=-1) and (BaseDirectory<>'') then
I:=FStreams.IndexOf(IncludeTrailingPathDelimiter(BaseDirectory)+aName);
If (I<>-1) then If (I<>-1) then
Result:=FStreams.Objects[i] as TStream; Result:=FStreams.Objects[i] as TStream;
end; end;
@ -2914,13 +2917,20 @@ begin
end; end;
procedure TPascalScanner.OpenFile(AFilename: string); procedure TPascalScanner.OpenFile(AFilename: string);
Var
aPath : String;
begin begin
Clearfiles; Clearfiles;
FCurSourceFile := FileResolver.FindSourceFile(AFilename); FCurSourceFile := FileResolver.FindSourceFile(AFilename);
FCurFilename := AFilename; FCurFilename := AFilename;
AddFile(FCurFilename); AddFile(FCurFilename);
{$IFDEF HASFS} {$IFDEF HASFS}
FileResolver.BaseDirectory := IncludeTrailingPathDelimiter(ExtractFilePath(FCurFilename)); aPath:=ExtractFilePath(FCurFilename);
if (aPath<>'') then
aPath:=IncludeTrailingPathDelimiter(aPath);
FileResolver.BaseDirectory := aPath;
{$ENDIF} {$ENDIF}
if LogEvent(sleFile) then if LogEvent(sleFile) then
DoLog(mtInfo,nLogOpeningFile,SLogOpeningFile,[FormatPath(AFileName)],True); DoLog(mtInfo,nLogOpeningFile,SLogOpeningFile,[FormatPath(AFileName)],True);
@ -2970,9 +2980,31 @@ begin
Result:=tkoperator; Result:=tkoperator;
end; end;
function TPascalScanner.FetchToken: TToken; Procedure TPascalScanner.PopStackItem;
var var
IncludeStackItem: TIncludeStackItem; IncludeStackItem: TIncludeStackItem;
aFileName : String;
begin
IncludeStackItem :=
TIncludeStackItem(FIncludeStack[FIncludeStack.Count - 1]);
FIncludeStack.Delete(FIncludeStack.Count - 1);
CurSourceFile.{$ifdef pas2js}Destroy{$else}Free{$endif};
FCurSourceFile := IncludeStackItem.SourceFile;
FCurFilename := IncludeStackItem.Filename;
FileResolver.BaseDirectory:=ExtractFilePath(FCurFilename);
FCurToken := IncludeStackItem.Token;
FCurTokenString := IncludeStackItem.TokenString;
FCurLine := IncludeStackItem.Line;
FCurRow := IncludeStackItem.Row;
FCurColumnOffset := IncludeStackItem.ColumnOffset;
FTokenPos := IncludeStackItem.TokenPos;
IncludeStackItem.Free;
end;
function TPascalScanner.FetchToken: TToken;
begin begin
FPreviousToken:=FCurToken; FPreviousToken:=FCurToken;
while true do while true do
@ -2983,19 +3015,7 @@ begin
begin begin
if FIncludeStack.Count > 0 then if FIncludeStack.Count > 0 then
begin begin
IncludeStackItem := PopStackitem;
TIncludeStackItem(FIncludeStack[FIncludeStack.Count - 1]);
FIncludeStack.Delete(FIncludeStack.Count - 1);
CurSourceFile.{$ifdef pas2js}Destroy{$else}Free{$endif};
FCurSourceFile := IncludeStackItem.SourceFile;
FCurFilename := IncludeStackItem.Filename;
FCurToken := IncludeStackItem.Token;
FCurTokenString := IncludeStackItem.TokenString;
FCurLine := IncludeStackItem.Line;
FCurRow := IncludeStackItem.Row;
FCurColumnOffset := IncludeStackItem.ColumnOffset;
FTokenPos := IncludeStackItem.TokenPos;
IncludeStackItem.Free;
Result := FCurToken; Result := FCurToken;
end end
else else
@ -3330,6 +3350,8 @@ procedure TPascalScanner.HandleIncludeFile(Param: String);
var var
NewSourceFile: TLineReader; NewSourceFile: TLineReader;
aFileName : string;
begin begin
Param:=Trim(Param); Param:=Trim(Param);
if Length(Param)>1 then if Length(Param)>1 then
@ -3345,11 +3367,16 @@ begin
if not Assigned(NewSourceFile) then if not Assigned(NewSourceFile) then
Error(nErrIncludeFileNotFound, SErrIncludeFileNotFound, [Param]); Error(nErrIncludeFileNotFound, SErrIncludeFileNotFound, [Param]);
PushStackItem; PushStackItem;
FCurSourceFile:=NewSourceFile; FCurSourceFile:=NewSourceFile;
FCurFilename := Param; FCurFilename := Param;
if FCurSourceFile is TFileLineReader then if FCurSourceFile is TFileLineReader then
FCurFilename := TFileLineReader(FCurSourceFile).Filename; // nicer error messages begin
aFileName:=TFileLineReader(FCurSourceFile).Filename;
FileResolver.BaseDirectory := ExtractFilePath(aFileName);
FCurFilename := aFileName; // nicer error messages
end;
AddFile(FCurFilename); AddFile(FCurFilename);
If LogEvent(sleFile) then If LogEvent(sleFile) then
DoLog(mtInfo,nLogOpeningFile,SLogOpeningFile,[FormatPath(FCurFileName)],True); DoLog(mtInfo,nLogOpeningFile,SLogOpeningFile,[FormatPath(FCurFileName)],True);

View File

@ -57,6 +57,7 @@ type
FResolver : TStreamResolver; FResolver : TStreamResolver;
FDoCommentCalled : Boolean; FDoCommentCalled : Boolean;
FComment: string; FComment: string;
FPathPrefix : String;
protected protected
procedure DoComment(Sender: TObject; aComment: String); procedure DoComment(Sender: TObject; aComment: String);
procedure SetUp; override; procedure SetUp; override;
@ -65,12 +66,15 @@ type
Procedure AssertEquals(Msg : String; Expected,Actual : TToken); overload; Procedure AssertEquals(Msg : String; Expected,Actual : TToken); overload;
Procedure AssertEquals(Msg : String; Expected,Actual : TModeSwitch); overload; Procedure AssertEquals(Msg : String; Expected,Actual : TModeSwitch); overload;
Procedure AssertEquals(Msg : String; Expected,Actual : TModeSwitches); overload; Procedure AssertEquals(Msg : String; Expected,Actual : TModeSwitches); overload;
// creates a virtual source file with name 'afile.pp', prepended with PathPrefix
procedure NewSource(Const Source : string; DoClear : Boolean = True); procedure NewSource(Const Source : string; DoClear : Boolean = True);
Procedure DoTestToken(t : TToken; Const ASource : String; Const CheckEOF : Boolean = True); Procedure DoTestToken(t : TToken; Const ASource : String; Const CheckEOF : Boolean = True);
Procedure TestToken(t : TToken; Const ASource : String; Const CheckEOF : Boolean = True); Procedure TestToken(t : TToken; Const ASource : String; Const CheckEOF : Boolean = True);
Procedure TestTokens(t : array of TToken; Const ASource : String; Const CheckEOF : Boolean = True;Const DoClear : Boolean = True); Procedure TestTokens(t : array of TToken; Const ASource : String; Const CheckEOF : Boolean = True;Const DoClear : Boolean = True);
Property LastIDentifier : String Read FLI Write FLi; Property LastIDentifier : String Read FLI Write FLi;
Property Scanner : TPascalScanner Read FScanner; Property Scanner : TPascalScanner Read FScanner;
// Path for source filename.
Property PathPrefix : String Read FPathPrefix Write FPathPrefix;
published published
Procedure TestEmpty; Procedure TestEmpty;
procedure TestEOF; procedure TestEOF;
@ -235,6 +239,7 @@ type
Procedure TestDefine14; Procedure TestDefine14;
Procedure TestInclude; Procedure TestInclude;
Procedure TestInclude2; Procedure TestInclude2;
Procedure TestInclude3;
Procedure TestUnDefine1; Procedure TestUnDefine1;
Procedure TestMacro1; Procedure TestMacro1;
procedure TestMacro2; procedure TestMacro2;
@ -444,17 +449,25 @@ begin
end; end;
procedure TTestScanner.NewSource(const Source: string; DoClear : Boolean = True); procedure TTestScanner.NewSource(const Source: string; DoClear : Boolean = True);
Var
aFile : String;
begin begin
aFile:='';
if DoClear then if DoClear then
FResolver.Clear; FResolver.Clear;
FResolver.AddStream('afile.pp',TStringStream.Create(Source)); if (FPathPrefix<>'') then
aFile:=IncludeTrailingPathDelimiter(FPathPrefix);
aFile:=aFile+'afile.pp';
FResolver.AddStream(aFile,TStringStream.Create(Source));
{$ifndef NOCONSOLE} // JC: To get the tests to run with GUI {$ifndef NOCONSOLE} // JC: To get the tests to run with GUI
Writeln('// '+TestName); Writeln('// '+TestName);
Writeln(Source); Writeln(Source);
{$EndIf} {$EndIf}
// FreeAndNil(FScanner); // FreeAndNil(FScanner);
// FScanner:=TTestingPascalScanner.Create(FResolver); // FScanner:=TTestingPascalScanner.Create(FResolver);
FScanner.OpenFile('afile.pp'); FScanner.OpenFile(aFile);
end; end;
procedure TTestScanner.DoTestToken(t: TToken; const ASource: String; procedure TTestScanner.DoTestToken(t: TToken; const ASource: String;
@ -1625,6 +1638,16 @@ begin
TestTokens([tkIf,tkTrue,tkThen,tkElse],'{$I myinclude.inc} else',True,False); TestTokens([tkIf,tkTrue,tkThen,tkElse],'{$I myinclude.inc} else',True,False);
end; end;
procedure TTestScanner.TestInclude3;
begin
PathPrefix:='src';
FResolver.AddStream('src/myinclude2.inc',TStringStream.Create(' true '));
FResolver.AddStream('src/myinclude1.inc',TStringStream.Create('if {$i myinclude2.inc} then '));
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
TestTokens([tkIf,tkTrue,tkThen,tkElse],'{$I src/myinclude1.inc} else',True,False);
end;
procedure TTestScanner.TestUnDefine1; procedure TTestScanner.TestUnDefine1;
begin begin
FSCanner.Defines.Add('ALWAYS'); FSCanner.Defines.Add('ALWAYS');