From 8ddcf68e99b8c1d3ad271b04f9dcdcda14f0100b Mon Sep 17 00:00:00 2001 From: juha Date: Thu, 13 Sep 2018 10:38:16 +0000 Subject: [PATCH] Converter: For adding MODE Delphi, use function GetSourceNamePos from codetools. Add log msg. Somehow solves issue #34126. git-svn-id: trunk@58972 - --- converter/convcodetool.pas | 40 +++++++++++++++++++------------------ ide/lazarusidestrconsts.pas | 1 + 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/converter/convcodetool.pas b/converter/convcodetool.pas index cd7ee21fa0..a3ce42ff71 100644 --- a/converter/convcodetool.pas +++ b/converter/convcodetool.pas @@ -281,28 +281,30 @@ end; function TConvDelphiCodeTool.AddModeDelphiDirective: boolean; var - ModeDirectivePos: integer; - InsertPos: Integer; + NamePos: TAtomPosition; + CaretPos: TCodeXYPosition; + InsPos: Integer; s: String; begin Result:=false; - with fCTLink.CodeTool do begin - if not FindModeDirective(true,ModeDirectivePos) then begin - // add {$MODE Delphi} behind source type - if Tree.Root=nil then exit; - MoveCursorToNodeStart(Tree.Root); - ReadNextAtom; // 'unit', 'program', .. - ReadNextAtom; // name - ReadNextAtom; // semicolon - InsertPos:=CurPos.EndPos; - if fCTLink.Settings.SupportDelphi then - s:='{$IFDEF FPC}'+LineEnding+' {$MODE Delphi}'+LineEnding+'{$ENDIF}' - else - s:='{$MODE Delphi}'; - fCTLink.SrcCache.Replace(gtEmptyLine,gtEmptyLine,InsertPos,InsertPos,s); - end; - // changing mode requires rescan - BuildTree(lsrEnd); + with fCTLink do begin + if CodeTool.FindModeDirective(true,InsPos) then exit; // Already has mode directive. + Assert(Assigned(CodeTool.Tree.Root), 'AddModeDelphiDirective: Tree root is Nil.'); + if not CodeTool.GetSourceNamePos(NamePos) then exit; // "unit" or "program" + CodeTool.MoveCursorToCleanPos(NamePos.EndPos); + CodeTool.ReadNextAtom; // semicolon + InsPos:=CodeTool.CurPos.EndPos; + if Settings.SupportDelphi then + s:='{$IFDEF FPC}'+LineEnding+' {$MODE Delphi}'+LineEnding+'{$ENDIF}' + else + s:='{$MODE Delphi}'; + SrcCache.MainScanner:=CodeTool.Scanner; + SrcCache.Replace(gtEmptyLine, gtEmptyLine, InsPos, InsPos, s); + if not SrcCache.Apply then exit; + if CodeTool.CleanPosToCaret(InsPos, CaretPos) then + fSettings.AddLogLine(mluNote, lisConvAddedModeDelphiModifier, + fCode.Filename, CaretPos.Y, CaretPos.X); + CodeTool.BuildTree(lsrEnd); // changing mode requires rescan end; Result:=true; end; diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index 8492143e35..873ef10a6c 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -753,6 +753,7 @@ resourcestring lisConvRepairingIncludeFiles = 'Repairing include files : '; lisConvUserSelectedToEndConversion = 'User selected to end conversion with file %s'; lisConvFixedUnitName = 'Fixed unit name from %s to %s.'; + lisConvAddedModeDelphiModifier = 'Added MODE Delphi syntax modifier after unit name.'; lisConvShouldBeFollowedByNumber = '"$" should be followed by a number: %s'; lisConvReplacedCall = 'Replaced call %s with %s'; lisConvReplFuncParameterNum = 'Replacement function parameter number should be >= 1: %s';