h2paswizard: fixed compilation

git-svn-id: trunk@45135 -
This commit is contained in:
mattias 2014-05-21 11:51:09 +00:00
parent be15685e52
commit 41d6c332e4
2 changed files with 105 additions and 44 deletions

View File

@ -612,7 +612,21 @@ type
property UseCTypes: boolean read FUseCTypes write SetUseCTypes; property UseCTypes: boolean read FUseCTypes write SetUseCTypes;
property OutputDirectory: string read FOutputDirectory write SetOutputDirectory; property OutputDirectory: string read FOutputDirectory write SetOutputDirectory;
end; end;
{$IFDEF EnableNewExtTools}
const
SubToolH2Pas = 'h2pas';
type
{ TH2PasParser }
TH2PasParser = class(TExtToolParser)
public
class function DefaultSubTool: string; override;
procedure ReadLine(Line: string; OutputIndex: integer; var Handled: boolean
); override; // (worker thread)
end;
{$ENDIF}
{ TH2PasTool } { TH2PasTool }
TH2PasTool = class(TIDEExternalToolOptions) TH2PasTool = class(TIDEExternalToolOptions)
@ -643,7 +657,9 @@ type
procedure SetProjectHistory(const AValue: TStrings); procedure SetProjectHistory(const AValue: TStrings);
procedure SetWindowBounds(const AValue: TRect); procedure SetWindowBounds(const AValue: TRect);
procedure Seth2pasFilename(const AValue: string); procedure Seth2pasFilename(const AValue: string);
{$IFNDEF EnableNewExtTools}
procedure OnParseH2PasLine(Sender: TObject; Line: TIDEScanMessageLine); procedure OnParseH2PasLine(Sender: TObject; Line: TIDEScanMessageLine);
{$ENDIF}
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
@ -662,10 +678,9 @@ type
function MergeIncludeFiles(AFile: TH2PasFile; function MergeIncludeFiles(AFile: TH2PasFile;
TextConverter: TIDETextConverter): TModalResult; TextConverter: TIDETextConverter): TModalResult;
function GetH2PasFilename: string; function GetH2PasFilename: string;
{$IFNDEF EnableNewExtTools}
function FindH2PasErrorMessage: integer; function FindH2PasErrorMessage: integer;
function GetH2PasErrorPostion(const Line: string; {$ENDIF}
out aFilename: string;
out LineNumber, Column: integer): boolean;
function FileIsRelated(const aFilename: string): Boolean; function FileIsRelated(const aFilename: string): Boolean;
public public
property Project: TH2PasProject read FProject write SetProject; property Project: TH2PasProject read FProject write SetProject;
@ -697,6 +712,53 @@ const
implementation implementation
{$IFDEF EnableNewExtTools}
{ TH2PasParser }
class function TH2PasParser.DefaultSubTool: string;
begin
Result:=SubToolH2Pas;
end;
procedure TH2PasParser.ReadLine(Line: string; OutputIndex: integer;
var Handled: boolean);
function ReadString(var p: PChar; Expected: PChar): boolean;
begin
while Expected^<>#0 do begin
if p^<>Expected^ then exit(false);
inc(p);
inc(Expected);
end;
Result:=true;
end;
var
p: PChar;
LineNumber: Integer;
Msg: String;
MsgLine: TMessageLine;
begin
p:=PChar(Line);
// read 'at line '
if not ReadString(p,'at line ') then exit;
// read line number
if not (p^ in ['0'..'9']) then exit;
LineNumber:=0;
while (LineNumber<999999) and (p^ in ['0'..'9']) do begin
LineNumber:=LineNumber*10+ord(p^)-ord('0');
inc(p);
end;
// read ' error : '
if not ReadString(p,' error : ') then exit;
Msg:=p;
MsgLine:=CreateMsgLine(OutputIndex);
MsgLine.SubTool:=SubToolH2Pas;
MsgLine.Urgency:=mluError;
MsgLine.Msg:=Msg;
end;
{$ENDIF}
{ TH2PasFile } { TH2PasFile }
procedure TH2PasFile.SetFilename(const AValue: string); procedure TH2PasFile.SetFilename(const AValue: string);
@ -1680,6 +1742,7 @@ end;
{ TH2PasConverter } { TH2PasConverter }
{$IFNDEF EnableNewExtTools}
procedure TH2PasConverter.OnParseH2PasLine(Sender: TObject; procedure TH2PasConverter.OnParseH2PasLine(Sender: TObject;
Line: TIDEScanMessageLine); Line: TIDEScanMessageLine);
var var
@ -1699,6 +1762,7 @@ begin
//DebugLn(['TH2PasConverter.OnParseH2PasLine ',Line.Line]); //DebugLn(['TH2PasConverter.OnParseH2PasLine ',Line.Line]);
end; end;
end; end;
{$ENDIF}
function TH2PasConverter.GetCurrentProjectFilename: string; function TH2PasConverter.GetCurrentProjectFilename: string;
begin begin
@ -1959,12 +2023,9 @@ var
if Filename='' then if Filename='' then
Filename:=DefaultFilename; Filename:=DefaultFilename;
// create error message // create error message
ErrMsg:=Filename;
BaseDir:=ExtractFilePath(Project.BaseDir); BaseDir:=ExtractFilePath(Project.BaseDir);
Filename:=CreateRelativePath(Filename,BaseDir); ErrMsg:=CreateRelativePath(Filename,BaseDir);
if ErrMsg='' then
ErrMsg:=DefaultFilename;
if Line>0 then begin if Line>0 then begin
ErrMsg:=ErrMsg+'('+IntToStr(Line)+','; ErrMsg:=ErrMsg+'('+IntToStr(Line)+',';
if Col>0 then if Col>0 then
@ -1975,8 +2036,13 @@ var
end; end;
ErrMsg:=ErrMsg+' Error: '+ErrorTool.ErrorMsg+' ('+ErrorTool.Caption+')'; ErrMsg:=ErrMsg+' Error: '+ErrorTool.ErrorMsg+' ('+ErrorTool.Caption+')';
DebugLn(['TH2PasConverter.ConvertFile Failed: ',ErrMsg]); DebugLn(['TH2PasConverter.ConvertFile Failed: ',ErrMsg]);
{$IFDEF EnableNewExtTools}
IDEMessagesWindow.AddCustomMessage(mluError,ErrorTool.ErrorMsg,Filename,Line,Col,ErrorTool.Caption);
LazarusIDE.DoJumpToCompilerMessage(true);
{$ELSE}
IDEMessagesWindow.AddMsg(ErrMsg,BaseDir,-1); IDEMessagesWindow.AddMsg(ErrMsg,BaseDir,-1);
LazarusIDE.DoJumpToCompilerMessage(true, IDEMessagesWindow.LinesCount-1); LazarusIDE.DoJumpToCompilerMessage(true, IDEMessagesWindow.LinesCount-1);
{$ENDIF}
Result:=mrAbort; Result:=mrAbort;
end; end;
@ -2038,14 +2104,22 @@ begin
Tool.TargetFilename:=TextConverter.Filename; Tool.TargetFilename:=TextConverter.Filename;
Tool.Filename:=GetH2PasFilename; Tool.Filename:=GetH2PasFilename;
Tool.CmdLineParams:=AFile.GetH2PasParameters(Tool.TargetFilename); Tool.CmdLineParams:=AFile.GetH2PasParameters(Tool.TargetFilename);
Tool.WorkingDirectory:=Project.BaseDir;
DebugLn(['TH2PasConverter.ConvertFile Tool.Filename="',Tool.Filename,'" Tool.CmdLineParams="',Tool.CmdLineParams,'"']);
{$IFDEF EnableNewExtTools}
Tool.Scanners.Add(SubToolH2Pas);
if not RunExternalTool(Tool) then
exit(mrAbort);
if IDEMessagesWindow.SelectFirstUrgentMessage(mluError,false) then
exit(mrAbort);
{$ELSE}
Tool.ScanOutput:=true; Tool.ScanOutput:=true;
Tool.ShowAllOutput:=true; Tool.ShowAllOutput:=true;
Tool.WorkingDirectory:=Project.BaseDir;
Tool.OnParseLine:=@OnParseH2PasLine; Tool.OnParseLine:=@OnParseH2PasLine;
DebugLn(['TH2PasConverter.ConvertFile Tool.Filename="',Tool.Filename,'" Tool.CmdLineParams="',Tool.CmdLineParams,'"']);
Result:=RunExternalTool(Tool); Result:=RunExternalTool(Tool);
if Result<>mrOk then exit(mrAbort); if Result<>mrOk then exit(mrAbort);
if FindH2PasErrorMessage>=0 then exit(mrAbort); if FindH2PasErrorMessage>=0 then exit(mrAbort);
{$ENDIF}
finally finally
Tool.Free; Tool.Free;
end; end;
@ -2241,6 +2315,7 @@ begin
Result:=FindDefaultExecutablePath(h2pasFilename); Result:=FindDefaultExecutablePath(h2pasFilename);
end; end;
{$IFNDEF EnableNewExtTools}
function TH2PasConverter.FindH2PasErrorMessage: integer; function TH2PasConverter.FindH2PasErrorMessage: integer;
var var
i: Integer; i: Integer;
@ -2255,21 +2330,7 @@ begin
end; end;
Result:=-1; Result:=-1;
end; end;
{$ENDIF}
function TH2PasConverter.GetH2PasErrorPostion(const Line: string;
out aFilename: string; out LineNumber, Column: integer): boolean;
begin
Result:=REMatches(Line,'^(.*)\(([0-9]+)\)');
if Result then begin
aFilename:=REVar(1);
LineNumber:=StrToIntDef(REVar(2),-1);
Column:=1;
end else begin
aFilename:='';
LineNumber:=-1;
Column:=-1;
end;
end;
function TH2PasConverter.FileIsRelated(const aFilename: string): Boolean; function TH2PasConverter.FileIsRelated(const aFilename: string): Boolean;
begin begin

