Browse Source

webidl: wasmjob: object attribute

mattias 3 years ago
parent
commit
6aaa92680c
1 changed files with 27 additions and 6 deletions
  1. 27 6
      packages/webidl/src/webidltowasmjob.pp

+ 27 - 6
packages/webidl/src/webidltowasmjob.pp

@@ -602,8 +602,9 @@ end;
 function TWebIDLToPasWasmJob.WritePrivateGetter(Attr: TIDLAttributeDefinition
 function TWebIDLToPasWasmJob.WritePrivateGetter(Attr: TIDLAttributeDefinition
   ): boolean;
   ): boolean;
 var
 var
-  FuncName, TypeName, aClassName, Code, ReadFuncName: String;
+  FuncName, TypeName, aClassName, Code, ReadFuncName, Call: String;
   Data: TPasDataWasmJob;
   Data: TPasDataWasmJob;
+  TypeDef: TIDLDefinition;
 begin
 begin
   Result:=true;
   Result:=true;
   if Attr.AttributeType=nil then
   if Attr.AttributeType=nil then
@@ -612,11 +613,16 @@ begin
 
 
   FuncName:=GetterPrefix+GetName(Attr);
   FuncName:=GetterPrefix+GetName(Attr);
   TypeName:=GetTypeName(Attr.AttributeType);
   TypeName:=GetTypeName(Attr.AttributeType);
+  TypeDef:=FindGlobalDef(Attr.AttributeType.TypeName);
+  if TypeDef is TIDLInterfaceDefinition then
+    TypeName:=ClassToPasIntfName(TypeName);
+
   AddLn('function '+FuncName+': '+TypeName+';');
   AddLn('function '+FuncName+': '+TypeName+';');
 
 
   if Data.GetterBody<>'' then exit;
   if Data.GetterBody<>'' then exit;
 
 
   aClassName:=GetName(Attr.Parent);
   aClassName:=GetName(Attr.Parent);
+  Call:='';
 
 
   case TypeName of
   case TypeName of
   'Boolean': ReadFuncName:='ReadJSPropertyBoolean';
   'Boolean': ReadFuncName:='ReadJSPropertyBoolean';
@@ -633,12 +639,15 @@ begin
   'UnicodeString': ReadFuncName:='ReadJSPropertyUnicodeString';
   'UnicodeString': ReadFuncName:='ReadJSPropertyUnicodeString';
   'TJOB_JSValue': ReadFuncName:='ReadJSPropertyValue';
   'TJOB_JSValue': ReadFuncName:='ReadJSPropertyValue';
   else
   else
