codetoolsL TLinkScanenr: using TSourceLog

This commit is contained in:
mattias 2023-06-09 15:25:03 +02:00
parent cece089505
commit 1d74ac6a25
5 changed files with 90 additions and 127 deletions

View File

@ -160,9 +160,8 @@ type
function FindIncludeLinkAVLNode(const IncludeFilename: string): TAVLTreeNode;
function OnScannerCheckFileOnDisk(Code: pointer): boolean; // true if code changed
function OnScannerGetFileName(Sender: TObject; Code: pointer): string;
function OnScannerGetSource(Sender: TObject; Code: pointer): TSourceLog;
function OnScannerLoadSource(Sender: TObject; const AFilename: string;
OnlyIfExists: boolean): pointer;
OnlyIfExists: boolean): TSourceLog;
procedure OnScannerDeleteSource(Sender: TObject; Code: Pointer;
Pos, Len: integer);
procedure OnScannerGetSourceStatus(Sender: TObject; Code:Pointer;
@ -880,7 +879,6 @@ var
begin
s:=Sender.Scanner;
if s=nil then exit;
s.OnGetSource:=@Self.OnScannerGetSource;
s.OnGetFileName:=@Self.OnScannerGetFileName;
s.OnLoadSource:=@Self.OnScannerLoadSource;
s.OnCheckFileOnDisk:=@Self.OnScannerCheckFileOnDisk;
@ -906,18 +904,8 @@ begin
raise Exception.Create('[TCodeCache.OnScannerGetFilename] Code=nil');
end;
function TCodeCache.OnScannerGetSource(Sender: TObject;
Code: pointer): TSourceLog;
begin
//DebugLn('[TCodeCache.OnScannerGetSource] A ',DbgS(Code),'/',Count);
if (Code<>nil) then
Result:=TSourceLog(Code)
else
raise Exception.Create('[TCodeCache.OnScannerGetFilename] Code=nil');
end;
function TCodeCache.OnScannerLoadSource(Sender: TObject;
const AFilename: string; OnlyIfExists: boolean): pointer;
const AFilename: string; OnlyIfExists: boolean): TSourceLog;
begin
if OnlyIfExists then begin
Result:=FindFile(AFilename);

View File

@ -2303,7 +2303,7 @@ begin
for i:=0 to Scanner.LinkCount-1 do begin
Link:=Scanner.Links[i];
if Link.Code=nil then continue;
if Link.Code<>Pointer(CursorPos.Code) then continue;
if Link.Code<>CursorPos.Code then continue;
if Link.SrcPos>p then continue;
NearestScanPos:=Link.SrcPos+Scanner.LinkSize(i);
end;

View File

