ソースを参照

pastojs: fixed inc(classvar)

git-svn-id: trunk@40152 -
Mattias Gaertner 6 年 前
コミット
5951a3c0ce
2 ファイル変更69 行追加31 行削除
  1. 37 4
      packages/pastojs/src/fppas2js.pp
  2. 32 27
      packages/pastojs/tests/tcmodules.pas

+ 37 - 4
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;

+ 32 - 27
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;',
     '  };',