View File

@ -22,14 +22,15 @@ unit H2PasDlg;
interface interface
uses uses
Classes, SysUtils, LCLProc, LCLType, LResources, Forms, Controls, Classes, SysUtils, LCLProc, LCLType, LResources, Forms, Controls, Graphics,
Graphics, Dialogs, ComCtrls, Buttons, StdCtrls, ExtCtrls, Dialogs, ComCtrls, Buttons, StdCtrls, ExtCtrls, LazConfigStorage, SynEdit,
LazConfigStorage, SynHighlighterCPP, FileProcs, IDEMsgIntf, MenuIntf, IDECommands, BaseIDEIntf,
SynEdit, SynHighlighterCPP, IDEDialogs, LazIDEIntf, ProjectIntf, CodeToolManager, SrcEditorIntf,
FileProcs, IDETextConverter, H2PasStrConsts, H2PasConvert, IDETextConvListEdit,
IDEMsgIntf, MenuIntf, IDECommands, BaseIDEIntf, IDEDialogs, LazIDEIntf, {$IFDEF EnableNewExtTools}
ProjectIntf, CodeToolManager, SrcEditorIntf, IDETextConverter, IDEExternToolIntf,
H2PasStrConsts, H2PasConvert, IDETextConvListEdit, CompOptsIntf; {$ENDIF}
CompOptsIntf;
type type
@ -162,7 +163,7 @@ type
function OnIDESavedAll(Sender: TObject): TModalResult; function OnIDESavedAll(Sender: TObject): TModalResult;
public public
function Convert: TModalResult; function Convert: TModalResult;
procedure ShowH2PasError(MsgLine: integer); procedure ShowH2PasError;
function SaveSettings: TModalResult; function SaveSettings: TModalResult;
function SaveGlobalSettings: TModalResult; function SaveGlobalSettings: TModalResult;
@ -238,6 +239,11 @@ begin
TextConverterToolClasses.RegisterClass(TReplaceTypeCastFunctionsInUnit); TextConverterToolClasses.RegisterClass(TReplaceTypeCastFunctionsInUnit);
TextConverterToolClasses.RegisterClass(TFixForwardDefinitions); TextConverterToolClasses.RegisterClass(TFixForwardDefinitions);
TextConverterToolClasses.RegisterClass(TAddToUsesSection); TextConverterToolClasses.RegisterClass(TAddToUsesSection);
{$IFDEF EnableNewExtTools}
// register h2pas output parser
ExternalToolList.RegisterParser(TH2PasParser);
{$ENDIF}
end; end;
{ TH2PasDialog } { TH2PasDialog }
@ -1115,19 +1121,13 @@ begin
Result:=Converter.Execute; Result:=Converter.Execute;
if Result<>mrOk then begin if Result<>mrOk then begin
ShowH2PasError(-1); ShowH2PasError;
end; end;
end; end;
procedure TH2PasDialog.ShowH2PasError(MsgLine: integer); procedure TH2PasDialog.ShowH2PasError;
begin begin
if MsgLine<0 then LazarusIDE.DoJumpToCompilerMessage(true);
MsgLine:=Converter.FindH2PasErrorMessage;
if (MsgLine<0) or (MsgLine>=IDEMessagesWindow.LinesCount) then begin
exit;
end;
LazarusIDE.DoJumpToCompilerMessage(true, MsgLine);
end; end;
function TH2PasDialog.SaveSettings: TModalResult; function TH2PasDialog.SaveSettings: TModalResult;