Browse Source

webidl: Promise as IJSPromise

mattias 2 years ago
parent
commit
7f4841c76d

+ 3 - 1
packages/webidl/src/webidltopas.pp

@@ -1024,7 +1024,7 @@ end;
 procedure TBaseWebIDLToPas.WritePromiseDef(aDef: TIDLPromiseTypeDefDefinition);
 
 begin
-  AddLn(GetName(aDef)+' = '+ClassPrefix+'Promise'+ClassSuffix+';');
+  // AddLn(GetName(aDef)+' = '+ClassPrefix+'Promise'+ClassSuffix+';');
 end;
 
 procedure TBaseWebIDLToPas.WriteAliasTypeDef(aDef: TIDLTypeDefDefinition);
@@ -1730,6 +1730,8 @@ begin
     ResolveTypeDef(TIDLArgumentDefinition(D).ArgumentType)
   else if D is TIDLSequenceTypeDefDefinition then
     ResolveTypeDef(TIDLSequenceTypeDefDefinition(D).ElementType)
+  else if D is TIDLPromiseTypeDefDefinition then
+    ResolveTypeDef(TIDLPromiseTypeDefDefinition(D).ReturnType)
   else if D is TIDLTypeDefDefinition then
     ResolveTypeName(TIDLTypeDefDefinition(D).TypeName)
   else if D is TIDLConstDefinition then

+ 10 - 2
packages/webidl/src/webidltowasmjob.pp

@@ -274,7 +274,9 @@ function TWebIDLToPasWasmJob.GetResolvedType(aDef: TIDLTypeDefDefinition; out
 begin
   Result:=inherited GetResolvedType(aDef, aTypeName, aResolvedTypename);
   if Result is TIDLInterfaceDefinition then
-    aTypeName:=GetPasClassName(aTypeName);
+    aTypeName:=GetPasClassName(aTypeName)
+  else if Result is TIDLPromiseTypeDefDefinition then
+    aTypeName:=PasInterfacePrefix+'Promise'+PasInterfaceSuffix;
 end;
 
 function TWebIDLToPasWasmJob.GetInterfaceDefHead(Intf: TIDLInterfaceDefinition
@@ -512,6 +514,8 @@ begin
       InvokeName:='InvokeJSObjectResult';
       if ReturnDef is TIDLSequenceTypeDefDefinition then
         InvokeClassName:=ClassPrefix+'Array'+ClassSuffix
+      else if ReturnDef is TIDLPromiseTypeDefDefinition then
+        InvokeClassName:=ClassPrefix+'Promise'+ClassSuffix
       else if ReturnDef is TIDLInterfaceDefinition then
         InvokeClassName:=GetName(ReturnDef)
       else if ResolvedReturnTypeName=PasInterfacePrefix+'Object'+PasInterfaceSuffix then
@@ -653,7 +657,9 @@ begin
     end;
   end;
   if ReturnDef is TIDLSequenceTypeDefDefinition then
-    ReturnTypeName:='IJSArray';
+    ReturnTypeName:=PasInterfacePrefix+'Array'+PasInterfaceSuffix
+  else if ReturnDef is TIDLPromiseTypeDefDefinition then
+    ReturnTypeName:=PasInterfacePrefix+'Promise'+PasInterfaceSuffix;
 
   Args:=aDef.Arguments;
 
@@ -820,6 +826,8 @@ begin
   else
     if AttrType is TIDLSequenceTypeDefDefinition then
       ObjClassName:=ClassPrefix+'Array'+ClassSuffix
+    else if AttrType is TIDLPromiseTypeDefDefinition then
+      ObjClassName:=ClassPrefix+'Promise'+ClassSuffix
     else
       begin
       ObjClassName:=GetName(AttrType);

+ 53 - 0
packages/webidl/tests/tcwebidl2wasmjob.pas

@@ -44,6 +44,7 @@ type
     // functions
     procedure TestWJ_IntfFunction_Void;
     procedure TestWJ_IntfFunction_SetEventHandler;
+    procedure TestWJ_IntfFunction_Promise;
   end;
 
 function LinesToStr(Args: array of const): string;
@@ -566,6 +567,58 @@ begin
   '']);
 end;
 
+procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_Promise;
+begin
+  //  Promise<void> exitFullscreen();
+  TestWebIDL([
+  'interface Attr {',
+  '  Promise<void> exitFullscreen();',
+  '  Promise<any> addCertException(boolean isTemporary);',
+  '};',
+  ''],
+  ['Type',
+  '  // Forward class definitions',
+  '  IJSAttr = interface;',
+  '  TJSAttr = class;',
+  '  { --------------------------------------------------------------------',
+  '    TJSAttr',
+  '    --------------------------------------------------------------------}',
+  '',
+  '  IJSAttr = interface(IJSObject)',
+  '    [''{74BB0007-0E0F-3C31-A77E-B1C656002861}'']',
+  '    function exitFullscreen: IJSPromise;',
+  '    function addCertException(aIsTemporary: Boolean): IJSPromise;',
+  '  end;',
+  '',
+  '  TJSAttr = class(TJSObject,IJSAttr)',
+  '  Private',
+  '  Public',
+  '    function exitFullscreen: IJSPromise;',
+  '    function addCertException(aIsTemporary: Boolean): IJSPromise;',
+  '    class function Cast(Intf: IJSObject): IJSAttr;',
+  '  end;',
+  '',
+  'implementation',
+  '',
+  'function TJSAttr.exitFullscreen: IJSPromise;',
+  'begin',
+  '  Result:=InvokeJSObjectResult(''exitFullscreen'',[],TJSPromise) as IJSPromise;',
+  'end;',
+  '',
+  'function TJSAttr.addCertException(aIsTemporary: Boolean): IJSPromise;',
+  'begin',
+  '  Result:=InvokeJSObjectResult(''addCertException'',[aIsTemporary],TJSPromise) as IJSPromise;',
+  'end;',
+  '',
+  'class function TJSAttr.Cast(Intf: IJSObject): IJSAttr;',
+  'begin',
+  '  Result:=TJSAttr.JOBCast(Intf);',
+  'end;',
+  '',
+  'end.',
+  '']);
+end;
+
 initialization
   RegisterTests([TTestWebIDL2Wasmjob]);