From ee02cf6a727a3290c0b24c6734a07aedaf836a9d Mon Sep 17 00:00:00 2001 From: juha Date: Sun, 17 Jun 2012 23:21:38 +0000 Subject: [PATCH] Converter: improve handling of errors and error messages git-svn-id: trunk@37682 - --- converter/convcodetool.pas | 20 ++++---- converter/convertdelphi.pas | 97 ++++++++++++++++++++---------------- converter/convertertypes.pas | 4 ++ converter/usedunits.pas | 2 +- 4 files changed, 68 insertions(+), 55 deletions(-) diff --git a/converter/convcodetool.pas b/converter/convcodetool.pas index 55420dc0be..53ff85e5a3 100644 --- a/converter/convcodetool.pas +++ b/converter/convcodetool.pas @@ -61,7 +61,7 @@ type constructor Create(ACode: TCodeBuffer); destructor Destroy; override; procedure ResetMainScanner; - function HandleCodetoolError: TModalResult; +// function HandleCodetoolError: TModalResult; public property CodeTool: TCodeTool read fCodeTool; property Code: TCodeBuffer read fCode; @@ -129,22 +129,22 @@ begin fCodeTool:=nil; fSrcCache:=nil; if not CodeToolBoss.InitCurCodeTool(fCode) then exit; - try +// try fCodeTool:=CodeToolBoss.CurCodeTool; fSrcCache:=CodeToolBoss.SourceChangeCache; ResetMainScanner; fCodeTool.Scanner.IgnoreMissingIncludeFiles:=True; - except +{ except on e: Exception do CodeToolBoss.HandleException(e); - end; + end; } end; procedure TCodeToolLink.ResetMainScanner; begin fSrcCache.MainScanner:=fCodeTool.Scanner; end; - +{ function TCodeToolLink.HandleCodetoolError: TModalResult; // returns mrOk or mrAbort const @@ -163,7 +163,7 @@ begin Result:=mrOK; end; end; - +} { TConvDelphiCodeTool } constructor TConvDelphiCodeTool.Create(APascalBuffer: TCodeBuffer); @@ -177,12 +177,12 @@ begin fIsConsoleApp:=False; fCTLinkCreated:=True; if Assigned(fCTLink.CodeTool) then - try - fCTLink.CodeTool.BuildTree(lsrInitializationStart); - except +// try + fCTLink.CodeTool.BuildTree(lsrInitializationStart); +{ except on e: Exception do CodeToolBoss.HandleException(e); - end; + end; } end; constructor TConvDelphiCodeTool.Create(ACTLink: TCodeToolLink); diff --git a/converter/convertdelphi.pas b/converter/convertdelphi.pas index b2da30bb2b..5b4633f9f9 100644 --- a/converter/convertdelphi.pas +++ b/converter/convertdelphi.pas @@ -422,7 +422,8 @@ begin DelphiUnit := TDelphiUnit.Create(Self, fOrigFilename, []); Result:=fSettings.RunForm; if Result=mrOK then - with DelphiUnit do begin + with DelphiUnit do + try Result:=CopyAndLoadFile; if Result=mrOK then begin Result:=ConvertUnitFile; @@ -437,6 +438,14 @@ begin end; end; end; + except + on e: EDelphiConverterError do begin + fErrorMsg:=e.Message; + end; + else begin + fErrorMsg:=CodeToolBoss.ErrorMessage; + end; + Result:=mrAbort; end; ShowEndingMessage(Result); end; @@ -688,21 +697,12 @@ begin end; // Do the actual code conversion. ConvTool:=TConvDelphiCodeTool.Create(fCTLink); - try try ConvTool.IsConsoleApp:=fOwnerConverter.fIsConsoleApp; ConvTool.LowerCaseRes:=FileExistsUTF8(ChangeFileExt(fLazUnitFilename, '.res')); ConvTool.HasFormFile:=DfmFilename<>''; ConvTool.AddUnitEvent:=@fUsedUnitsTool.AddUnitIfNeeded; Result:=ConvTool.Convert; - except - on e: EDelphiConverterError do begin - fOwnerConverter.fErrorMsg:=e.Message; - Result:=mrAbort; - end; - else - Result:=fCTLink.HandleCodetoolError; - end; finally ConvTool.Free; end; @@ -740,18 +740,9 @@ begin // After other changes: add, remove, fix and comment out units in uses sections. IDEMessagesWindow.AddMsg(Format(lisConvDelphiFixingUsedUnits, [fOrigUnitFilename]), '', -1); - try - Result:=fUsedUnitsTool.Convert; - if Result<>mrOk then exit; - Result:=mrOk; - except - on e: EDelphiConverterError do begin - fOwnerConverter.fErrorMsg:=e.Message; - Result:=mrAbort; - end; - else - Result:=fCTLink.HandleCodetoolError; - end; + Result:=fUsedUnitsTool.Convert; + if Result<>mrOk then exit; + Result:=mrOk; end; function TDelphiUnit.AskUnitPathFromUser: TModalResult; @@ -821,8 +812,16 @@ begin LazarusIDE.OpenEditorsOnCodeToolChange:=False; try with fCTLink do - if not CodeTool.FixIncludeFilenames(Code,SrcCache,FoundIncludeFiles, - MissingIncludeFilesCodeXYPos) then begin + if CodeTool.FixIncludeFilenames(Code,SrcCache,FoundIncludeFiles,MissingIncludeFilesCodeXYPos) + then begin + if Assigned(FoundIncludeFiles) then begin + FoundIncludeFiles.Delimiter:=';'; + FoundIncludeFiles.StrictDelimiter:=True; + Msg:='Repairing include files : ' + FoundIncludeFiles.DelimitedText; + IDEMessagesWindow.AddMsg(Msg, '', -1); + end; + end + else begin if MissingIncludeFilesCodeXYPos<>nil then begin for i:=0 to MissingIncludeFilesCodeXYPos.Count-1 do begin CodePos:=PCodeXYPosition(MissingIncludeFilesCodeXYPos[i]); @@ -904,29 +903,39 @@ begin // without delay but then we must wait for the thread before continuing. CacheUnitsThread:=TCacheUnitsThread.Create(Self, fSettings.MainPath); try - CacheUnitsThread.Start; - Result:=fSettings.RunForm; // Get settings from user. - Screen.Cursor:=crHourGlass; try - CacheUnitsThread.WaitFor; // Make sure the thread has finished. - finally - Screen.Cursor:=crDefault; - end; - if Result=mrOK then begin - // create/open lazarus project or package file - fLazPFilename:=fSettings.DelphiToLazFilename(fOrigFilename, fLazPSuffix, false); + CacheUnitsThread.Start; + Result:=fSettings.RunForm; // Get settings from user. + Screen.Cursor:=crHourGlass; + try + CacheUnitsThread.WaitFor; // Make sure the thread has finished. + finally + Screen.Cursor:=crDefault; + end; + if Result=mrOK then begin + // create/open lazarus project or package file + fLazPFilename:=fSettings.DelphiToLazFilename(fOrigFilename, fLazPSuffix, false); - // Find Delphi project / package file name - if CompareFileExt(fOrigFilename,fDelphiPSuffix,false)=0 then - fDelphiPFilename:=fOrigFilename - else - fDelphiPFilename:=ChangeFileExt(fOrigFilename,fDelphiPSuffix); - if not FileExistsUTF8(fDelphiPFilename) then - fDelphiPFilename:=FindDiskFileCaseInsensitive(fOrigFilename); -// ? fDelphiPFilename:=CodeToolBoss.DirectoryCachePool.FindDiskFilename(fDelphiPFilename); + // Find Delphi project / package file name + if CompareFileExt(fOrigFilename,fDelphiPSuffix,false)=0 then + fDelphiPFilename:=fOrigFilename + else + fDelphiPFilename:=ChangeFileExt(fOrigFilename,fDelphiPSuffix); + if not FileExistsUTF8(fDelphiPFilename) then + fDelphiPFilename:=FindDiskFileCaseInsensitive(fOrigFilename); + // ? fDelphiPFilename:=CodeToolBoss.DirectoryCachePool.FindDiskFilename(fDelphiPFilename); - // Actual conversion. - Result:=ConvertSub; + // Actual conversion. + Result:=ConvertSub; + end; + except + on e: EDelphiConverterError do begin + fErrorMsg:=e.Message; + end; + else begin + fErrorMsg:=CodeToolBoss.ErrorMessage; + end; + Result:=mrAbort; end; ShowEndingMessage(Result); finally diff --git a/converter/convertertypes.pas b/converter/convertertypes.pas index 17cb15dc63..b7400f5d01 100644 --- a/converter/convertertypes.pas +++ b/converter/convertertypes.pas @@ -88,9 +88,13 @@ type constructor Create(const AMessage: string); end; +//procedure RaiseDelphiConverterErrorFmt(const AMessage: string; +// const args: array of const{; ClearNicePos: boolean}); + implementation + { TSrcPropOffset } constructor TSrcPropOffset.Create(aParentType, aChildType, aPropName: string; aStartPos: integer); diff --git a/converter/usedunits.pas b/converter/usedunits.pas index 87dfbeee94..c05b34ccd3 100644 --- a/converter/usedunits.pas +++ b/converter/usedunits.pas @@ -255,7 +255,7 @@ begin end else if CodeTool.CurPos.Flag=cafSemicolon then begin break; end else - CodeTool.RaiseExceptionFmt(ctsStrExpectedButAtomFound,[';',CodeTool.GetAtom]); + Raise EDelphiConverterError.CreateFmt(ctsStrExpectedButAtomFound,[';',CodeTool.GetAtom]); until false; end; Result:=true;