mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-07 01:57:57 +02:00
IDE: fpc msg parser: reverse source files from test build directory, bug #30787
git-svn-id: trunk@53208 -
This commit is contained in:
parent
98e64cab9d
commit
9c41906a96
@ -33,6 +33,8 @@ const
|
||||
|
||||
AbortedExitCode = 12321;
|
||||
|
||||
MsgAttrDiskFilename = 'DiskFile';
|
||||
|
||||
const
|
||||
IDEToolCompilePackage = 'Package';
|
||||
IDEToolCompileProject = 'Project'; // the active project
|
||||
@ -99,7 +101,7 @@ type
|
||||
mlfFixed, // reason for the messages was resolved, e.g. quick fixed
|
||||
mlfHiddenByIDEDirective,
|
||||
mlfHiddenByIDEDirectiveValid,
|
||||
mlfFileSearched // file was searched, FullFilename valid
|
||||
mlfTestBuildFile // Filename is not absolute, the test filename on disk is in Attributes[MsgAttrDiskFilename]
|
||||
);
|
||||
TMessageLineFlags = set of TMessageLineFlag;
|
||||
|
||||
|
@ -211,7 +211,8 @@ type
|
||||
const PPUFilename: string): boolean;
|
||||
procedure Translate(p: PChar; MsgItem, TranslatedItem: TFPCMsgItem;
|
||||
out TranslatedMsg: String; out MsgType: TMessageLineUrgency);
|
||||
procedure ReverseInstantFPCCacheDir(var aFilename: string; aSynchronized: boolean);
|
||||
function ReverseInstantFPCCacheDir(var aFilename: string; aSynchronized: boolean): boolean;
|
||||
function ReverseTestBuildDir(MsgLine: TMessageLine; var aFilename: string): boolean;
|
||||
function LongenFilename(MsgLine: TMessageLine; aFilename: string): string; // (worker thread)
|
||||
public
|
||||
DirectoryStack: TStrings;
|
||||
@ -220,6 +221,8 @@ type
|
||||
TranslationFilename: string; // e.g. /path/to/fpcsrc/compiler/msg/errord.msg
|
||||
TranslationFile: TFPCMsgFilePoolItem;
|
||||
InstantFPCCache: string; // with trailing pathdelim
|
||||
TestBuildDir: string; // with trailing pathdelim
|
||||
VirtualProjectFiles: TFilenameToPointerTree;
|
||||
FPC_FullVersion: cardinal;
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
@ -1064,6 +1067,7 @@ end;
|
||||
|
||||
destructor TIDEFPCParser.Destroy;
|
||||
begin
|
||||
FreeAndNil(VirtualProjectFiles);
|
||||
FreeAndNil(FFilesToIgnoreUnitNotUsed);
|
||||
FreeAndNil(fFileExists);
|
||||
FreeAndNil(fCurSource);
|
||||
@ -1106,6 +1110,8 @@ var
|
||||
FPCVersion: integer;
|
||||
FPCRelease: integer;
|
||||
FPCPatch: integer;
|
||||
aProject: TLazProject;
|
||||
aProjFile: TLazProjectFile;
|
||||
begin
|
||||
inherited Init;
|
||||
|
||||
@ -1150,6 +1156,22 @@ begin
|
||||
InstantFPCCache:=AppendPathDelim(InstantFPCCache)
|
||||
else
|
||||
InstantFPCCache:='';
|
||||
|
||||
// get TestBuildDir
|
||||
if Tool.CurrentDirectoryIsTestDir then begin
|
||||
// source filenames in CurrentDirectory must be reversed back
|
||||
// -> store the list of virtual filenames (needed by worker thread)
|
||||
TestBuildDir:=AppendPathDelim(ResolveDots(Tool.Process.CurrentDirectory));
|
||||
if VirtualProjectFiles=nil then
|
||||
VirtualProjectFiles:=TFilenameToPointerTree.Create(true);
|
||||
aProject:=LazarusIDE.ActiveProject;
|
||||
for i:=0 to aProject.FileCount-1 do begin
|
||||
aProjFile:=aProject.Files[i];
|
||||
if aProjFile.IsPartOfProject and (not FilenameIsAbsolute(aProjFile.Filename)) then
|
||||
VirtualProjectFiles[aProjFile.Filename]:=Tool;
|
||||
end;
|
||||
end else
|
||||
TestBuildDir:='';
|
||||
end;
|
||||
|
||||
procedure TIDEFPCParser.InitReading;
|
||||
@ -1819,12 +1841,14 @@ begin
|
||||
if IndexInStringList(FilesToIgnoreUnitNotUsed,cstFilename,MsgLine.Filename)>=0 then
|
||||
begin
|
||||
MsgLine.Urgency:=mluVerbose;
|
||||
end else if HideHintsUnitNotUsedInMainSource
|
||||
and FilenameIsAbsolute(MsgLine.Filename)
|
||||
and ((CompareFileExt(MsgLine.Filename, 'lpr', false)=0)
|
||||
or FileExists(ChangeFileExt(MsgLine.Filename, '.lpk'), aPhase=etpspSynchronized))
|
||||
end else if HideHintsUnitNotUsedInMainSource then begin
|
||||
if CompareFileExt(MsgLine.Filename, 'lpr', false)=0 then
|
||||
// a lpr does not use a unit => not important
|
||||
MsgLine.Urgency:=mluVerbose;
|
||||
end else if FilenameIsAbsolute(MsgLine.Filename)
|
||||
and FileExists(ChangeFileExt(MsgLine.Filename, '.lpk'), aPhase=etpspSynchronized)
|
||||
then begin
|
||||
// a lpk/lpr does not use a unit => almost always not important
|
||||
// a lpk does not use a unit => not important
|
||||
MsgLine.Urgency:=mluVerbose;
|
||||
end;
|
||||
end;
|
||||
@ -2054,7 +2078,7 @@ begin
|
||||
Filename:=NewFilename;
|
||||
end;
|
||||
|
||||
if FilenameIsAbsolute(Filename) then begin
|
||||
if FilenameIsAbsolute(Filename) or (mlfTestBuildFile in MsgLine.Flags) then begin
|
||||
CodeBuf:=CodeToolBoss.LoadFile(Filename,false,false);
|
||||
if CodeBuf=nil then begin
|
||||
{$IFDEF VerboseFPCMsgUnitNotFound}
|
||||
@ -2517,16 +2541,40 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TIDEFPCParser.ReverseInstantFPCCacheDir(var aFilename: string;
|
||||
aSynchronized: boolean);
|
||||
function TIDEFPCParser.ReverseInstantFPCCacheDir(var aFilename: string;
|
||||
aSynchronized: boolean): boolean;
|
||||
var
|
||||
Reversed: String;
|
||||
begin
|
||||
Result:=false;
|
||||
if (InstantFPCCache<>'')
|
||||
and (CompareFilenames(ExtractFilePath(aFilename),InstantFPCCache)=0) then begin
|
||||
Reversed:=AppendPathDelim(Tool.WorkerDirectory)+ExtractFilename(aFilename);
|
||||
if FileExists(Reversed,aSynchronized) then
|
||||
if FileExists(Reversed,aSynchronized) then begin
|
||||
aFilename:=Reversed;
|
||||
Result:=true;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TIDEFPCParser.ReverseTestBuildDir(MsgLine: TMessageLine;
|
||||
var aFilename: string): boolean;
|
||||
var
|
||||
Reversed: String;
|
||||
l: Integer;
|
||||
begin
|
||||
Result:=false;
|
||||
if not Tool.CurrentDirectoryIsTestDir then exit;
|
||||
l:=length(TestBuildDir); // Note: TestBuildDir includes trailing PathDelim
|
||||
if (length(aFilename)>l) and (aFilename[l]=PathDelim)
|
||||
and (CompareFilenames(LeftStr(aFilename,l),TestBuildDir)=0) then begin
|
||||
Reversed:=copy(aFilename,l+1,length(aFilename));
|
||||
if VirtualProjectFiles.Contains(Reversed) then begin
|
||||
MsgLine.Flags:=MsgLine.Flags+[mlfTestBuildFile];
|
||||
MsgLine.Attribute[MsgAttrDiskFilename]:=aFilename;
|
||||
aFilename:=Reversed;
|
||||
Result:=true;
|
||||
end
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -2952,7 +3000,8 @@ var
|
||||
begin
|
||||
Result:=TrimFilename(aFilename);
|
||||
if FilenameIsAbsolute(Result) then begin
|
||||
ReverseInstantFPCCacheDir(Result,false);
|
||||
if ReverseInstantFPCCacheDir(Result,false) then exit;
|
||||
if ReverseTestBuildDir(MsgLine,Result) then exit;
|
||||
exit;
|
||||
end;
|
||||
if MsgLine.Attribute['PPU']<>'' then begin
|
||||
@ -2964,13 +3013,21 @@ begin
|
||||
// check last message line
|
||||
LastMsgLine:=Tool.WorkerMessages.GetLastLine;
|
||||
if (LastMsgLine<>nil) then begin
|
||||
LastFilename:=LastMsgLine.Filename;
|
||||
if mlfTestBuildFile in LastMsgLine.Flags then
|
||||
LastFilename:=LastMsgLine.Attribute[MsgAttrDiskFilename]
|
||||
else
|
||||
LastFilename:=LastMsgLine.Filename;
|
||||
if FilenameIsAbsolute(LastFilename) then begin
|
||||
if (length(LastFilename)>length(ShortFilename))
|
||||
and (LastFilename[length(LastFilename)-length(ShortFilename)] in AllowDirectorySeparators)
|
||||
and (CompareFilenames(RightStr(LastFilename,length(ShortFilename)),ShortFilename)=0)
|
||||
then begin
|
||||
Result:=LastFilename;
|
||||
if mlfTestBuildFile in LastMsgLine.Flags then begin
|
||||
MsgLine.Attribute[MsgAttrDiskFilename]:=LastFilename;
|
||||
MsgLine.Flags:=MsgLine.Flags+[mlfTestBuildFile];
|
||||
Result:=LastMsgLine.Filename;
|
||||
end else
|
||||
Result:=LastFilename;
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
@ -2979,13 +3036,19 @@ begin
|
||||
if DirectoryStack<>nil then begin
|
||||
for i:=DirectoryStack.Count-1 downto 0 do begin
|
||||
Result:=AppendPathDelim(DirectoryStack[i])+ShortFilename;
|
||||
if FileExists(Result,false) then exit;
|
||||
if FileExists(Result,false) then begin
|
||||
ReverseTestBuildDir(MsgLine,Result);
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
// search file in worker directory
|
||||
if Tool.WorkerDirectory<>'' then begin
|
||||
Result:=AppendPathDelim(Tool.WorkerDirectory)+ShortFilename;
|
||||
if FileExists(Result,false) then exit;
|
||||
if FileExists(Result,false) then begin
|
||||
ReverseTestBuildDir(MsgLine,Result);
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
|
||||
// file not found
|
||||
@ -3019,7 +3082,10 @@ begin
|
||||
if (Y>0) and (X>0)
|
||||
and (MsgLine.SubTool=SubToolFPC) and (MsgLine.Filename<>'')
|
||||
then begin
|
||||
aFilename:=MsgLine.Filename;
|
||||
if mlfTestBuildFile in MsgLine.Flags then
|
||||
aFilename:=MsgLine.Attribute[MsgAttrDiskFilename]
|
||||
else
|
||||
aFilename:=MsgLine.Filename;
|
||||
PPUFilename:='';
|
||||
if (not FilenameIsAbsolute(aFilename)) then begin
|
||||
PPUFilename:=MsgLine.Attribute['PPU'];
|
||||
@ -3083,7 +3149,8 @@ begin
|
||||
// get source
|
||||
SourceOK:=false;
|
||||
aFilename:=MsgLine.Filename;
|
||||
if FilenameIsAbsolute(aFilename) then begin
|
||||
if FilenameIsAbsolute(aFilename) or (mlfTestBuildFile in MsgLine.Flags)
|
||||
then begin
|
||||
if (fCurSource<>nil)
|
||||
and (CompareFilenames(aFilename,fCurSource.Filename)=0) then begin
|
||||
SourceOK:=true;
|
||||
|
@ -237,7 +237,7 @@ begin
|
||||
CleanPos:=0;
|
||||
Node:=nil;
|
||||
Filename:=TrimFilename(Msg.GetFullFilename);
|
||||
if not FilenameIsAbsolute(Filename) then exit;
|
||||
if (not FilenameIsAbsolute(Filename)) and (not (mlfTestBuildFile in Msg.Flags)) then exit;
|
||||
Code:=CodeToolBoss.LoadFile(Filename,true,false);
|
||||
if Code=nil then exit;
|
||||
CodeToolBoss.Explore(Code,Tool,false);
|
||||
|
Loading…
Reference in New Issue
Block a user