Converter: improve handling of errors and error messages

git-svn-id: trunk@37682 -
This commit is contained in:
juha 2012-06-17 23:21:38 +00:00
parent abf1dac7dc
commit ee02cf6a72
4 changed files with 68 additions and 55 deletions

View File

@ -61,7 +61,7 @@ type
constructor Create(ACode: TCodeBuffer); constructor Create(ACode: TCodeBuffer);
destructor Destroy; override; destructor Destroy; override;
procedure ResetMainScanner; procedure ResetMainScanner;
function HandleCodetoolError: TModalResult; // function HandleCodetoolError: TModalResult;
public public
property CodeTool: TCodeTool read fCodeTool; property CodeTool: TCodeTool read fCodeTool;
property Code: TCodeBuffer read fCode; property Code: TCodeBuffer read fCode;
@ -129,22 +129,22 @@ begin
fCodeTool:=nil; fCodeTool:=nil;
fSrcCache:=nil; fSrcCache:=nil;
if not CodeToolBoss.InitCurCodeTool(fCode) then exit; if not CodeToolBoss.InitCurCodeTool(fCode) then exit;
try // try
fCodeTool:=CodeToolBoss.CurCodeTool; fCodeTool:=CodeToolBoss.CurCodeTool;
fSrcCache:=CodeToolBoss.SourceChangeCache; fSrcCache:=CodeToolBoss.SourceChangeCache;
ResetMainScanner; ResetMainScanner;
fCodeTool.Scanner.IgnoreMissingIncludeFiles:=True; fCodeTool.Scanner.IgnoreMissingIncludeFiles:=True;
except { except
on e: Exception do on e: Exception do
CodeToolBoss.HandleException(e); CodeToolBoss.HandleException(e);
end; end; }
end; end;
procedure TCodeToolLink.ResetMainScanner; procedure TCodeToolLink.ResetMainScanner;
begin begin
fSrcCache.MainScanner:=fCodeTool.Scanner; fSrcCache.MainScanner:=fCodeTool.Scanner;
end; end;
{
function TCodeToolLink.HandleCodetoolError: TModalResult; function TCodeToolLink.HandleCodetoolError: TModalResult;
// returns mrOk or mrAbort // returns mrOk or mrAbort
const const
@ -163,7 +163,7 @@ begin
Result:=mrOK; Result:=mrOK;
end; end;
end; end;
}
{ TConvDelphiCodeTool } { TConvDelphiCodeTool }
constructor TConvDelphiCodeTool.Create(APascalBuffer: TCodeBuffer); constructor TConvDelphiCodeTool.Create(APascalBuffer: TCodeBuffer);
@ -177,12 +177,12 @@ begin
fIsConsoleApp:=False; fIsConsoleApp:=False;
fCTLinkCreated:=True; fCTLinkCreated:=True;
if Assigned(fCTLink.CodeTool) then if Assigned(fCTLink.CodeTool) then
try // try
fCTLink.CodeTool.BuildTree(lsrInitializationStart); fCTLink.CodeTool.BuildTree(lsrInitializationStart);
except { except
on e: Exception do on e: Exception do
CodeToolBoss.HandleException(e); CodeToolBoss.HandleException(e);
end; end; }
end; end;
constructor TConvDelphiCodeTool.Create(ACTLink: TCodeToolLink); constructor TConvDelphiCodeTool.Create(ACTLink: TCodeToolLink);

View File

