mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-12 11:42:33 +02:00
270 lines
6.3 KiB
ObjectPascal
270 lines
6.3 KiB
ObjectPascal
// TEST_USES=WatchesScopeUnit1.pas,WatchesScopeUnit2.pas
|
|
|
|
(* Test Purpose
|
|
- Access to variables/tyes in current and all outer scopes
|
|
(each scope has a variable with a different name)
|
|
- Choose variable of correct (most inner visible) scope
|
|
(all scopes have a variable of the same name)
|
|
- Global vars according to the unit of the current selected stackframe
|
|
- Missing: Global vars of other units, according to order in "uses"
|
|
*)
|
|
|
|
(* Calling order / Do not change / Insertation allowed
|
|
|
|
// Nested functions
|
|
|
|
>> function FuncFoo: integer;
|
|
>> function FuncFooNested: AnsiString;
|
|
>> function FuncFooNestedTwice: AnsiString;
|
|
* TEST_BREAKPOINT//=FuncFooNestedTwice
|
|
<<
|
|
|
|
>> function FuncFooNestedTwice2(Int_Hide_Foo: Integer): AnsiString;
|
|
* TEST_BREAKPOINT//=FuncFooNestedTwice2
|
|
<<
|
|
|
|
* TEST_BREAKPOINT//=FuncFooNested
|
|
<< function FuncFooNested: AnsiString;
|
|
|
|
* TEST_BREAKPOINT//=FuncFoo
|
|
<< function FuncFoo: integer;
|
|
|
|
// Class vs Base Class + Nested Function in method (nested function access to self)
|
|
TClassMainBaseBase = class() // In Unit2 // private section should not be visible
|
|
TClassMainBase = class(TClassMainBaseBase) // In Unit1 // private section should not be visible
|
|
TClassMain = class(TClassMainBase)
|
|
TClassMainChild = class(TClassMain)
|
|
|
|
|
|
>> procedure TClassMainBaseBase.MethodMainBaseBase;
|
|
>> procedure TClassMainBase.MethodMainBase;
|
|
>> procedure TClassMain.MethodMain;
|
|
|
|
>>>> class TClassMainChild
|
|
>> procedure TClassMainChild.MethodMainChild;
|
|
>> procedure MethodMainChildNested;
|
|
>> procedure MethodMainChildNestedTwice;
|
|
* TEST_BREAKPOINT//=MethodMainChildNestedTwice
|
|
<<
|
|
|
|
* TEST_BREAKPOINT//=MethodMainChildNested
|
|
<< procedure MethodMainChildNested;
|
|
|
|
* TEST_BREAKPOINT//=MethodMainChild
|
|
<< procedure TClassMainChild.MethodMainChild;
|
|
<<<< class TClassMainChild
|
|
|
|
* TEST_BREAKPOINT//=MethodMain
|
|
<< procedure TClassMain.MethodMain;
|
|
|
|
* TEST_BREAKPOINT//=MethodMainBase
|
|
<< procedure TClassMainBase.MethodMainBase;
|
|
|
|
* TEST_BREAKPOINT//=MethodMainBaseBase
|
|
<< procedure TClassMainBaseBase.MethodMainBaseBase;
|
|
|
|
*)
|
|
|
|
program WatchesScopePrg;
|
|
{$H-}
|
|
|
|
uses sysutils, Classes, WatchesScopeUnit1, WatchesScopeUnit2;
|
|
|
|
type
|
|
|
|
{ TClassMain }
|
|
|
|
TClassMain = class(TClassMainBase)
|
|
private
|
|
Int_TClassMain_Priv: Integer;
|
|
protected
|
|
Int_TClassMain_Prot: Integer;
|
|
public
|
|
Int_TClassMain: Integer;
|
|
procedure MethodMain; override;
|
|
procedure MethodMainChild; virtual;
|
|
public
|
|
type
|
|
TMainEnum = (mm1, mm2);
|
|
end;
|
|
|
|
{ TClassMainChild }
|
|
|
|
TClassMainChild = class(TClassMain)
|
|
private
|
|
Int_TClassMainChild_Priv: Integer;
|
|
protected
|
|
Int_TClassMainChild_Prot: Integer;
|
|
public
|
|
Int_TClassMainChild: Integer;
|
|
|
|
Int_HideTest_Class: Integer; // Hide same name var in other scope
|
|
procedure MethodMainChild; override;
|
|
end;
|
|
|
|
|
|
type
|
|
TMainGlobEnum = (mmG1, mmG2);
|
|
THideMainEnum = (hmG1, hmG2);
|
|
var
|
|
BreakDummy: Integer;
|
|
Int_GlobalPrg: Integer;
|
|
Int_HideTest_Class: Integer;
|
|
Int_HideTest_Unit: Integer;
|
|
|
|
TestClassMainChild: TClassMainChild;
|
|
|
|
Int_Hide_Foo: Integer;
|
|
e1: TMainGlobEnum;
|
|
e2: THideMainEnum;
|
|
|
|
{ TClassMain }
|
|
|
|
procedure TClassMain.MethodMain;
|
|
var
|
|
e1: TMainEnum;
|
|
begin
|
|
e1 := mm1;
|
|
|
|
MethodMainChild; // call inherited class
|
|
BreakDummy := 1; // TEST_BREAKPOINT=MethodMain
|
|
end;
|
|
|
|
procedure TClassMain.MethodMainChild;
|
|
begin
|
|
//
|
|
end;
|
|
|
|
{ TClassMainChild }
|
|
|
|
procedure TClassMainChild.MethodMainChild;
|
|
type
|
|
TMethodMainChildEnum = (mmC1, mmC2);
|
|
THideMainEnum = (hmC1, hmC2);
|
|
var
|
|
Int_MethodMainChild: Integer;
|
|
|
|
procedure MethodMainChildNested;
|
|
type
|
|
TMethodMainChildNestedEnum = (mmCN1, mmCN2);
|
|
THideMainEnum = (hmCN1, hmCN2);
|
|
var
|
|
Int_MethodMainChildNested: Integer;
|
|
e1: TMethodMainChildNestedEnum;
|
|
e2: THideMainEnum;
|
|
|
|
procedure MethodMainChildNestedTwice;
|
|
type
|
|
TMethodMainChildNestedTwiceEnum = (mmCNT1, mmCNT2);
|
|
THideMainEnum = (hmCNT1, hmCNT2);
|
|
var
|
|
Int_MethodMainChildNestedTwice: integer;
|
|
e1: TMethodMainChildNestedTwiceEnum;
|
|
e2: THideMainEnum;
|
|
begin
|
|
e1 := mmCNT1;
|
|
e2 := hmCNT1;
|
|
Int_MethodMainChildNestedTwice := 30;
|
|
BreakDummy := 1; // TEST_BREAKPOINT=MethodMainChildNestedTwice
|
|
end;
|
|
|
|
begin
|
|
e1 := mmCN1;
|
|
e2 := hmCN1;
|
|
Int_MethodMainChildNested := 40;
|
|
MethodMainChildNestedTwice;
|
|
BreakDummy := 1; // TEST_BREAKPOINT=MethodMainChildNested
|
|
end;
|
|
|
|
var
|
|
Int_MethodMainChild_Late: integer;
|
|
e1: TMethodMainChildEnum;
|
|
e2: THideMainEnum;
|
|
begin
|
|
e1 := mmC1;
|
|
e2 := hmC1;
|
|
Int_MethodMainChild := 50;
|
|
Int_MethodMainChild_Late := 52;
|
|
Int_TClassMainChild := 70;
|
|
Int_TClassMainChild_Prot := 71;
|
|
Int_TClassMainChild_Priv := 72;
|
|
Int_TClassMain := 80;
|
|
Int_TClassMain_Prot := 81;
|
|
Int_TClassMain_Priv := 82;
|
|
|
|
Int_HideTest_Class := 3001;
|
|
|
|
MethodMainChildNested;
|
|
BreakDummy := 1; // TEST_BREAKPOINT=MethodMainChild
|
|
end;
|
|
|
|
|
|
function FuncFoo: integer;
|
|
type
|
|
TTestEnum = (te1, te2, te3);
|
|
var
|
|
Int_Hide_Foo: Integer;
|
|
TestEnum: TTestEnum;
|
|
|
|
|
|
function FuncFooNested: AnsiString;
|
|
var
|
|
Int_Hide_Foo: Integer;
|
|
|
|
function FuncFooNestedTwice: AnsiString;
|
|
var
|
|
Int_Hide_Foo: Integer;
|
|
begin
|
|
Result := 'abc';
|
|
Int_Hide_Foo := 4;
|
|
BreakDummy := 1; // TEST_BREAKPOINT=FuncFooNestedTwice
|
|
end;
|
|
|
|
function FuncFooNestedTwice2(Int_Hide_Foo: Integer): AnsiString;
|
|
begin
|
|
Result := 'abc2';
|
|
Int_Hide_Foo := 5;
|
|
BreakDummy := 1; // TEST_BREAKPOINT=FuncFooNestedTwice2
|
|
end;
|
|
|
|
begin
|
|
Result := 'bar';
|
|
Int_Hide_Foo := 3;
|
|
TestEnum := te3;
|
|
FuncFooNestedTwice;
|
|
FuncFooNestedTwice2(-1);
|
|
BreakDummy := 1; // TEST_BREAKPOINT=FuncFooNested
|
|
end;
|
|
|
|
begin
|
|
Result := 99;
|
|
Int_Hide_Foo := 2;
|
|
FuncFooNested;
|
|
BreakDummy := 1; // TEST_BREAKPOINT=FuncFoo
|
|
end;
|
|
|
|
|
|
|
|
begin
|
|
Unit1Init;
|
|
Unit2Init;
|
|
e1 := mmG1;
|
|
e2 := hmG1;
|
|
Int_GlobalUnit1 := 201;
|
|
Int_GlobalUnit2 := 202;
|
|
Int_GlobalPrg := 101;
|
|
|
|
Int_HideTest_Class := 3000;
|
|
Int_HideTest_Unit := 3010;
|
|
|
|
Int_Hide_Foo := 1;
|
|
FuncFoo;
|
|
|
|
TestClassMainChild := TClassMainChild.Create;
|
|
|
|
// Call the deepest class first, and make the way up to each inherited class
|
|
TestClassMainChild.MethodMainBaseBase();
|
|
|
|
BreakDummy := 1; // TEST_BREAKPOINT=Prg
|
|
end.
|