mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 02:19:29 +01:00 
			
		
		
		
	MG: fixed linkscanner for double included files
git-svn-id: trunk@1539 -
This commit is contained in:
		
							parent
							
								
									dacea82947
								
							
						
					
					
						commit
						900d9bc5b4
					
				@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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.
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user