@ -422,7 +422,8 @@ begin
DelphiUnit := TDelphiUnit.Create(Self, fOrigFilename, []); DelphiUnit := TDelphiUnit.Create(Self, fOrigFilename, []);
Result:=fSettings.RunForm; Result:=fSettings.RunForm;
if Result=mrOK then if Result=mrOK then
with DelphiUnit do begin with DelphiUnit do
try
Result:=CopyAndLoadFile; Result:=CopyAndLoadFile;
if Result=mrOK then begin if Result=mrOK then begin
Result:=ConvertUnitFile; Result:=ConvertUnitFile;
@ -437,6 +438,14 @@ begin
end; end;
end; end;
end; end;
except
on e: EDelphiConverterError do begin
fErrorMsg:=e.Message;
end;
else begin
fErrorMsg:=CodeToolBoss.ErrorMessage;
end;
Result:=mrAbort;
end; end;
ShowEndingMessage(Result); ShowEndingMessage(Result);
end; end;
@ -688,21 +697,12 @@ begin
end; end;
// Do the actual code conversion. // Do the actual code conversion.
ConvTool:=TConvDelphiCodeTool.Create(fCTLink); ConvTool:=TConvDelphiCodeTool.Create(fCTLink);
try
try try
ConvTool.IsConsoleApp:=fOwnerConverter.fIsConsoleApp; ConvTool.IsConsoleApp:=fOwnerConverter.fIsConsoleApp;
ConvTool.LowerCaseRes:=FileExistsUTF8(ChangeFileExt(fLazUnitFilename, '.res')); ConvTool.LowerCaseRes:=FileExistsUTF8(ChangeFileExt(fLazUnitFilename, '.res'));
ConvTool.HasFormFile:=DfmFilename<>''; ConvTool.HasFormFile:=DfmFilename<>'';
ConvTool.AddUnitEvent:=@fUsedUnitsTool.AddUnitIfNeeded; ConvTool.AddUnitEvent:=@fUsedUnitsTool.AddUnitIfNeeded;
Result:=ConvTool.Convert; Result:=ConvTool.Convert;
except
on e: EDelphiConverterError do begin
fOwnerConverter.fErrorMsg:=e.Message;
Result:=mrAbort;
end;
else
Result:=fCTLink.HandleCodetoolError;
end;
finally finally
ConvTool.Free; ConvTool.Free;
end; end;
@ -740,18 +740,9 @@ begin
// After other changes: add, remove, fix and comment out units in uses sections. // After other changes: add, remove, fix and comment out units in uses sections.
IDEMessagesWindow.AddMsg(Format(lisConvDelphiFixingUsedUnits, IDEMessagesWindow.AddMsg(Format(lisConvDelphiFixingUsedUnits,
[fOrigUnitFilename]), '', -1); [fOrigUnitFilename]), '', -1);
try Result:=fUsedUnitsTool.Convert;
Result:=fUsedUnitsTool.Convert; if Result<>mrOk then exit;
if Result<>mrOk then exit; Result:=mrOk;
Result:=mrOk;
except
on e: EDelphiConverterError do begin
fOwnerConverter.fErrorMsg:=e.Message;
Result:=mrAbort;
end;
else
Result:=fCTLink.HandleCodetoolError;
end;
end; end;
function TDelphiUnit.AskUnitPathFromUser: TModalResult; function TDelphiUnit.AskUnitPathFromUser: TModalResult;
@ -821,8 +812,16 @@ begin
LazarusIDE.OpenEditorsOnCodeToolChange:=False; LazarusIDE.OpenEditorsOnCodeToolChange:=False;
try try
with fCTLink do with fCTLink do
if not CodeTool.FixIncludeFilenames(Code,SrcCache,FoundIncludeFiles, if CodeTool.FixIncludeFilenames(Code,SrcCache,FoundIncludeFiles,MissingIncludeFilesCodeXYPos)
MissingIncludeFilesCodeXYPos) then begin 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 if MissingIncludeFilesCodeXYPos<>nil then begin
for i:=0 to MissingIncludeFilesCodeXYPos.Count-1 do begin for i:=0 to MissingIncludeFilesCodeXYPos.Count-1 do begin
CodePos:=PCodeXYPosition(MissingIncludeFilesCodeXYPos[i]); CodePos:=PCodeXYPosition(MissingIncludeFilesCodeXYPos[i]);
@ -904,29 +903,39 @@ begin
// without delay but then we must wait for the thread before continuing. // without delay but then we must wait for the thread before continuing.
CacheUnitsThread:=TCacheUnitsThread.Create(Self, fSettings.MainPath); CacheUnitsThread:=TCacheUnitsThread.Create(Self, fSettings.MainPath);
try try
CacheUnitsThread.Start;
Result:=fSettings.RunForm; // Get settings from user.
Screen.Cursor:=crHourGlass;
try try
CacheUnitsThread.WaitFor; // Make sure the thread has finished. CacheUnitsThread.Start;
finally Result:=fSettings.RunForm; // Get settings from user.
Screen.Cursor:=crDefault; Screen.Cursor:=crHourGlass;
end; try
if Result=mrOK then begin CacheUnitsThread.WaitFor; // Make sure the thread has finished.
// create/open lazarus project or package file finally
fLazPFilename:=fSettings.DelphiToLazFilename(fOrigFilename, fLazPSuffix, false); 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 // Find Delphi project / package file name
if CompareFileExt(fOrigFilename,fDelphiPSuffix,false)=0 then if CompareFileExt(fOrigFilename,fDelphiPSuffix,false)=0 then
fDelphiPFilename:=fOrigFilename fDelphiPFilename:=fOrigFilename
else else
fDelphiPFilename:=ChangeFileExt(fOrigFilename,fDelphiPSuffix); fDelphiPFilename:=ChangeFileExt(fOrigFilename,fDelphiPSuffix);
if not FileExistsUTF8(fDelphiPFilename) then if not FileExistsUTF8(fDelphiPFilename) then
fDelphiPFilename:=FindDiskFileCaseInsensitive(fOrigFilename); fDelphiPFilename:=FindDiskFileCaseInsensitive(fOrigFilename);
// ? fDelphiPFilename:=CodeToolBoss.DirectoryCachePool.FindDiskFilename(fDelphiPFilename); // ? fDelphiPFilename:=CodeToolBoss.DirectoryCachePool.FindDiskFilename(fDelphiPFilename);
// Actual conversion. // Actual conversion.
Result:=ConvertSub; Result:=ConvertSub;
end;
except
on e: EDelphiConverterError do begin
fErrorMsg:=e.Message;
end;
else begin
fErrorMsg:=CodeToolBoss.ErrorMessage;
end;
Result:=mrAbort;
end; end;
ShowEndingMessage(Result); ShowEndingMessage(Result);
finally finally

View File

@ -88,9 +88,13 @@ type
constructor Create(const AMessage: string); constructor Create(const AMessage: string);
end; end;
//procedure RaiseDelphiConverterErrorFmt(const AMessage: string;
// const args: array of const{; ClearNicePos: boolean});
implementation implementation
{ TSrcPropOffset } { TSrcPropOffset }
constructor TSrcPropOffset.Create(aParentType, aChildType, aPropName: string; aStartPos: integer); constructor TSrcPropOffset.Create(aParentType, aChildType, aPropName: string; aStartPos: integer);

View File

@ -255,7 +255,7 @@ begin
end else if CodeTool.CurPos.Flag=cafSemicolon then begin end else if CodeTool.CurPos.Flag=cafSemicolon then begin
break; break;
end else end else
CodeTool.RaiseExceptionFmt(ctsStrExpectedButAtomFound,[';',CodeTool.GetAtom]); Raise EDelphiConverterError.CreateFmt(ctsStrExpectedButAtomFound,[';',CodeTool.GetAtom]);
until false; until false;
end; end;
Result:=true; Result:=true;