-    raise EWebIDLParser.Create('not yet implemented: Getter '+Typename);
+    Call:='ReadJSPropertyObject('+Attr.Name+','''+GetTypeName(Attr.AttributeType)+''')';
   end;
   end;
 
 
+  if Call='' then
+    Call:=ReadFuncName+'('''+Attr.Name+''')';
+
   Code:='function '+aClassName+'.'+FuncName+': '+TypeName+';'+sLineBreak;
   Code:='function '+aClassName+'.'+FuncName+': '+TypeName+';'+sLineBreak;
   Code:=Code+'begin'+sLineBreak;
   Code:=Code+'begin'+sLineBreak;
-  Code:=Code+'  Result:='+ReadFuncName+'('''+Attr.Name+''');'+sLineBreak;
+  Code:=Code+'  Result:='+Call+';'+sLineBreak;
   Code:=Code+'end;'+sLineBreak;
   Code:=Code+'end;'+sLineBreak;
 
 
   Data.GetterBody:=Code;
   Data.GetterBody:=Code;
@@ -648,8 +657,9 @@ end;
 function TWebIDLToPasWasmJob.WritePrivateSetter(Attr: TIDLAttributeDefinition
 function TWebIDLToPasWasmJob.WritePrivateSetter(Attr: TIDLAttributeDefinition
   ): boolean;
   ): boolean;
 var
 var
-  FuncName, TypeName, aClassName, WriteFuncName, Code: String;
+  FuncName, TypeName, aClassName, WriteFuncName, Code, Call: String;
   Data: TPasDataWasmJob;
   Data: TPasDataWasmJob;
+  TypeDef: TIDLDefinition;
 begin
 begin
   if aoReadOnly in Attr.Options then
   if aoReadOnly in Attr.Options then
     exit(false);
     exit(false);
@@ -660,11 +670,15 @@ begin
   Result:=true;
   Result:=true;
   FuncName:=SetterPrefix+GetName(Attr);
   FuncName:=SetterPrefix+GetName(Attr);
   TypeName:=GetTypeName(Attr.AttributeType);
   TypeName:=GetTypeName(Attr.AttributeType);
+  TypeDef:=FindGlobalDef(Attr.AttributeType.TypeName);
+  if TypeDef is TIDLInterfaceDefinition then
+    TypeName:=ClassToPasIntfName(TypeName);
   AddLn('Procedure '+FuncName+'(const aValue: '+TypeName+');');
   AddLn('Procedure '+FuncName+'(const aValue: '+TypeName+');');
 
 
   if Data.SetterBody<>'' then exit;
   if Data.SetterBody<>'' then exit;
 
 
   aClassName:=GetName(Attr.Parent);
   aClassName:=GetName(Attr.Parent);
+  Call:='';
 
 
   case TypeName of
   case TypeName of
   'Boolean': WriteFuncName:='WriteJSPropertyBoolean';
   'Boolean': WriteFuncName:='WriteJSPropertyBoolean';
@@ -681,12 +695,15 @@ begin
   'UnicodeString': WriteFuncName:='WriteJSPropertyUnicodeString';
   'UnicodeString': WriteFuncName:='WriteJSPropertyUnicodeString';
   'TJOB_JSValue': WriteFuncName:='WriteJSPropertyValue';
   'TJOB_JSValue': WriteFuncName:='WriteJSPropertyValue';
   else
   else
-    raise EConvertError.Create('not yet implemented: Setter '+Typename);
+    WriteFuncName:='WriteJSPropertyObject';
   end;
   end;
 
 
+  if Call='' then
+    Call:=WriteFuncName+'('''+Attr.Name+''',aValue)';
+
   Code:='Procedure '+aClassName+'.'+FuncName+'(const aValue: '+TypeName+');'+sLineBreak;
   Code:='Procedure '+aClassName+'.'+FuncName+'(const aValue: '+TypeName+');'+sLineBreak;
   Code:=Code+'begin'+sLineBreak;
   Code:=Code+'begin'+sLineBreak;
-  Code:=Code+'  '+WriteFuncName+'('''+Attr.Name+''',aValue);'+sLineBreak;
+  Code:=Code+'  '+Call+';'+sLineBreak;
   Code:=Code+'end;'+sLineBreak;
   Code:=Code+'end;'+sLineBreak;
 
 
   Data.SetterBody:=Code;
   Data.SetterBody:=Code;
@@ -697,6 +714,7 @@ function TWebIDLToPasWasmJob.WriteProperty(Attr: TIDLAttributeDefinition
   ): boolean;
   ): boolean;
 var
 var
   PropName, TypeName, Code: String;
   PropName, TypeName, Code: String;
+  TypeDef: TIDLDefinition;
 begin
 begin
   if Attr.AttributeType=nil then
   if Attr.AttributeType=nil then
     begin
     begin
@@ -705,6 +723,9 @@ begin
     end;
     end;
   PropName:=GetName(Attr);
   PropName:=GetName(Attr);
   TypeName:=GetTypeName(Attr.AttributeType);
   TypeName:=GetTypeName(Attr.AttributeType);
+  TypeDef:=FindGlobalDef(Attr.AttributeType.TypeName);
+  if TypeDef is TIDLInterfaceDefinition then
+    TypeName:=ClassToPasIntfName(TypeName);
   Code:='Property '+PropName+': '+TypeName+' read '+GetterPrefix+PropName;
   Code:='Property '+PropName+': '+TypeName+' read '+GetterPrefix+PropName;
   if not (aoReadOnly in Attr.Options) then
   if not (aoReadOnly in Attr.Options) then
     Code:=Code+' write '+SetterPrefix+PropName;
     Code:=Code+' write '+SetterPrefix+PropName;