pastojs: fixed assigning class var of descended classes

git-svn-id: trunk@40168 -
This commit is contained in:
Mattias Gaertner 2018-11-01 22:40:57 +00:00
parent 3f50c51225
commit c39cc4475f
2 changed files with 62 additions and 41 deletions

View File

@ -6584,6 +6584,16 @@ begin
begin
Result:=ConvertTObjectFree_Bin(El,RightEl,AContext);
exit;
end
else if (RightRef.Access in rraAllWrite)
and aResolver.IsClassField(RightRefDecl) then
begin
// e.g. "Something.aClassVar:=" -> "aClass.aClassVar:="
Left:=CreateReferencePathExpr(RightRefDecl.Parent,AContext);
Result:=TJSDotMemberExpression(CreateElement(TJSDotMemberExpression,El));
TJSDotMemberExpression(Result).MExpr:=Left;
TJSDotMemberExpression(Result).Name:=TJSString(TransformVariableName(RightRefDecl,AContext));
exit;
end;
end;
@ -6847,6 +6857,7 @@ var
Value: TResEvalValue;
aResolver: TPas2JSResolver;
BracketExpr: TJSBracketMemberExpression;
PathExpr: TJSElement;
begin
Result:=nil;
if not (El.CustomData is TResolvedReference) then
@ -6954,6 +6965,16 @@ begin
CallImplicit(Decl);
exit;
end
else if (Ref.Access in rraAllWrite)
and aResolver.IsClassField(Decl) then
begin
// writing a class var -> aClass.VarName
PathExpr:=CreateReferencePathExpr(Decl.Parent,AContext);
Result:=TJSDotMemberExpression(CreateElement(TJSDotMemberExpression,El));
TJSDotMemberExpression(Result).MExpr:=PathExpr;
TJSDotMemberExpression(Result).Name:=TJSString(TransformVariableName(Decl,AContext));
exit;
end
else if Decl.ClassType=TPasConst then
begin
if TPasConst(Decl).IsConst and (TPasConst(Decl).Expr<>nil) then
@ -6963,10 +6984,10 @@ begin
if Value<>nil then
try
if Value.Kind in [revkNil,revkBool,revkInt,revkUInt,revkFloat,revkEnum] then
begin
begin
Result:=ConvertConstValue(Value,AContext,El);
exit;
end;
end;
finally
ReleaseEvalValue(Value);
end;
@ -9389,7 +9410,6 @@ begin
// left side is a variable
if AssignContext.RightSide=nil then
RaiseInconsistency(20180622211919,El);
end;
// convert inc(avar,b) to a+=b

View File

