diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index a8bdc54558..d299815451 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -9310,10 +9310,11 @@ var Expr, SrcEl: TPasExpr; ExprResolved: TPasResolverResult; ExprArg: TPasArgument; - ValueJS: TJSElement; + LHS, ValueJS: TJSElement; Call: TJSCallExpression; IsInc: Boolean; AddJS: TJSAdditiveExpression; + AssignContext: TAssignContext; begin Result:=nil; IsInc:=CompareText((El.Value as TPrimitiveExpr).Value,'inc')=0; @@ -9330,6 +9331,8 @@ begin // check target variable AssignSt:=nil; Call:=nil; + AssignContext:=nil; + LHS:=nil; try if ExprResolved.IdentEl is TPasArgument then begin @@ -9367,14 +9370,38 @@ begin RaiseNotSupported(Expr,AContext,20170501151316); end; + AssignContext:=TAssignContext.Create(Expr,nil,AContext); + AContext.Resolver.ComputeElement(Expr,AssignContext.LeftResolved,[rcNoImplicitProc]); + SetResolverValueExpr(AssignContext.RightResolved, + AssignContext.LeftResolved.BaseType,AssignContext.LeftResolved.LoTypeEl, + AssignContext.LeftResolved.HiTypeEl,Expr,[rrfReadable]); + AssignContext.RightSide:=ValueJS; + ValueJS:=nil; + LHS:=ConvertElement(Expr,AssignContext); + + if AssignContext.Call<>nil then + begin + // left side is a Setter -> RightSide was already inserted as parameter + RaiseNotSupported(El,AContext,20181101154351); + end + else + begin + // left side is a variable + if AssignContext.RightSide=nil then + RaiseInconsistency(20180622211919,El); + + end; + // convert inc(avar,b) to a+=b if IsInc then AssignSt:=TJSAddEqAssignStatement(CreateElement(TJSAddEqAssignStatement,SrcEl)) else AssignSt:=TJSSubEqAssignStatement(CreateElement(TJSSubEqAssignStatement,SrcEl)); - AssignSt.LHS:=ConvertExpression(El.Params[0],AContext); - AssignSt.Expr:=ValueJS; - ValueJS:=nil; + + AssignSt.LHS:=LHS; + LHS:=nil; + AssignSt.Expr:=AssignContext.RightSide; + AssignContext.RightSide:=nil; Result:=AssignSt; finally ValueJS.Free; @@ -9382,6 +9409,12 @@ begin begin AssignSt.Free; Call.Free; + LHS.Free; + end; + if AssignContext<>nil then + begin + AssignContext.RightSide.Free; + AssignContext.Free; end; end; end; diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index 64ae575a1b..b3aa7ba24b 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/packages/pastojs/tests/tcmodules.pas @@ -9960,33 +9960,36 @@ end; procedure TTestModule.TestClass_ClassVar; begin StartProgram(false); - Add('type'); - Add(' TObject = class'); - Add(' public'); - Add(' class var vI: longint;'); - Add(' class var Sub: TObject;'); - Add(' constructor Create;'); - Add(' class function GetIt(Par: longint): tobject;'); - Add(' end;'); - Add('constructor tobject.create;'); - Add('begin'); - Add(' vi:=vi+1;'); - Add(' Self.vi:=Self.vi+1;'); - Add('end;'); - Add('class function tobject.getit(par: longint): tobject;'); - Add('begin'); - Add(' vi:=vi+par;'); - Add(' Self.vi:=Self.vi+par;'); - Add(' Result:=self.sub;'); - Add('end;'); - Add('var Obj: tobject;'); - Add('begin'); - Add(' obj:=tobject.create;'); - Add(' tobject.vi:=3;'); - Add(' if tobject.vi=4 then ;'); - Add(' tobject.sub:=nil;'); - Add(' obj.sub:=nil;'); - Add(' obj.sub.sub:=nil;'); + Add([ + 'type', + ' TObject = class', + ' public', + ' class var vI: longint;', + ' class var Sub: TObject;', + ' constructor Create;', + ' class function GetIt(Par: longint): tobject;', + ' end;', + 'constructor tobject.create;', + 'begin', + ' vi:=vi+1;', + ' Self.vi:=Self.vi+1;', + ' inc(vi);', + 'end;', + 'class function tobject.getit(par: longint): tobject;', + 'begin', + ' vi:=vi+par;', + ' Self.vi:=Self.vi+par;', + ' inc(vi);', + ' Result:=self.sub;', + 'end;', + 'var Obj: tobject;', + 'begin', + ' obj:=tobject.create;', + ' tobject.vi:=3;', + ' if tobject.vi=4 then ;', + ' tobject.sub:=nil;', + ' obj.sub:=nil;', + ' obj.sub.sub:=nil;']); ConvertProgram; CheckSource('TestClass_ClassVar', LinesToStr([ // statements @@ -10000,11 +10003,13 @@ begin ' this.Create = function(){', ' this.$class.vI = this.vI+1;', ' this.$class.vI = this.vI+1;', + ' this.$class.vI += 1;', ' };', ' this.GetIt = function(Par){', ' var Result = null;', ' this.vI = this.vI + Par;', ' this.vI = this.vI + Par;', + ' this.vI += 1;', ' Result = this.Sub;', ' return Result;', ' };',