mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 11:28:07 +02:00
pastojs: anonymous vartype
git-svn-id: trunk@48793 -
This commit is contained in:
parent
2cd6951205
commit
1b6eab81ef
@ -6229,16 +6229,43 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TPasResolver.FinishSubElementType(Parent: TPasElement; El: TPasType);
|
procedure TPasResolver.FinishSubElementType(Parent: TPasElement; El: TPasType);
|
||||||
|
|
||||||
|
procedure InsertInFront(NewParent: TPasElement; List: TFPList
|
||||||
|
{$IFDEF CheckPasTreeRefCount};const aId: string{$ENDIF});
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
p: TPasElement;
|
||||||
|
begin
|
||||||
|
p:=El.Parent;
|
||||||
|
if NewParent=p.Parent then
|
||||||
|
begin
|
||||||
|
// e.g. a:array of longint; -> insert a$a in front of a
|
||||||
|
i:=List.Count-1;
|
||||||
|
while (i>=0) and (List[i]<>Pointer(p)) do
|
||||||
|
dec(i);
|
||||||
|
if i<0 then
|
||||||
|
List.Add(El)
|
||||||
|
else
|
||||||
|
List.Insert(i,El);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
List.Add(El);
|
||||||
|
end;
|
||||||
|
El.AddRef{$IFDEF CheckPasTreeRefCount}aID{$ENDIF};
|
||||||
|
El.Parent:=NewParent;
|
||||||
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
Decl: TPasDeclarations;
|
Decl: TPasDeclarations;
|
||||||
EnumScope: TPasEnumTypeScope;
|
EnumScope: TPasEnumTypeScope;
|
||||||
|
p: TPasElement;
|
||||||
|
MembersType: TPasMembersType;
|
||||||
begin
|
begin
|
||||||
EmitTypeHints(Parent,El);
|
EmitTypeHints(Parent,El);
|
||||||
if (El.Name<>'') or (AnonymousElTypePostfix='') then exit;
|
if (El.Name<>'') or (AnonymousElTypePostfix='') then exit;
|
||||||
if Parent.Name='' then
|
if Parent.Name='' then
|
||||||
RaiseMsg(20170415165455,nCannotNestAnonymousX,sCannotNestAnonymousX,[GetElementTypeName(El)],El);
|
RaiseMsg(20170415165455,nCannotNestAnonymousX,sCannotNestAnonymousX,[GetElementTypeName(El)],El);
|
||||||
if not (Parent.Parent is TPasDeclarations) then
|
|
||||||
RaiseMsg(20170416094735,nCannotNestAnonymousX,sCannotNestAnonymousX,[GetElementTypeName(El)],El);
|
|
||||||
if El.Parent<>Parent then
|
if El.Parent<>Parent then
|
||||||
RaiseNotYetImplemented(20190215085011,Parent);
|
RaiseNotYetImplemented(20190215085011,Parent);
|
||||||
// give anonymous sub type a name
|
// give anonymous sub type a name
|
||||||
@ -6246,11 +6273,27 @@ begin
|
|||||||
{$IFDEF VerbosePasResolver}
|
{$IFDEF VerbosePasResolver}
|
||||||
writeln('TPasResolver.FinishSubElementType parent="',GetObjName(Parent),'" named anonymous type "',GetObjName(El),'"');
|
writeln('TPasResolver.FinishSubElementType parent="',GetObjName(Parent),'" named anonymous type "',GetObjName(El),'"');
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
Decl:=TPasDeclarations(Parent.Parent);
|
|
||||||
Decl.Declarations.Add(El);
|
p:=Parent.Parent;
|
||||||
El.AddRef{$IFDEF CheckPasTreeRefCount}('TPasDeclarations.Declarations'){$ENDIF};
|
repeat
|
||||||
El.Parent:=Decl;
|
if p is TPasDeclarations then
|
||||||
Decl.Types.Add(El);
|
begin
|
||||||
|
Decl:=TPasDeclarations(p);
|
||||||
|
InsertInFront(Decl,Decl.Declarations{$IFDEF CheckPasTreeRefCount},'TPasDeclarations.Declarations'{$ENDIF});
|
||||||
|
Decl.Types.Add(El);
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
else if p is TPasMembersType then
|
||||||
|
begin
|
||||||
|
MembersType:=TPasMembersType(p);
|
||||||
|
InsertInFront(MembersType,MembersType.Members{$IFDEF CheckPasTreeRefCount},'TPasMembersType.Members'{$ENDIF});
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
p:=p.Parent;
|
||||||
|
if p=nil then
|
||||||
|
RaiseMsg(20170416094735,nCannotNestAnonymousX,sCannotNestAnonymousX,[GetElementTypeName(El)],El);
|
||||||
|
until false;
|
||||||
if (El.ClassType=TPasEnumType) and (Parent.ClassType=TPasSetType) then
|
if (El.ClassType=TPasEnumType) and (Parent.ClassType=TPasSetType) then
|
||||||
begin
|
begin
|
||||||
// anonymous enumtype
|
// anonymous enumtype
|
||||||
@ -7819,6 +7862,8 @@ begin
|
|||||||
CheckUseAsType(El.VarType,20190123095916,El);
|
CheckUseAsType(El.VarType,20190123095916,El);
|
||||||
if El.Expr<>nil then
|
if El.Expr<>nil then
|
||||||
CheckAssignCompatibility(El,El.Expr,true);
|
CheckAssignCompatibility(El,El.Expr,true);
|
||||||
|
if El.VarType.Parent=El then
|
||||||
|
FinishSubElementType(El,El.VarType);
|
||||||
end
|
end
|
||||||
else if El.Expr<>nil then
|
else if El.Expr<>nil then
|
||||||
begin
|
begin
|
||||||
@ -12278,12 +12323,17 @@ begin
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
if not (TopScope is TPasIdentifierScope) then
|
if not (TopScope is TPasIdentifierScope) then
|
||||||
RaiseInvalidScopeForElement(20160929205732,El);
|
RaiseInvalidScopeForElement(20160929205732,El);
|
||||||
AddIdentifier(TPasIdentifierScope(TopScope),El.Name,El,pikSimple);
|
if El.Name<>'' then
|
||||||
|
AddIdentifier(TPasIdentifierScope(TopScope),El.Name,El,pikSimple)
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
// anonymous enumtype
|
||||||
|
end;
|
||||||
EnumScope:=TPasEnumTypeScope(PushScope(El,TPasEnumTypeScope));
|
EnumScope:=TPasEnumTypeScope(PushScope(El,TPasEnumTypeScope));
|
||||||
// add canonical set
|
// add canonical set
|
||||||
if El.Parent is TPasSetType then
|
if El.Parent is TPasSetType then
|
||||||
begin
|
begin
|
||||||
// anonymous enumtype, e.g. "set of ()"
|
// set of anonymous enumtype, e.g. "set of ()"
|
||||||
CanonicalSet:=TPasSetType(El.Parent);
|
CanonicalSet:=TPasSetType(El.Parent);
|
||||||
CanonicalSet.AddRef{$IFDEF CheckPasTreeRefCount}('TPasEnumTypeScope.CanonicalSet'){$ENDIF};
|
CanonicalSet.AddRef{$IFDEF CheckPasTreeRefCount}('TPasEnumTypeScope.CanonicalSet'){$ENDIF};
|
||||||
end
|
end
|
||||||
@ -21051,8 +21101,8 @@ begin
|
|||||||
writeln('TPasResolver.FindElement searching scope "',CurName,'" RightPath="',RightPath,'" ...');
|
writeln('TPasResolver.FindElement searching scope "',CurName,'" RightPath="',RightPath,'" ...');
|
||||||
{AllowWriteln-}
|
{AllowWriteln-}
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
if not IsValidIdent(CurName) then
|
// Note: CurName can be a non Pascal name, when specializing an autogenerated anonymous type
|
||||||
RaiseNotYetImplemented(20170328000033,ErrorEl,CurName);
|
//if not IsValidIdent(CurName) then ;
|
||||||
if CurScopeEl<>nil then
|
if CurScopeEl<>nil then
|
||||||
begin
|
begin
|
||||||
NeedPop:=true;
|
NeedPop:=true;
|
||||||
|
@ -2159,7 +2159,6 @@ type
|
|||||||
AContext: TConvertContext): TJSElement; virtual;
|
AContext: TConvertContext): TJSElement; virtual;
|
||||||
Function CreateRTTIMemberProperty(Members: TFPList; Index: integer;
|
Function CreateRTTIMemberProperty(Members: TFPList; Index: integer;
|
||||||
AContext: TConvertContext): TJSElement; virtual;
|
AContext: TConvertContext): TJSElement; virtual;
|
||||||
Procedure CreateRTTIAnonymous(El: TPasType; AContext: TConvertContext); virtual;
|
|
||||||
Function CreateRTTIMembers(El: TPasMembersType; Src: TJSSourceElements;
|
Function CreateRTTIMembers(El: TPasMembersType; Src: TJSSourceElements;
|
||||||
FuncContext: TFunctionContext; MembersSrc: TJSSourceElements;
|
FuncContext: TFunctionContext; MembersSrc: TJSSourceElements;
|
||||||
MembersFuncContext: TFunctionContext; RTTIExpr: TJSElement;
|
MembersFuncContext: TFunctionContext; RTTIExpr: TJSElement;
|
||||||
@ -19965,23 +19964,6 @@ var
|
|||||||
ObjLit.Expr:=JS;
|
ObjLit.Expr:=JS;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function VarTypeInfoAlreadyCreated(VarType: TPasType): boolean;
|
|
||||||
var
|
|
||||||
i: Integer;
|
|
||||||
PrevMember: TPasElement;
|
|
||||||
begin
|
|
||||||
i:=Index-1;
|
|
||||||
while (i>=0) do
|
|
||||||
begin
|
|
||||||
PrevMember:=TPasElement(Members[i]);
|
|
||||||
if (PrevMember is TPasVariable) and (TPasVariable(PrevMember).VarType=VarType)
|
|
||||||
and IsElementUsed(PrevMember) then
|
|
||||||
exit(true);
|
|
||||||
dec(i);
|
|
||||||
end;
|
|
||||||
Result:=false;
|
|
||||||
end;
|
|
||||||
|
|
||||||
var
|
var
|
||||||
JSTypeInfo: TJSElement;
|
JSTypeInfo: TJSElement;
|
||||||
aName: String;
|
aName: String;
|
||||||
@ -19994,10 +19976,7 @@ begin
|
|||||||
V:=TPasVariable(Members[Index]);
|
V:=TPasVariable(Members[Index]);
|
||||||
VarType:=V.VarType;
|
VarType:=V.VarType;
|
||||||
if (VarType<>nil) and (VarType.Name='') then
|
if (VarType<>nil) and (VarType.Name='') then
|
||||||
begin
|
RaiseNotSupported(VarType,AContext,20210223022919);
|
||||||
if not VarTypeInfoAlreadyCreated(VarType) then
|
|
||||||
CreateRTTIAnonymous(VarType,AContext);
|
|
||||||
end;
|
|
||||||
|
|
||||||
JSTypeInfo:=CreateTypeInfoRef(VarType,AContext,V);
|
JSTypeInfo:=CreateTypeInfoRef(VarType,AContext,V);
|
||||||
OptionsEl:=nil;
|
OptionsEl:=nil;
|
||||||
@ -20315,37 +20294,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TPasToJSConverter.CreateRTTIAnonymous(El: TPasType;
|
|
||||||
AContext: TConvertContext);
|
|
||||||
// if El has any anonymous types, create the RTTI
|
|
||||||
var
|
|
||||||
C: TClass;
|
|
||||||
JS: TJSElement;
|
|
||||||
GlobalCtx: TFunctionContext;
|
|
||||||
Src: TJSSourceElements;
|
|
||||||
begin
|
|
||||||
if El.Name<>'' then
|
|
||||||
RaiseNotSupported(El,AContext,20170905162324,'inconsistency');
|
|
||||||
|
|
||||||
GlobalCtx:=AContext.GetGlobalFunc;
|
|
||||||
if GlobalCtx=nil then
|
|
||||||
RaiseNotSupported(El,AContext,20181229130835);
|
|
||||||
if not (GlobalCtx.JSElement is TJSSourceElements) then
|
|
||||||
begin
|
|
||||||
{$IFDEF VerbosePas2JS}
|
|
||||||
writeln('TPasToJSConverter.CreateRTTIAnonymous GlobalCtx=',GetObjName(GlobalCtx),' JSElement=',GetObjName(GlobalCtx.JSElement));
|
|
||||||
{$ENDIF}
|
|
||||||
RaiseNotSupported(El,AContext,20181229130926);
|
|
||||||
end;
|
|
||||||
Src:=TJSSourceElements(GlobalCtx.JSElement);
|
|
||||||
C:=El.ClassType;
|
|
||||||
if C=TPasArrayType then
|
|
||||||
begin
|
|
||||||
JS:=ConvertArrayType(TPasArrayType(El),AContext);
|
|
||||||
AddToSourceElements(Src,JS);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TPasToJSConverter.CreateRTTIMembers(El: TPasMembersType;
|
function TPasToJSConverter.CreateRTTIMembers(El: TPasMembersType;
|
||||||
Src: TJSSourceElements; FuncContext: TFunctionContext;
|
Src: TJSSourceElements; FuncContext: TFunctionContext;
|
||||||
MembersSrc: TJSSourceElements; MembersFuncContext: TFunctionContext;
|
MembersSrc: TJSSourceElements; MembersFuncContext: TFunctionContext;
|
||||||
|
@ -256,6 +256,11 @@ begin
|
|||||||
' this.x = $impl.TBird.$new();',
|
' this.x = $impl.TBird.$new();',
|
||||||
' this.a = rtl.arraySetLength(null, $impl.TBird, 2);',
|
' this.a = rtl.arraySetLength(null, $impl.TBird, 2);',
|
||||||
' };',
|
' };',
|
||||||
|
' this.a$a$clone = function (a) {',
|
||||||
|
' var r = [];',
|
||||||
|
' for (var i = 0; i < 2; i++) r.push($impl.TBird.$clone(a[i]));',
|
||||||
|
' return r;',
|
||||||
|
' };',
|
||||||
' this.$eq = function (b) {',
|
' this.$eq = function (b) {',
|
||||||
' return true;',
|
' return true;',
|
||||||
' };',
|
' };',
|
||||||
@ -1169,6 +1174,11 @@ begin
|
|||||||
' this.x = $impl.TBird.$new();',
|
' this.x = $impl.TBird.$new();',
|
||||||
' this.a = rtl.arraySetLength(null, $impl.TBird, 2);',
|
' this.a = rtl.arraySetLength(null, $impl.TBird, 2);',
|
||||||
' };',
|
' };',
|
||||||
|
' this.a$a$clone = function (a) {',
|
||||||
|
' var r = [];',
|
||||||
|
' for (var i = 0; i < 2; i++) r.push($impl.TBird.$clone(a[i]));',
|
||||||
|
' return r;',
|
||||||
|
' };',
|
||||||
' }, "TAnt<UnitA.TBird>");',
|
' }, "TAnt<UnitA.TBird>");',
|
||||||
' $mod.$implcode = function () {',
|
' $mod.$implcode = function () {',
|
||||||
' rtl.recNewT($impl, "TBird", function () {',
|
' rtl.recNewT($impl, "TBird", function () {',
|
||||||
|
@ -380,6 +380,7 @@ type
|
|||||||
Procedure TestEnum_ForIn;
|
Procedure TestEnum_ForIn;
|
||||||
Procedure TestEnum_ScopedNumber;
|
Procedure TestEnum_ScopedNumber;
|
||||||
Procedure TestEnum_InFunction;
|
Procedure TestEnum_InFunction;
|
||||||
|
Procedure TestEnum_Name_Anonymous_Unit;
|
||||||
Procedure TestSet_Enum;
|
Procedure TestSet_Enum;
|
||||||
Procedure TestSet_Operators;
|
Procedure TestSet_Operators;
|
||||||
Procedure TestSet_Operator_In;
|
Procedure TestSet_Operator_In;
|
||||||
@ -522,6 +523,7 @@ type
|
|||||||
Procedure TestClasS_CallInheritedConstructor;
|
Procedure TestClasS_CallInheritedConstructor;
|
||||||
Procedure TestClass_ClassVar_Assign;
|
Procedure TestClass_ClassVar_Assign;
|
||||||
Procedure TestClass_CallClassMethod;
|
Procedure TestClass_CallClassMethod;
|
||||||
|
Procedure TestClass_CallClassMethodStatic; // ToDo
|
||||||
Procedure TestClass_Property;
|
Procedure TestClass_Property;
|
||||||
Procedure TestClass_Property_ClassMethod;
|
Procedure TestClass_Property_ClassMethod;
|
||||||
Procedure TestClass_Property_Indexed;
|
Procedure TestClass_Property_Indexed;
|
||||||
@ -5949,6 +5951,34 @@ begin
|
|||||||
'']));
|
'']));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestModule.TestEnum_Name_Anonymous_Unit;
|
||||||
|
begin
|
||||||
|
StartUnit(true);
|
||||||
|
Add([
|
||||||
|
'interface',
|
||||||
|
'var color: (red, green);',
|
||||||
|
'implementation',
|
||||||
|
'initialization',
|
||||||
|
' color:=green;',
|
||||||
|
'']);
|
||||||
|
ConvertUnit;
|
||||||
|
CheckSource('TestEnum_Name_Anonymous_Unit',
|
||||||
|
LinesToStr([
|
||||||
|
'this.color$a = {',
|
||||||
|
' "0": "red",',
|
||||||
|
' red: 0,',
|
||||||
|
' "1": "green",',
|
||||||
|
' green: 1',
|
||||||
|
'};',
|
||||||
|
'this.color = 0;',
|
||||||
|
'']),
|
||||||
|
LinesToStr([ // this.$init
|
||||||
|
'$mod.color = $mod.color$a.green;',
|
||||||
|
'']),
|
||||||
|
LinesToStr([ // implementation
|
||||||
|
'']) );
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestModule.TestSet_Enum;
|
procedure TTestModule.TestSet_Enum;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
@ -9455,7 +9485,7 @@ begin
|
|||||||
' arr2[6,3]:=i;',
|
' arr2[6,3]:=i;',
|
||||||
' i:=arr2[5,2];',
|
' i:=arr2[5,2];',
|
||||||
' arr2:=arr2;',// clone multi dim static array
|
' arr2:=arr2;',// clone multi dim static array
|
||||||
//' arr3:=arr3;',// clone anonymous multi dim static array
|
' arr3:=arr3;',// clone anonymous multi dim static array
|
||||||
'']);
|
'']);
|
||||||
ConvertProgram;
|
ConvertProgram;
|
||||||
CheckSource('TestArray_StaticMultiDim',
|
CheckSource('TestArray_StaticMultiDim',
|
||||||
@ -9467,6 +9497,11 @@ begin
|
|||||||
'};',
|
'};',
|
||||||
'this.Arr = rtl.arraySetLength(null, 0, 3);',
|
'this.Arr = rtl.arraySetLength(null, 0, 3);',
|
||||||
'this.Arr2 = rtl.arraySetLength(null, 0, 2, 3);',
|
'this.Arr2 = rtl.arraySetLength(null, 0, 2, 3);',
|
||||||
|
'this.Arr3$a$clone = function (a) {',
|
||||||
|
' var r = [];',
|
||||||
|
' for (var i = 0; i < 2; i++) r.push(a[i].slice(0));',
|
||||||
|
' return r;',
|
||||||
|
'};',
|
||||||
'this.Arr3 = [[11, 12, 13], [21, 22, 23]];',
|
'this.Arr3 = [[11, 12, 13], [21, 22, 23]];',
|
||||||
'this.i = 0;'
|
'this.i = 0;'
|
||||||
]),
|
]),
|
||||||
@ -9483,6 +9518,7 @@ begin
|
|||||||
'$mod.Arr2[1][2] = $mod.i;',
|
'$mod.Arr2[1][2] = $mod.i;',
|
||||||
'$mod.i = $mod.Arr2[0][1];',
|
'$mod.i = $mod.Arr2[0][1];',
|
||||||
'$mod.Arr2 = $mod.TArrayArrayInt$clone($mod.Arr2);',
|
'$mod.Arr2 = $mod.TArrayArrayInt$clone($mod.Arr2);',
|
||||||
|
'$mod.Arr3 = $mod.Arr3$a$clone($mod.Arr3);',
|
||||||
'']));
|
'']));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -9504,6 +9540,7 @@ begin
|
|||||||
'begin',
|
'begin',
|
||||||
' arr2[5]:=arr;',
|
' arr2[5]:=arr;',
|
||||||
' arr2:=arr2;',// clone multi dim static array
|
' arr2:=arr2;',// clone multi dim static array
|
||||||
|
' arr3:=arr3;',// clone multi dim anonymous static array
|
||||||
'end;',
|
'end;',
|
||||||
'begin',
|
'begin',
|
||||||
'']);
|
'']);
|
||||||
@ -9517,6 +9554,11 @@ begin
|
|||||||
' for (var i = 0; i < 2; i++) r.push(a[i].slice(0));',
|
' for (var i = 0; i < 2; i++) r.push(a[i].slice(0));',
|
||||||
' return r;',
|
' return r;',
|
||||||
'};',
|
'};',
|
||||||
|
'var Arr3$a$clone = function (a) {',
|
||||||
|
' var r = [];',
|
||||||
|
' for (var i = 0; i < 2; i++) r.push(a[i].slice(0));',
|
||||||
|
' return r;',
|
||||||
|
'};',
|
||||||
'this.DoIt = function () {',
|
'this.DoIt = function () {',
|
||||||
' var Arr = rtl.arraySetLength(null, 0, 3);',
|
' var Arr = rtl.arraySetLength(null, 0, 3);',
|
||||||
' var Arr2 = rtl.arraySetLength(null, 0, 2, 3);',
|
' var Arr2 = rtl.arraySetLength(null, 0, 2, 3);',
|
||||||
@ -9524,6 +9566,7 @@ begin
|
|||||||
' var i = 0;',
|
' var i = 0;',
|
||||||
' Arr2[0] = Arr.slice(0);',
|
' Arr2[0] = Arr.slice(0);',
|
||||||
' Arr2 = TArrayArrayInt$1$clone(Arr2);',
|
' Arr2 = TArrayArrayInt$1$clone(Arr2);',
|
||||||
|
' Arr3 = Arr3$a$clone(Arr3);',
|
||||||
'};',
|
'};',
|
||||||
'']),
|
'']),
|
||||||
LinesToStr([ // $mod.$main
|
LinesToStr([ // $mod.$main
|
||||||
@ -11157,26 +11200,28 @@ end;
|
|||||||
procedure TTestModule.TestRecord_Assign;
|
procedure TTestModule.TestRecord_Assign;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
Add('type');
|
Add([
|
||||||
Add(' TEnum = (red,green);');
|
'type',
|
||||||
Add(' TEnums = set of TEnum;');
|
' TEnum = (red,green);',
|
||||||
Add(' TSmallRec = record');
|
' TEnums = set of TEnum;',
|
||||||
Add(' N: longint;');
|
' TSmallRec = record',
|
||||||
Add(' end;');
|
' N: longint;',
|
||||||
Add(' TBigRec = record');
|
' end;',
|
||||||
Add(' Int: longint;');
|
' TBigRec = record',
|
||||||
Add(' D: double;');
|
' Int: longint;',
|
||||||
Add(' Arr: array of longint;');
|
' D: double;',
|
||||||
Add(' Arr2: array[1..2] of longint;');
|
' Arr: array of longint;',
|
||||||
Add(' Small: TSmallRec;');
|
' Arr2: array[1..2] of longint;',
|
||||||
Add(' Enums: TEnums;');
|
' Small: TSmallRec;',
|
||||||
Add(' end;');
|
' Enums: TEnums;',
|
||||||
Add('var');
|
' end;',
|
||||||
Add(' r, s: TBigRec;');
|
'var',
|
||||||
Add('begin');
|
' r, s: TBigRec;',
|
||||||
Add(' r:=s;');
|
'begin',
|
||||||
Add(' r:=default(TBigRec);');
|
' r:=s;',
|
||||||
Add(' r:=default(s);');
|
' r:=default(TBigRec);',
|
||||||
|
' r:=default(s);',
|
||||||
|
'']);
|
||||||
ConvertProgram;
|
ConvertProgram;
|
||||||
CheckSource('TestRecord_Assign',
|
CheckSource('TestRecord_Assign',
|
||||||
LinesToStr([ // statements
|
LinesToStr([ // statements
|
||||||
@ -13474,6 +13519,41 @@ begin
|
|||||||
'']));
|
'']));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestModule.TestClass_CallClassMethodStatic;
|
||||||
|
begin
|
||||||
|
exit;
|
||||||
|
|
||||||
|
StartProgram(false);
|
||||||
|
Add([
|
||||||
|
'type',
|
||||||
|
' TObject = class',
|
||||||
|
' public',
|
||||||
|
' class var w: word;',
|
||||||
|
' class function GetIt: tobject; static;',
|
||||||
|
' end;',
|
||||||
|
'class function tobject.getit: tobject;',
|
||||||
|
'begin',
|
||||||
|
' Result.GetIt;',
|
||||||
|
' w:=3;',
|
||||||
|
' w:=w+3;',
|
||||||
|
'end;',
|
||||||
|
'var Obj: tobject;',
|
||||||
|
'begin',
|
||||||
|
' obj.GetIt;',
|
||||||
|
' obj.w:=obj.w+4;',
|
||||||
|
' with obj do begin',
|
||||||
|
' w:=w-5;',
|
||||||
|
' end;',
|
||||||
|
'']);
|
||||||
|
ConvertProgram;
|
||||||
|
CheckSource('TestClass_CallClassMethodStatic',
|
||||||
|
LinesToStr([ // statements
|
||||||
|
'this.Obj = null;'
|
||||||
|
]),
|
||||||
|
LinesToStr([ // $mod.$main
|
||||||
|
'']));
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestModule.TestClass_Property;
|
procedure TTestModule.TestClass_Property;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
@ -29490,6 +29570,9 @@ begin
|
|||||||
CheckSource('TestRTTI_Class_Field',
|
CheckSource('TestRTTI_Class_Field',
|
||||||
LinesToStr([ // statements
|
LinesToStr([ // statements
|
||||||
'rtl.createClass(this, "TObject", null, function () {',
|
'rtl.createClass(this, "TObject", null, function () {',
|
||||||
|
' $mod.$rtti.$DynArray("TObject.ArrB$a", {',
|
||||||
|
' eltype: rtl.byte',
|
||||||
|
' });',
|
||||||
' this.$init = function () {',
|
' this.$init = function () {',
|
||||||
' this.FPropA = "";',
|
' this.FPropA = "";',
|
||||||
' this.VarLI = 0;',
|
' this.VarLI = 0;',
|
||||||
@ -29521,9 +29604,6 @@ begin
|
|||||||
' $r.addField("VarShI", rtl.shortint);',
|
' $r.addField("VarShI", rtl.shortint);',
|
||||||
' $r.addField("VarBy", rtl.byte);',
|
' $r.addField("VarBy", rtl.byte);',
|
||||||
' $r.addField("VarExt", rtl.longint);',
|
' $r.addField("VarExt", rtl.longint);',
|
||||||
' $mod.$rtti.$DynArray("TObject.ArrB$a", {',
|
|
||||||
' eltype: rtl.byte',
|
|
||||||
' });',
|
|
||||||
' $r.addField("ArrA", $mod.$rtti["TObject.ArrB$a"]);',
|
' $r.addField("ArrA", $mod.$rtti["TObject.ArrB$a"]);',
|
||||||
' $r.addField("ArrB", $mod.$rtti["TObject.ArrB$a"]);',
|
' $r.addField("ArrB", $mod.$rtti["TObject.ArrB$a"]);',
|
||||||
'});',
|
'});',
|
||||||
@ -30558,6 +30638,9 @@ begin
|
|||||||
CheckSource('TestRTTI_Record',
|
CheckSource('TestRTTI_Record',
|
||||||
LinesToStr([ // statements
|
LinesToStr([ // statements
|
||||||
'rtl.recNewT(this, "TFloatRec", function () {',
|
'rtl.recNewT(this, "TFloatRec", function () {',
|
||||||
|
' $mod.$rtti.$DynArray("TFloatRec.d$a", {',
|
||||||
|
' eltype: rtl.char',
|
||||||
|
' });',
|
||||||
' this.$new = function () {',
|
' this.$new = function () {',
|
||||||
' var r = Object.create(this);',
|
' var r = Object.create(this);',
|
||||||
' r.c = [];',
|
' r.c = [];',
|
||||||
@ -30572,9 +30655,6 @@ begin
|
|||||||
' this.d = rtl.arrayRef(s.d);',
|
' this.d = rtl.arrayRef(s.d);',
|
||||||
' return this;',
|
' return this;',
|
||||||
' };',
|
' };',
|
||||||
' $mod.$rtti.$DynArray("TFloatRec.d$a", {',
|
|
||||||
' eltype: rtl.char',
|
|
||||||
' });',
|
|
||||||
' var $r = $mod.$rtti.$Record("TFloatRec", {});',
|
' var $r = $mod.$rtti.$Record("TFloatRec", {});',
|
||||||
' $r.addField("c", $mod.$rtti["TFloatRec.d$a"]);',
|
' $r.addField("c", $mod.$rtti["TFloatRec.d$a"]);',
|
||||||
' $r.addField("d", $mod.$rtti["TFloatRec.d$a"]);',
|
' $r.addField("d", $mod.$rtti["TFloatRec.d$a"]);',
|
||||||
|
Loading…
Reference in New Issue
Block a user