Browse Source

pastojs: fixed await() as aclass, issue 39028

mattias 3 years ago
parent
commit
664a96c584

+ 5 - 0
packages/fcl-passrc/src/pasresolver.pp

@@ -13502,8 +13502,13 @@ begin
         begin
         begin
         if (LeftResolved.IdentEl is TPasType)
         if (LeftResolved.IdentEl is TPasType)
             or (not (rrfReadable in LeftResolved.Flags)) then
             or (not (rrfReadable in LeftResolved.Flags)) then
+          begin
+          { $IFDEF VerbosePasResolver}
+          writeln('TPasResolver.ComputeBinaryExprRes as-operator: left=',GetResolverResultDbg(LeftResolved),' right=',GetResolverResultDbg(RightResolved));
+          { $ENDIF}
           RaiseIncompatibleTypeRes(20180204124711,nOperatorIsNotOverloadedAOpB,
           RaiseIncompatibleTypeRes(20180204124711,nOperatorIsNotOverloadedAOpB,
             [OpcodeStrings[Bin.OpCode]],LeftResolved,RightResolved,Bin);
             [OpcodeStrings[Bin.OpCode]],LeftResolved,RightResolved,Bin);
+          end;
         if RightResolved.IdentEl=nil then
         if RightResolved.IdentEl=nil then
           RaiseXExpectedButYFound(20170216152630,'class',GetElementTypeName(RightResolved.LoTypeEl),Bin.right);
           RaiseXExpectedButYFound(20170216152630,'class',GetElementTypeName(RightResolved.LoTypeEl),Bin.right);
         if not (RightResolved.IdentEl is TPasType) then
         if not (RightResolved.IdentEl is TPasType) then

+ 1 - 0
packages/pastojs/src/fppas2js.pp

@@ -6232,6 +6232,7 @@ begin
     // await(T;promise):T
     // await(T;promise):T
     end;
     end;
   ComputeElement(Param,ResolvedEl,[]);
   ComputeElement(Param,ResolvedEl,[]);
+  ResolvedEl.IdentEl:=nil;
   Include(ResolvedEl.Flags,rrfReadable);
   Include(ResolvedEl.Flags,rrfReadable);
   if Proc=nil then ;
   if Proc=nil then ;
 end;
 end;

+ 62 - 0
packages/pastojs/tests/tcmodules.pas

@@ -909,6 +909,7 @@ type
     Procedure TestAsync_Inherited;
     Procedure TestAsync_Inherited;
     Procedure TestAsync_ClassInterface;
     Procedure TestAsync_ClassInterface;
     Procedure TestAsync_ClassInterface_AsyncMissmatchFail;
     Procedure TestAsync_ClassInterface_AsyncMissmatchFail;
+    Procedure TestAWait_ClassAs;
 
 
     // Library
     // Library
     Procedure TestLibrary_Empty;
     Procedure TestLibrary_Empty;
@@ -33996,6 +33997,67 @@ begin
   ConvertProgram;
   ConvertProgram;
 end;
 end;
 
 
+procedure TTestModule.TestAWait_ClassAs;
+begin
+  StartProgram(false);
+  Add([
+  '{$mode objfpc}',
+  '{$modeswitch externalclass}',
+  'type',
+  '  TJSPromise = class external name ''Promise''',
+  '  end;',
+  '  TObject = class',
+  '    function Run: TObject; async;',
+  '  end;',
+  '  TBird = class',
+  '    function Fly: TBird; async;',
+  '  end;',
+  'function TObject.Run: TObject; async;',
+  'begin',
+  'end;',
+  'function TBird.Fly: TBird;', // async modifier not needed in impl
+  'var o: TObject;',
+  'begin',
+  '  o:=await(TObject,Run);',
+  '  o:=await(TObject,Fly);',
+  '  o:=await(TBird,Fly);',
+  '  o:=await(TObject,inherited Run);',
+  '  o:=await(TObject,inherited Run) as TBird;',
+  'end;',
+  'begin',
+  '  ']);
+  ConvertProgram;
+  CheckSource('TestAWait_ClassAs',
+    LinesToStr([ // statements
+    'rtl.createClass(this, "TObject", null, function () {',
+    '  this.$init = function () {',
+    '  };',
+    '  this.$final = function () {',
+    '  };',
+    '  this.Run = async function () {',
+    '    var Result = null;',
+    '    return Result;',
+    '  };',
+    '});',
+    'rtl.createClass(this, "TBird", this.TObject, function () {',
+    '  this.Fly = async function () {',
+    '    var Result = null;',
+    '    var o = null;',
+    '    o = await this.Run();',
+    '    o = await this.Fly();',
+    '    o = await this.Fly();',
+    '    o = await $mod.TObject.Run.call(this);',
+    '    o = rtl.as(await $mod.TObject.Run.call(this), $mod.TBird);',
+    '    return Result;',
+    '  };',
+    '});',
+    '']),
+    LinesToStr([
+    '']));
+  CheckResolverUnexpectedHints();
+
+end;
+
 procedure TTestModule.TestLibrary_Empty;
 procedure TTestModule.TestLibrary_Empty;
 begin
 begin
   StartLibrary(false);
   StartLibrary(false);