IDE: fixed resolving macros of external tools before switching back from IDE to project

git-svn-id: trunk@48054 -
This commit is contained in:
mattias 2015-02-28 22:47:57 +00:00
parent 2744af1c41
commit b728a865d3
2 changed files with 68 additions and 32 deletions

View File

@ -411,13 +411,14 @@ type
TExtToolViewClass = class of TExtToolView; TExtToolViewClass = class of TExtToolView;
TExternalToolStage = ( TExternalToolStage = (
etsInit, etsInit, // just created, set your parameters, then call Execute
etsInitializing, // set in Execute, during resolving macros
etsWaitingForStart, // waiting for a process slot etsWaitingForStart, // waiting for a process slot
etsStarting, // creating the process etsStarting, // creating the thread and process
etsRunning, etsRunning, // process started
etsWaitingForStop, etsWaitingForStop, // waiting for process to stop
etsStopped, etsStopped, // process has stopped
etsDestroying etsDestroying // during destructor
); );
TExternalToolStages = set of TExternalToolStage; TExternalToolStages = set of TExternalToolStage;

View File

@ -140,6 +140,8 @@ type
procedure SyncAutoFree({%H-}aData: PtrInt); // (main thread) procedure SyncAutoFree({%H-}aData: PtrInt); // (main thread)
protected protected
procedure DoExecute; override; // (main thread) procedure DoExecute; override; // (main thread)
procedure DoStart; // (main thread)
procedure CreateView; // (main thread)
function GetExecuteAfter(Index: integer): TAbstractExternalTool; override; function GetExecuteAfter(Index: integer): TAbstractExternalTool; override;
function GetExecuteBefore(Index: integer): TAbstractExternalTool; override; function GetExecuteBefore(Index: integer): TAbstractExternalTool; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); procedure Notification(AComponent: TComponent; Operation: TOperation);
@ -186,7 +188,7 @@ type
function IndexOf(Tool: TAbstractExternalTool): integer; override; function IndexOf(Tool: TAbstractExternalTool): integer; override;
property MaxProcessCount: integer read FMaxProcessCount write FMaxProcessCount; property MaxProcessCount: integer read FMaxProcessCount write FMaxProcessCount;
procedure Work; procedure Work;
function FindNextToolToExec: TExternalTool; function FindNextToolToStart: TExternalTool;
procedure Terminate(Tool: TExternalTool); procedure Terminate(Tool: TExternalTool);
procedure TerminateAll; override; procedure TerminateAll; override;
procedure Clear; override; procedure Clear; override;
@ -649,6 +651,7 @@ procedure TExternalTool.DoExecute;
finally finally
LeaveCriticalSection; LeaveCriticalSection;
end; end;
CreateView;
NotifyHandlerStopped; NotifyHandlerStopped;
Result:=true; Result:=true;
@ -656,35 +659,21 @@ procedure TExternalTool.DoExecute;
var var
ExeFile: String; ExeFile: String;
View: TExtToolView;
i: Integer; i: Integer;
aParser: TExtToolParser; aParser: TExtToolParser;
begin begin
if Terminated then exit; if Terminated then exit;
// set Stage to etsStarting // set Stage to etsInitializing
EnterCriticalSection; EnterCriticalSection;
try try
if Stage<>etsWaitingForStart then if Stage<>etsInit then
raise Exception.Create('TExternalTool.Execute: already started'); raise Exception.Create('TExternalTool.Execute: already initialized');
FStage:=etsStarting; FStage:=etsInitializing;
finally finally
LeaveCriticalSection; LeaveCriticalSection;
end; end;
View:=nil;
if ExtToolConsole<>nil then begin
// in console mode (lazbuild) all output goes unparsed to console
ClearParsers;
View:=ExtToolConsole.CreateView(Self);
end else if (ViewCount=0) and (ParserCount>0) then begin
// this tool generates parsed output => auto create view
if IDEMessagesWindow<>nil then
View:=IDEMessagesWindow.CreateView(Title);
end;
if View<>nil then
AddView(View);
// resolve macros // resolve macros
if ResolveMacrosOnExecute then if ResolveMacrosOnExecute then
begin begin
@ -758,6 +747,31 @@ begin
end; end;
end; end;
// set Stage to etsWaitingForStart
EnterCriticalSection;
try
if Stage<>etsInitializing then
raise Exception.Create('TExternalTool.Execute: bug in initialization');
FStage:=etsWaitingForStart;
finally
LeaveCriticalSection;
end;
end;
procedure TExternalTool.DoStart;
begin
// set Stage to etsStarting
EnterCriticalSection;
try
if Stage<>etsWaitingForStart then
raise Exception.Create('TExternalTool.Execute: already started');
FStage:=etsStarting;
finally
LeaveCriticalSection;
end;
CreateView;
// mark running // mark running
if Tools<>nil then if Tools<>nil then
TExternalTools(Tools).AddRunningTool(Self); TExternalTools(Tools).AddRunningTool(Self);
@ -775,6 +789,25 @@ begin
Thread.Start; Thread.Start;
end; end;
procedure TExternalTool.CreateView;
var
View: TExtToolView;
begin
if ViewCount>0 then exit;
View:=nil;
if ExtToolConsole<>nil then begin
// in console mode (lazbuild) all output goes unparsed to console
ClearParsers;
View:=ExtToolConsole.CreateView(Self);
end else if (ViewCount=0) and (ParserCount>0) then begin
// this tool generates parsed output => auto create view
if IDEMessagesWindow<>nil then
View:=IDEMessagesWindow.CreateView(Title);
end;
if View<>nil then
AddView(View);
end;
function TExternalTool.ExecuteBeforeCount: integer; function TExternalTool.ExecuteBeforeCount: integer;
begin begin
Result:=fExecuteBefore.Count; Result:=fExecuteBefore.Count;
@ -952,14 +985,16 @@ end;
procedure TExternalTool.Execute; procedure TExternalTool.Execute;
begin begin
if Stage=etsInit then if Stage<>etsInit then
fStage:=etsWaitingForStart;
if FStage<>etsWaitingForStart then
raise Exception.Create('TExternalTool.Execute "'+Title+'" already started'); raise Exception.Create('TExternalTool.Execute "'+Title+'" already started');
DoExecute;
if Stage<>etsWaitingForStart then
exit;
if Tools<>nil then if Tools<>nil then
TExternalTools(Tools).Work TExternalTools(Tools).Work
else else
DoExecute; DoStart;
end; end;
procedure TExternalTool.Terminate; procedure TExternalTool.Terminate;
@ -1317,13 +1352,13 @@ var
Tool: TExternalTool; Tool: TExternalTool;
begin begin
while RunningCount<MaxProcessCount do begin while RunningCount<MaxProcessCount do begin
Tool:=FindNextToolToExec; Tool:=FindNextToolToStart;
if Tool=nil then exit; if Tool=nil then exit;
Tool.DoExecute; Tool.DoStart;
end; end;
end; end;
function TExternalTools.FindNextToolToExec: TExternalTool; function TExternalTools.FindNextToolToStart: TExternalTool;
var var
Tool: TExternalTool; Tool: TExternalTool;
CurLoad: Int64; CurLoad: Int64;