@ -448,7 +448,8 @@ type
Procedure TestClass_CallInherited_NoParams;
Procedure TestClass_CallInherited_WithParams;
Procedure TestClasS_CallInheritedConstructor;
Procedure TestClass_ClassVar;
Procedure TestClass_ClassVar_Assign;
//ToDo Procedure TestClass_ClassVar_Arg;
Procedure TestClass_CallClassMethod;
Procedure TestClass_Property;
Procedure TestClass_Property_ClassMethod;
@ -9957,7 +9958,7 @@ begin
]));
end;
procedure TTestModule.TestClass_ClassVar;
procedure TTestModule.TestClass_ClassVar_Assign;
begin
StartProgram(false);
Add([
@ -9991,7 +9992,7 @@ begin
' obj.sub:=nil;',
' obj.sub.sub:=nil;']);
ConvertProgram;
CheckSource('TestClass_ClassVar',
CheckSource('TestClass_ClassVar_Assign',
LinesToStr([ // statements
'rtl.createClass($mod,"TObject",null,function(){',
' this.vI = 0;',
@ -10001,15 +10002,15 @@ begin
' this.$final = function () {',
' };',
' this.Create = function(){',
' this.$class.vI = this.vI+1;',
' this.$class.vI = this.vI+1;',
' this.$class.vI += 1;',
' $mod.TObject.vI = this.vI+1;',
' $mod.TObject.vI = this.vI+1;',
' $mod.TObject.vI += 1;',
' };',
' this.GetIt = function(Par){',
' var Result = null;',
' this.vI = this.vI + Par;',
' this.vI = this.vI + Par;',
' this.vI += 1;',
' $mod.TObject.vI = this.vI + Par;',
' $mod.TObject.vI = this.vI + Par;',
' $mod.TObject.vI += 1;',
' Result = this.Sub;',
' return Result;',
' };',
@ -10021,8 +10022,8 @@ begin
'$mod.TObject.vI = 3;',
'if ($mod.TObject.vI === 4);',
'$mod.TObject.Sub=null;',
'$mod.Obj.$class.Sub=null;',
'$mod.Obj.Sub.$class.Sub=null;',
'$mod.TObject.Sub=null;',
'$mod.TObject.Sub=null;',
'']));
end;
@ -10079,25 +10080,25 @@ begin
' this.$final = function () {',
' };',
' this.Create = function(){',
' this.$class.Sub = this.$class.GetIt(3);',
' this.$class.vI = this.GetMore(4);',
' this.$class.Sub = this.$class.GetIt(5);',
' this.$class.vI = this.GetMore(6);',
' $mod.TObject.Sub = this.$class.GetIt(3);',
' $mod.TObject.vI = this.GetMore(4);',
' $mod.TObject.Sub = this.$class.GetIt(5);',
' $mod.TObject.vI = this.GetMore(6);',
' };',
' this.GetMore = function(Par){',
' var Result = 0;',
' this.$class.Sub = this.$class.GetIt(11);',
' this.$class.vI = this.GetMore(12);',
' this.$class.Sub = this.$class.GetIt(13);',
' this.$class.vI = this.GetMore(14);',
' $mod.TObject.Sub = this.$class.GetIt(11);',
' $mod.TObject.vI = this.GetMore(12);',
' $mod.TObject.Sub = this.$class.GetIt(13);',
' $mod.TObject.vI = this.GetMore(14);',
' return Result;',
' };',
' this.GetIt = function(Par){',
' var Result = null;',
' this.Sub = this.GetIt(21);',
' this.vI = this.Sub.GetMore(22);',
' this.Sub = this.GetIt(23);',
' this.vI = this.Sub.GetMore(24);',
' $mod.TObject.Sub = this.GetIt(21);',
' $mod.TObject.vI = this.Sub.GetMore(22);',
' $mod.TObject.Sub = this.GetIt(23);',
' $mod.TObject.vI = this.Sub.GetMore(24);',
' return Result;',
' };',
'});',
@ -10108,7 +10109,7 @@ begin
'$mod.TObject.GetIt(5);',
'$mod.Obj.$class.GetIt(6);',
'$mod.Obj.Sub.$class.GetIt(7);',
'$mod.Obj.Sub.$class.GetIt(8).$class.Sub=null;',
'$mod.TObject.Sub=null;',
'$mod.Obj.Sub.$class.GetIt(9).$class.GetIt(10);',
'$mod.Obj.Sub.$class.GetIt(11).Sub.$class.GetIt(12);',
'']));
@ -11768,8 +11769,8 @@ begin
' function Sub() {',
' Self.Key = Self.Key + 2;',
' Self.Key = Self.Key + 3;',
' Self.$class.State = Self.State + 4;',
' Self.$class.State = Self.State + 5;',
' $mod.TObject.State = Self.State + 4;',
' $mod.TObject.State = Self.State + 5;',
' $mod.TObject.State = $mod.TObject.State + 6;',
' Self.SetSize(Self.GetSize() + 7);',
' Self.SetSize(Self.GetSize() + 8);',
@ -11777,8 +11778,8 @@ begin
' Sub();',
' Self.Key = Self.Key + 12;',
' Self.Key = Self.Key + 13;',
' Self.$class.State = Self.State + 14;',
' Self.$class.State = Self.State + 15;',
' $mod.TObject.State = Self.State + 14;',
' $mod.TObject.State = Self.State + 15;',
' $mod.TObject.State = $mod.TObject.State + 16;',
' Self.SetSize(Self.GetSize() + 17);',
' Self.SetSize(Self.GetSize() + 18);',
@ -11844,8 +11845,8 @@ begin
' function Sub() {',
' Self.Key = Self.Key + 2;',
' Self.Key = Self.Key + 3;',
' Self.$class.State = Self.State + 4;',
' Self.$class.State = Self.State + 5;',
' $mod.TObject.State = Self.State + 4;',
' $mod.TObject.State = Self.State + 5;',
' $mod.TObject.State = $mod.TObject.State + 6;',
' Self.SetSize(Self.GetSize() + 7);',
' Self.SetSize(Self.GetSize() + 8);',
@ -11853,8 +11854,8 @@ begin
' Sub();',
' Self.Key = Self.Key + 12;',
' Self.Key = Self.Key + 13;',
' Self.$class.State = Self.State + 14;',
' Self.$class.State = Self.State + 15;',
' $mod.TObject.State = Self.State + 14;',
' $mod.TObject.State = Self.State + 15;',
' $mod.TObject.State = $mod.TObject.State + 16;',
' Self.SetSize(Self.GetSize() + 17);',
' Self.SetSize(Self.GetSize() + 18);',
@ -11910,16 +11911,16 @@ begin
' this.DoIt = function () {',
' var Self = this;',
' function Sub() {',
' Self.State = Self.State + 2;',
' Self.State = Self.State + 3;',
' $mod.TObject.State = Self.State + 2;',
' $mod.TObject.State = Self.State + 3;',
' $mod.TObject.State = $mod.TObject.State + 4;',
' Self.SetSize(Self.GetSize() + 5);',
' Self.SetSize(Self.GetSize() + 6);',
' $mod.TObject.SetSize($mod.TObject.GetSize() + 7);',
' };',
' Sub();',
' Self.State = Self.State + 12;',
' Self.State = Self.State + 13;',
' $mod.TObject.State = Self.State + 12;',
' $mod.TObject.State = Self.State + 13;',
' $mod.TObject.State = $mod.TObject.State + 14;',
' Self.SetSize(Self.GetSize() + 15);',
' Self.SetSize(Self.GetSize() + 16);',
@ -12478,7 +12479,7 @@ begin
'this.C = null;'
]),
LinesToStr([ // $mod.$main
'$mod.C.id = $mod.C.id;',
'$mod.TObject.id = $mod.C.id;',
'']));
end;
@ -12628,7 +12629,7 @@ begin
' b = this === null;',
' b = this.GlobalId === 3;',
' b = 4 === this.GlobalId;',
' this.GlobalId = 5;',
' $mod.TObject.GlobalId = 5;',
' this.ProcA();',
' };',
'});'