MG: fixed linkscanner for double included files

git-svn-id: trunk@1539 -
This commit is contained in:
lazarus 2002-03-23 20:41:34 +00:00
parent dacea82947
commit 900d9bc5b4
4 changed files with 115 additions and 27 deletions

View File

@ -1583,9 +1583,13 @@ function TLinkScanner.CursorToCleanPos(ACursorPos: integer; ACode: pointer;
// 0=valid CleanPos
//-1=CursorPos was skipped, CleanPos is between two links
// 1=CursorPos beyond scanned code
var i, j: integer;
var
i, j, SkippedCleanPos: integer;
SkippedPos: boolean;
begin
i:=0;
SkippedPos:=false;
SkippedCleanPos:=-1;
while i<LinkCount do begin
//writeln('[TLinkScanner.CursorToCleanPos] A ACursorPos=',ACursorPos,', Code=',Links[i].Code=ACode,', Links[i].SrcPos=',Links[i].SrcPos,', Links[i].CleanedPos=',Links[i].CleanedPos);
if (Links[i].Code=ACode) and (Links[i].SrcPos<=ACursorPos) then begin
@ -1601,8 +1605,13 @@ begin
while (j<LinkCount) and (Links[j].Code<>ACode) do inc(j);
//writeln('[TLinkScanner.CursorToCleanPos] D j=',j);
if (j<LinkCount) and (Links[j].SrcPos>ACursorPos) then begin
Result:=-1; // CursorPos was skipped, CleanPos is between two links
exit;
if not SkippedPos then begin
// CursorPos was skipped, CleanPos is between two links
SkippedPos:=true;
SkippedCleanPos:=ACleanPos;
end;
// if this is an double included file,
// this position can be in clean code -> search next
end;
// search next
i:=j-1;
@ -1611,14 +1620,23 @@ begin
//writeln('[TLinkScanner.CursorToCleanPos] E length(FCleanedSrc)=',length(FCleanedSrc));
if ACleanPos<=length(FCleanedSrc) then
Result:=0 // valid position
else
Result:=1; // cursor beyond scanned code
else begin
if SkippedPos then begin
Result:=-1;
ACleanPos:=SkippedCleanPos;
end else
Result:=1; // cursor beyond scanned code
end;
exit;
end;
end;
inc(i);
end;
Result:=1;
if SkippedPos then begin
Result:=-1;
ACLeanPos:=SkippedCleanPos;
end else
Result:=1;
end;
function TLinkScanner.CleanedPosToCursor(ACleanedPos: integer;

View File

@ -34,8 +34,6 @@ interface
{$I codetools.inc}
{ $DEFINE CTDEBUG}
uses
{$IFDEF MEM_CHECK}
MemCheck,
@ -248,7 +246,7 @@ writeln('TMethodJumpingCodeTool.FindJumpPoint B');
{$ENDIF}
// find the CursorPos in cleaned source
r:=CaretToCleanPos(CursorPos, CleanCursorPos);
if (r<>0) and (r<>-1) then
if (r<>0) and (r<>-1) then
RaiseException('Cursor outside of code');
GetLineInfo(CleanCursorPos,LineStart,LineEnd,FirstAtomStart,LastAtomEnd);
if CleanCursorPos<FirstAtomStart then CleanCursorPos:=FirstAtomStart;
@ -264,7 +262,6 @@ writeln('TMethodJumpingCodeTool.FindJumpPoint B');
{$IFDEF CTDEBUG}
writeln('TMethodJumpingCodeTool.FindJumpPoint C ',NodeDescriptionAsString(CursorNode.Desc));
{$ENDIF}
// first test if in a class
ClassNode:=CursorNode;
while (ClassNode<>nil) and (ClassNode.Desc<>ctnClass) do

View File

@ -131,7 +131,9 @@ type
procedure SetupEnvironmentPage;
procedure SetOptions(NewOptions: TRunParamsOptions);
procedure FillSystemVariablesListView;
procedure FillUserOverridesListView;
procedure SaveToOptions;
procedure SaveUserOverrides;
public
constructor Create(AnOwner: TComponent); override;
property Options: TRunParamsOptions read fOptions write SetOptions;
@ -542,7 +544,6 @@ begin
Width:=100;
Caption:='Add';
OnClick:=@UserOverridesAddButtonClick;
Enabled:=false;
Visible:=true;
end;
@ -555,7 +556,6 @@ begin
Width:=100;
Caption:='Edit';
OnClick:=@UserOverridesEditButtonClick;
Enabled:=false;
Visible:=true;
end;
@ -568,7 +568,6 @@ begin
Width:=100;
Caption:='Delete';
OnClick:=@UserOverridesDeleteButtonClick;
Enabled:=false;
Visible:=true;
end;
@ -635,24 +634,55 @@ begin
end;
procedure TRunParamsOptsDlg.UserOverridesAddButtonClick(Sender: TObject);
var Variable, Value: string;
var
Variable, Value: string;
NewLI, SelLI: TListItem;
begin
Variable:='';
Value:='';
SelLI:=SystemVariablesListView.Selected;
if SelLI<>nil then begin
Variable:=SelLI.Caption;
Value:=SelLI.SubItems[0];
end else begin
Variable:='';
Value:='';
end;
if ShowSysVarUserOverrideDialog(Variable,Value)=mrOk then begin
NewLI:=UserOverridesListView.Items.Add;
NewLI.Caption:=Variable;
NewLI.SubItems[0]:=Value;
UserOverridesListView.Selected:=NewLI;
end;
end;
procedure TRunParamsOptsDlg.UserOverridesEditButtonClick(Sender: TObject);
var
Variable, Value: string;
SelLI: TListItem;
begin
SelLI:=UserOverridesListView.Selected;
if SelLI=nil then exit;
Variable:=SelLI.Caption;
Value:=SelLI.SubItems[0];
if ShowSysVarUserOverrideDialog(Variable,Value)=mrOk then begin
SelLI.Caption:=Variable;
SelLI.SubItems[0]:=Value;
end;
end;
procedure TRunParamsOptsDlg.UserOverridesDeleteButtonClick(Sender: TObject);
var
SelLI: TListItem;
OldIndex: integer;
begin
SelLI:=UserOverridesListView.Selected;
if SelLI<>nil then begin
OldIndex:=SelLI.Index;
SelLI.Delete;
if OldIndex=UserOverridesListView.Items.Count then
dec(OldIndex);
if OldIndex>=0 then
UserOverridesListView.Selected:=UserOverridesListView.Items[OldIndex];
end;
end;
procedure TRunParamsOptsDlg.SaveToOptions;
@ -667,12 +697,21 @@ begin
fOptions.Display:=Trim(DisplayEdit.Text);
// environment
// ToDo: User Overrides
SaveUserOverrides;
fOptions.IncludeSystemVariables:=IncludeSystemVariablesCheckBox.Checked;
end;
procedure TRunParamsOptsDlg.SaveUserOverrides;
var i: integer;
begin
Options.UserOverrides.Clear;
for i:=0 to UserOverridesListView.Items.Count-1 do begin
Options.UserOverrides.Values[UserOverridesListView.Items[i].Caption]:=
UserOverridesListView.Items[i].SubItems[0];
end;
end;
procedure TRunParamsOptsDlg.SetOptions(NewOptions: TRunParamsOptions);
begin
fOptions:=NewOptions;
@ -687,7 +726,7 @@ begin
// environment
FillSystemVariablesListView;
// ToDo: User Overrides
FillUserOverridesListView;
IncludeSystemVariablesCheckBox.Checked:=fOptions.IncludeSystemVariables;
end;
@ -720,5 +759,29 @@ Begin
end;
end;
procedure TRunParamsOptsDlg.FillUserOverridesListView;
var
i: integer;
Variable, Value: string;
Begin
with UserOverridesListView.Items do begin
//BeginUpdate;
for i:=0 to Options.UserOverrides.Count-1 do begin
Variable:=Options.UserOverrides.Names[i];
Value:=Options.UserOverrides.Values[Variable];
if Count<=i then begin
// add line to listview
Add;
Item[i].SubItems.Add('');
end;
Item[i].Caption:=Variable;
Item[i].SubItems[0]:=Value;
end;
while Count>Options.UserOverrides.Count do
Delete(Count-1);
//EndUpdate;
end;
end;
end.

View File

@ -59,7 +59,7 @@ begin
ValueEdit.Text:=Value;
Result:=ShowModal;
if (Result=mrOk) then begin
Variable:=VariableEdit.Text;
Variable:=Trim(VariableEdit.Text);
Value:=ValueEdit.Text;
end;
Free;
@ -69,7 +69,15 @@ end;
{ TSysVarUserOverrideDialog }
procedure TSysVarUserOverrideDialog.OkButtonClick(Sender: TObject);
var v: string;
begin
v:=Trim(VariableEdit.Text);
if not IsValidIdent(v) then begin
if MessageDlg('Invalid variable name',
'"'+v+'" is not a valid identifier.',
mtWarning,[mbCancel,mbIgnore],0)=mrCancel
then exit;
end;
ModalResult:=mrOk;
end;
@ -84,7 +92,9 @@ begin
if LazarusResources.Find(ClassName)=nil then begin
Caption:='Override system variable';
SetBounds((Screen.Width-400) div 2,(Screen.Height-200) div 2,400,200);
Width:=400;
Height:=170;
Position:=poScreenCenter;
VariableLabel:=TLabel.Create(Self);
with VariableLabel do begin
@ -100,7 +110,7 @@ begin
Name:='VariableEdit';
Parent:=Self;
SetBounds(VariableLabel.Left,VariableLabel.Top+VariableLabel.Height+2,
Self.ClientWidth-2*Left,Height);
Self.ClientWidth-2*VariableLabel.Left,Height);
Visible:=true;
end;
@ -119,7 +129,7 @@ begin
Name:='ValueEdit';
Parent:=Self;
SetBounds(ValueLabel.Left,ValueLabel.Top+ValueLabel.Height+2,
Self.ClientWidth-2*Left,Height);
Self.ClientWidth-2*ValueLabel.Left,Height);
Visible:=true;
end;