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);
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);

View File

@ -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

View File

@ -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);

View File

@ -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;