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

git-svn-id: branches/fixes_1_4@48055 -
This commit is contained in:
mattias 2015-02-28 22:48:16 +00:00
parent f38d39203b
commit 3950820ed7
2 changed files with 68 additions and 32 deletions

View File

@ -410,13 +410,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

@ -138,6 +138,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);
@ -184,7 +186,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;
@ -645,6 +647,7 @@ procedure TExternalTool.DoExecute;
finally finally
LeaveCriticalSection; LeaveCriticalSection;
end; end;
CreateView;
NotifyHandlerStopped; NotifyHandlerStopped;
Result:=true; Result:=true;
@ -652,35 +655,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
@ -754,6 +743,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);
@ -771,6 +785,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;
@ -948,14 +981,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;
@ -1313,13 +1348,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;