@ -3595,8 +3595,8 @@ var
var
DirectiveName, Param: string;
NewCode: TCodeBuffer;
NewSrcLog: TSourceLog;
MissingIncludeFile: TMissingIncludeFile;
NewCodePtr: Pointer;
begin
Result:=false;
// cursor in comment in parsed code
@ -3625,10 +3625,10 @@ var
FoundFilename:=ResolveDots(GetForcedPathDelims(Param));
// search include file
MissingIncludeFile:=nil;
if Scanner.SearchIncludeFile(FoundFilename,NewCodePtr,
if Scanner.SearchIncludeFile(FoundFilename,NewSrcLog,
MissingIncludeFile)
then
FoundFilename:=TCodeBuffer(NewCodePtr).Filename;
FoundFilename:=TCodeBuffer(NewSrcLog).Filename;
end;
exit;
end;

View File

@ -76,7 +76,7 @@ type
TOnGetSource = function(Sender: TObject; Code: Pointer): TSourceLog
of object;
TOnLoadSource = function(Sender: TObject; const AFilename: string;
OnlyIfExists: boolean): pointer of object;
OnlyIfExists: boolean): TSourceLog of object;
TOnGetSourceStatus = procedure(Sender: TObject; Code: Pointer;
var ReadOnly: boolean) of object;
TOnDeleteSource = procedure(Sender: TObject; Code: Pointer; Pos, Len: integer)
@ -103,14 +103,14 @@ type
TSourceLink = record
CleanedPos: integer;
SrcPos: integer;
Code: Pointer;
Code: TSourceLog;
Kind: TSourceLinkKind;
Next: PSourceLink;
end;
TSourceLinkMacro = record
Name: PChar;
Code: Pointer;
Code: TSourceLog;
Src: string;
SrcFilename: string;
StartPos, EndPos: integer;
@ -121,7 +121,7 @@ type
A ChangeStep is switching to or from an include file }
PSourceChangeStep = ^TSourceChangeStep;
TSourceChangeStep = record
Code: Pointer;
Code: TSourceLog;
ChangeStep: integer;
Next: PSourceChangeStep;
end;
@ -557,7 +557,6 @@ type
FLinkCapacity: integer;
FCleanedSrc: string;
FLastCleanedSrcLen: integer;
FOnGetSource: TOnGetSource;
FOnGetFileName: TOnGetFileName;
FOnGetSourceStatus: TOnGetSourceStatus;
FOnLoadSource: TOnLoadSource;
@ -566,14 +565,14 @@ type
FOnGetInitValues: TOnGetInitValues;
FOnIncludeCode: TOnIncludeCode;
FOnProgress: TLinkScannerProgress;
FIgnoreErrorAfterCode: Pointer;
FIgnoreErrorAfterCode: TSourceLog;
FIgnoreErrorAfterCursorPos: integer;
FInitValues: TExpressionEvaluator;
FInitValuesChangeStep: integer;
FSourceChangeSteps: TFPList; // list of PSourceChangeStep sorted with Code
FChangeStep: integer;
FMainSourceFilename: string;
FMainCode: pointer;
FMainCode: TSourceLog;
FScanTill: TLinkScannerRange;
FNestedComments: boolean; // for speed reasons keep this flag redundant with the CompilerModeSwitches
FStates: TLinkScannerStates;
@ -586,12 +585,12 @@ type
function GetLinks(Index: integer): TSourceLink; inline;
function GetLinkP(Index: integer): PSourceLink; inline;
procedure SetLinks(Index: integer; const Value: TSourceLink);
procedure SetSource(ACode: Pointer); // set current source
procedure AddSourceChangeStep(ACode: pointer; AChangeStep: integer);
procedure AddLink(ASrcPos: integer; ACode: Pointer;
procedure SetSource(ACode: TSourceLog); // set current source
procedure AddSourceChangeStep(ACode: TSourceLog; AChangeStep: integer);
procedure AddLink(ASrcPos: integer; ACode: TSourceLog;
AKind: TSourceLinkKind = slkCode);
procedure IncreaseChangeStep; inline;
procedure SetMainCode(const Value: pointer);
procedure SetMainCode(const Value: TSourceLog);
procedure SetScanTill(const Value: TLinkScannerRange);
function GetIgnoreMissingIncludeFiles: boolean;
procedure SetIgnoreMissingIncludeFiles(const Value: boolean);
@ -694,7 +693,7 @@ type
function DoDirective(StartPos, DirLen: integer): boolean;
function IncludeFile(const AFilename: string): boolean;
procedure PushIncludeLink(ACleanedPos, ASrcPos: integer; ACode: Pointer);
procedure PushIncludeLink(ACleanedPos, ASrcPos: integer; ACode: TSourceLog);
function PopIncludeLink: TSourceLink;
function GetIncludeFileIsMissing: boolean;
function MissingIncludeFilesNeedsUpdate: boolean;
@ -709,7 +708,7 @@ type
// error: the error is in range Succ(ScannedRange)
LastErrorMessage: string;
LastErrorSrcPos: integer;
LastErrorCode: pointer;
LastErrorCode: TSourceLog;
LastErrorIsValid: boolean;
LastErrorBehindIgnorePosition: boolean;
LastErrorCheckedForIgnored: boolean;
@ -733,7 +732,7 @@ type
TokenStart: integer; // start position of current token
TokenType: TLSTokenType;
SrcLen: integer; // length of current source
Code: pointer; // current code object (TCodeBuffer)
Code: TSourceLog; // current code object (TCodeBuffer)
Values: TExpressionEvaluator;
SrcFilename: string;// current parsed filename (= TCodeBuffer(Code).Filename)
IsUnit: boolean;
@ -749,7 +748,7 @@ type
property LinkP[Index: integer]: PSourceLink read GetLinkP;
property LinkCount: integer read FLinkCount;
function LinkIndexAtCleanPos(ACleanPos: integer): integer;
function LinkIndexAtCursorPos(ACursorPos: integer; ACode: Pointer): integer;
function LinkIndexAtCursorPos(ACursorPos: integer; ACode: TSourceLog): integer;
function LinkSize(Index: integer): integer;
function LinkSize_Inline(Index: integer): integer; inline;
function LinkCleanedEndPos(Index: integer): integer;
@ -757,7 +756,7 @@ type
function LinkSourceLog(Index: integer): TSourceLog;
function FindFirstSiblingLink(LinkIndex: integer): integer;
function FindParentLink(LinkIndex: integer): integer;
function LinkIndexNearCursorPos(ACursorPos: integer; ACode: Pointer;
function LinkIndexNearCursorPos(ACursorPos: integer; ACode: TSourceLog;
var CursorInLink: boolean): integer;
function CreateTreeOfSourceCodes: TAVLTree;
@ -778,7 +777,7 @@ type
// source mapping (Cleaned <-> Original)
function CleanedSrc: string;
function CursorToCleanPos(ACursorPos: integer; ACode: pointer;
function CursorToCleanPos(ACursorPos: integer; ACode: TSourceLog;
out ACleanPos: integer): integer; // 0=valid CleanPos
//-1=CursorPos was skipped, CleanPos between two links
// 1=CursorPos beyond scanned code
@ -799,17 +798,17 @@ type
procedure Scan(Range: TLinkScannerRange; CheckFilesOnDisk: boolean);
function UpdateNeeded(Range: TLinkScannerRange;
CheckFilesOnDisk: boolean): boolean;
procedure SetIgnoreErrorAfter(ACursorPos: integer; ACode: Pointer);
procedure SetIgnoreErrorAfter(ACursorPos: integer; ACode: TSourceLog);
procedure ClearIgnoreErrorAfter;
function IgnoreErrAfterPositionIsInFrontOfLastErrMessage: boolean;
function IgnoreErrorAfterCleanedPos: integer;// before using this, check if valid!
function IgnoreErrorAfterValid: boolean;
function CleanPosIsAfterIgnorePos(CleanPos: integer): boolean;
function LoadSourceCaseLoUp(const AFilename: string; AllowVirtual: boolean = false): pointer; // returns a TCodeBuffer
function LoadIncludeFile(const AFilename: string; AllowVirtual: boolean = false): pointer; // returns a TCodeBuffer
function LoadSourceCaseLoUp(const AFilename: string; AllowVirtual: boolean = false): TSourceLog;
function LoadIncludeFile(const AFilename: string; AllowVirtual: boolean = false): TSourceLog;
class function GetPascalCompiler(Evals: TExpressionEvaluator): TPascalCompiler;
function SearchIncludeFile(AFilename: string; out NewCode: Pointer;
function SearchIncludeFile(AFilename: string; out NewCode: TSourceLog;
var MissingIncludeFile: TMissingIncludeFile): boolean;
{$IFDEF GuessMisplacedIfdef}
function GuessMisplacedIfdefEndif(StartCursorPos: integer;
@ -829,7 +828,6 @@ type
read FOnSetGlobalWriteLock write FOnSetGlobalWriteLock;
// properties
property OnGetSource: TOnGetSource read FOnGetSource write FOnGetSource;
property OnLoadSource: TOnLoadSource read FOnLoadSource write FOnLoadSource;
property OnDeleteSource: TOnDeleteSource read FOnDeleteSource write FOnDeleteSource;
property OnGetSourceStatus: TOnGetSourceStatus
@ -844,7 +842,7 @@ type
property IgnoreMissingIncludeFiles: boolean read GetIgnoreMissingIncludeFiles
write SetIgnoreMissingIncludeFiles;
property InitialValues: TExpressionEvaluator read FInitValues write FInitValues;
property MainCode: pointer read FMainCode write SetMainCode;
property MainCode: TSourceLog read FMainCode write SetMainCode;
property IncludeFileIsMissing: boolean read GetIncludeFileIsMissing;
property NestedComments: boolean read FNestedComments;
property CompilerMode: TCompilerMode read FCompilerMode write SetCompilerMode;
@ -1414,7 +1412,7 @@ begin
@CompareLSDirectiveCodeSrcPosCleanPos);
end;
procedure TLinkScanner.AddLink(ASrcPos: integer; ACode: Pointer;
procedure TLinkScanner.AddLink(ASrcPos: integer; ACode: TSourceLog;
AKind: TSourceLinkKind);
var
NewCapacity: Integer;
@ -1531,10 +1529,7 @@ end;
function TLinkScanner.LinkSourceLog(Index: integer): TSourceLog;
begin
if Assigned(OnGetSource) then
Result:=OnGetSource(Self,FLinks[Index].Code)
else
Result:=nil;
Result:=FLinks[Index].Code;
end;
function TLinkScanner.FindFirstSiblingLink(LinkIndex: integer): integer;
@ -1578,7 +1573,7 @@ begin
end;
function TLinkScanner.LinkIndexNearCursorPos(ACursorPos: integer;
ACode: Pointer; var CursorInLink: boolean): integer;
ACode: TSourceLog; var CursorInLink: boolean): integer;
// returns the nearest link at cursorpos
// (either covering the cursorpos or in front)
var
@ -1745,8 +1740,8 @@ begin
ConsistencyError1;
end;
function TLinkScanner.LinkIndexAtCursorPos(ACursorPos: integer; ACode: Pointer
): integer;
function TLinkScanner.LinkIndexAtCursorPos(ACursorPos: integer;
ACode: TSourceLog): integer;
var
CurLinkSize: integer;
begin
@ -1763,31 +1758,17 @@ begin
Result:=-1;
end;
procedure TLinkScanner.SetSource(ACode: Pointer);
procedure RaiseUnableToGetCode;
begin
RaiseConsistencyException(20170422125957,'unable to get source with Code='+DbgS(Code));
end;
var SrcLog: TSourceLog;
procedure TLinkScanner.SetSource(ACode: TSourceLog);
begin
if Assigned(FOnGetSource) then begin
SrcLog:=FOnGetSource(Self,ACode);
if SrcLog=nil then
RaiseUnableToGetCode;
SrcFilename:=FOnGetFileName(Self,ACode);
AddSourceChangeStep(ACode,SrcLog.ChangeStep);
Src:=SrcLog.Source;
Code:=ACode;
SrcPos:=1;
TokenStart:=1;
TokenType:=lsttNone;
SrcLen:=length(Src);
CopiedSrcPos:=0;
end else begin
RaiseUnableToGetCode;
end;
SrcFilename:=FOnGetFileName(Self,ACode);
AddSourceChangeStep(ACode,ACode.ChangeStep);
Src:=ACode.Source;
Code:=ACode;
SrcPos:=1;
TokenStart:=1;
TokenType:=lsttNone;
SrcLen:=length(Src);
CopiedSrcPos:=0;
end;
procedure TLinkScanner.HandleDirective;
@ -2386,16 +2367,17 @@ begin
CopiedSrcPos:=NewCopiedSrcPos;
end;
procedure TLinkScanner.AddSourceChangeStep(ACode: pointer; AChangeStep: integer);
procedure TLinkScanner.AddSourceChangeStep(ACode: TSourceLog;
AChangeStep: integer);
procedure RaiseCodeNil;
begin
RaiseConsistencyException(20170422130109,'TLinkScanner.AddSourceChangeStep ACode=nil');
end;
var l,r,m: integer;
var l,r,m, cmp: integer;
NewSrcChangeStep: PSourceChangeStep;
c: pointer;
c: TSourceLog;
begin
//DebugLn('[TLinkScanner.AddSourceChangeStep] ',DbgS(ACode));
if ACode=nil then
@ -2407,14 +2389,16 @@ begin
while (l<=r) do begin
m:=(l+r) shr 1;
c:=PSourceChangeStep(FSourceChangeSteps[m])^.Code;
if c<ACode then l:=m+1
else if c>ACode then r:=m-1
cmp:=ComparePointers(c,ACode);
if cmp<0 then l:=m+1
else if cmp>0 then r:=m-1
else exit;
end;
NewSrcChangeStep:=PSourceChangeStepMemManager.NewPSourceChangeStep;
NewSrcChangeStep^.Code:=ACode;
NewSrcChangeStep^.ChangeStep:=AChangeStep;
if (FSourceChangeSteps.Count>0) and (c<ACode) then inc(m);
if (c<>nil) and (ComparePointers(c,ACode)<0) then
inc(m);
FSourceChangeSteps.Insert(m,NewSrcChangeStep);
//DebugLn(' ADDING ',DbgS(ACode),',',FSourceChangeSteps.Count);
end;
@ -2612,18 +2596,16 @@ begin
// check all used codebuffers
if FGlobalSourcesChangeStep<>CurSourcesChangeStep then begin
FGlobalSourcesChangeStep:=CurSourcesChangeStep;
if Assigned(FOnGetSource) then begin
for i:=0 to FSourceChangeSteps.Count-1 do begin
SrcChange:=PSourceChangeStep(FSourceChangeSteps[i]);
SrcLog:=FOnGetSource(Self,SrcChange^.Code);
//debugln(['TLinkScanner.UpdateNeeded ',ExtractFilename(MainFilename),' i=',i,' File=',FOnGetFileName(Self,SrcLog),' Last=',SrcChange^.ChangeStep,' Now=',SrcLog.ChangeStep]);
if SrcChange^.ChangeStep<>SrcLog.ChangeStep then begin
{$IFDEF VerboseUpdateNeeded}
DebugLn(['TLinkScanner.UpdateNeeded because source buffer changed: ',OnGetFileName(Self,SrcLog),' MainFilename=',MainFilename]);
{$ENDIF}
Include(FStates,lssSourcesChanged);
exit;
end;
for i:=0 to FSourceChangeSteps.Count-1 do begin
SrcChange:=PSourceChangeStep(FSourceChangeSteps[i]);
SrcLog:=SrcChange^.Code;
//debugln(['TLinkScanner.UpdateNeeded ',ExtractFilename(MainFilename),' i=',i,' File=',FOnGetFileName(Self,SrcLog),' Last=',SrcChange^.ChangeStep,' Now=',SrcLog.ChangeStep]);
if SrcChange^.ChangeStep<>SrcLog.ChangeStep then begin
{$IFDEF VerboseUpdateNeeded}
DebugLn(['TLinkScanner.UpdateNeeded because source buffer changed: ',OnGetFileName(Self,SrcLog),' MainFilename=',MainFilename]);
{$ENDIF}
Include(FStates,lssSourcesChanged);
exit;
end;
end;
end;
@ -2632,18 +2614,16 @@ begin
if CheckFilesOnDisk then begin
if FGlobalFilesChangeStep<>CurFilesChangeStep then begin
FGlobalFilesChangeStep:=CurFilesChangeStep;
if Assigned(FOnGetSource) then begin
// if files changed on disk, reload them
for i:=0 to FSourceChangeSteps.Count-1 do begin
SrcChange:=PSourceChangeStep(FSourceChangeSteps[i]);
SrcLog:=FOnGetSource(Self,SrcChange^.Code);
if FOnCheckFileOnDisk(SrcLog) then begin
{$IFDEF VerboseUpdateNeeded}
DebugLn(['TLinkScanner.UpdateNeeded because file on disk changed: ',OnGetFileName(Self,SrcLog),' MainFilename=',MainFilename]);
{$ENDIF}
Include(FStates,lssFilesChanged);
exit;
end;
// if files changed on disk, reload them
for i:=0 to FSourceChangeSteps.Count-1 do begin
SrcChange:=PSourceChangeStep(FSourceChangeSteps[i]);
SrcLog:=SrcChange^.Code;
if FOnCheckFileOnDisk(SrcLog) then begin
{$IFDEF VerboseUpdateNeeded}
DebugLn(['TLinkScanner.UpdateNeeded because file on disk changed: ',OnGetFileName(Self,SrcLog),' MainFilename=',MainFilename]);
{$ENDIF}
Include(FStates,lssFilesChanged);
exit;
end;
end;
end;
@ -2663,7 +2643,8 @@ begin
Result:=false;
end;
procedure TLinkScanner.SetIgnoreErrorAfter(ACursorPos: integer; ACode: Pointer);
procedure TLinkScanner.SetIgnoreErrorAfter(ACursorPos: integer;
ACode: TSourceLog);
begin
if (FIgnoreErrorAfterCode=ACode)
and (FIgnoreErrorAfterCursorPos=ACursorPos) then exit;
@ -3259,7 +3240,7 @@ begin
Result:=FHiddenUsedUnits;
end;
procedure TLinkScanner.SetMainCode(const Value: pointer);
procedure TLinkScanner.SetMainCode(const Value: TSourceLog);
begin
if FMainCode=Value then exit;
FMainCode:=Value;
@ -4029,7 +4010,7 @@ begin
end;
function TLinkScanner.LoadSourceCaseLoUp(const AFilename: string;
AllowVirtual: boolean): pointer;
AllowVirtual: boolean): TSourceLog;
var
Path, FileNameOnly: string;
SecondaryFileNameOnly: String;
@ -4057,12 +4038,12 @@ begin
end;
function TLinkScanner.LoadIncludeFile(const AFilename: string;
AllowVirtual: boolean): pointer;
AllowVirtual: boolean): TSourceLog;
var
Path, FileNameOnly: string;
SecondaryFileName: String;
function Search(const ShortFilename: string; var r: Pointer): boolean;
function Search(const ShortFilename: string; var r: TSourceLog): boolean;
begin
Result:=false;
@ -4121,8 +4102,8 @@ begin
Result:=pcFPC;
end;
function TLinkScanner.SearchIncludeFile(AFilename: string;
out NewCode: Pointer; var MissingIncludeFile: TMissingIncludeFile): boolean;
function TLinkScanner.SearchIncludeFile(AFilename: string; out
NewCode: TSourceLog; var MissingIncludeFile: TMissingIncludeFile): boolean;
var
PathStart, PathEnd: integer;
IncludePath, CurPath: string;
@ -4150,7 +4131,7 @@ var
Result:=NewCode<>nil;
end;
function SearchCasedInIncPath(const RelFilename: string): boolean;
function Search(const RelFilename: string): boolean;
var
IsVirtualUnit: Boolean;
begin
@ -4248,14 +4229,7 @@ begin
{$IFDEF VerboseIncludeSearch}
debugln(['TLinkScanner.SearchIncludeFile FMainSourceFilename="',FMainSourceFilename,'" SrcFile="',SrcFilename,'" AFilename="',AFilename,'"']);
{$ENDIF}
if SearchCasedInIncPath(AFilename) then exit(true);
if ExtractFileExt(AFilename)='' then begin
// search with the default file extensions
if SearchCasedInIncPath(AFilename+'.inc') then exit(true);
if SearchCasedInIncPath(AFilename+'.pp') then exit(true);
if SearchCasedInIncPath(AFilename+'.pas') then exit(true);
end;
if Search(AFilename) then exit(true);
SetMissingIncludeFile;
Result:=false;
@ -4263,7 +4237,7 @@ end;
function TLinkScanner.IncludeFile(const AFilename: string): boolean;
var
NewCode: Pointer;
NewCode: TSourceLog;
MissingIncludeFile: TMissingIncludeFile;
begin
MissingIncludeFile:=nil;
@ -4339,7 +4313,7 @@ begin
end;
procedure TLinkScanner.PushIncludeLink(ACleanedPos, ASrcPos: integer;
ACode: Pointer);
ACode: TSourceLog);
procedure RaiseIncludeCircleDetected;
begin
@ -4379,7 +4353,7 @@ function TLinkScanner.MissingIncludeFilesNeedsUpdate: boolean;
var
i: integer;
MissingIncludeFile: TMissingIncludeFile;
NewCode: Pointer;
NewCode: TSourceLog;
begin
Result:=false;
if (not IncludeFileIsMissing) or IgnoreMissingIncludeFiles then exit;
@ -4478,7 +4452,7 @@ end;
procedure TLinkScanner.AddMacroSource(MacroID: integer);
var
Macro: PSourceLinkMacro;
OldCode: Pointer;
OldCode: TSourceLog;
OldSrc: String;
OldSrcFilename: String;
begin
@ -4825,7 +4799,7 @@ begin
FSkipIfLevel:=-1;
end;
function TLinkScanner.CursorToCleanPos(ACursorPos: integer; ACode: pointer;
function TLinkScanner.CursorToCleanPos(ACursorPos: integer; ACode: TSourceLog;
out ACleanPos: integer): integer;
// 0=valid CleanPos
//-1=CursorPos was skipped, CleanPos is between two links
@ -4987,7 +4961,7 @@ function TLinkScanner.WholeRangeIsWritable(CleanStartPos, CleanEndPos: integer;
end;
var
ACode: Pointer;
ACode: TSourceLog;
LinkIndex: integer;
CodeIsReadOnly: boolean;
begin
@ -5031,7 +5005,8 @@ end;
procedure TLinkScanner.FindCodeInRange(CleanStartPos, CleanEndPos: integer;
UniqueSortedCodeList: TFPList);
var ACode: Pointer;
var
ACode: TSourceLog;
LinkIndex: integer;
Link: PSourceLink;
begin

View File

@ -2061,7 +2061,7 @@ begin
// special replace
i:=0;
while (i<Scanner.LinkCount)
and (Scanner.Links[i].Code<>Pointer(ResourceCode)) do
and (Scanner.Links[i].Code<>ResourceCode) do
inc(i);
if i>=Scanner.LinkCount then exit;
FromPos:=Scanner.Links[i].CleanedPos;