Selaa lähdekoodia

webidl: fixed property

mattias 3 vuotta sitten
vanhempi
commit
b3e7d867cf
1 muutettua tiedostoa jossa 27 lisäystä ja 15 poistoa
  1. 27 15
      packages/webidl/src/webidltowasmjob.pp

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

@@ -72,7 +72,7 @@ type
   Protected
     function BaseUnits: String; override;
     // Auxiliary routines
-    function GetPasClassName(const aName: string): string; overload;
+    function GetPasClassName(const aName: string): string; overload; // convert to PasInterfacePrefix+X+FPasInterfaceSuffix
       override;
     function IntfToPasClassName(const aName: string): string; virtual;
     function ComputeGUID(const Prefix: string; aList: TIDLDefinitionList): string; virtual;
@@ -749,8 +749,10 @@ end;
 function TWebIDLToPasWasmJob.WritePrivateGetter(Attr: TIDLAttributeDefinition
   ): boolean;
 var
-  FuncName, TypeName, aClassName, Code, ReadFuncName, Call: String;
   Data: TPasDataWasmJob;
+  FuncName, aClassName, Code, ReadFuncName, Call,
+    AttrTypeName, AttrResolvedTypeName: String;
+  AttrType: TIDLDefinition;
 begin
   Result:=true;
   if Attr.AttributeType=nil then
@@ -758,16 +760,18 @@ begin
   Data:=Attr.Data as TPasDataWasmJob;
 
   FuncName:=GetterPrefix+GetName(Attr);
-  TypeName:=GetTypeName(Attr.AttributeType);
+  AttrType:=GetResolvedType(Attr.AttributeType,AttrTypeName,AttrResolvedTypeName);
 
-  AddLn('function '+FuncName+': '+TypeName+';');
+  if AttrType is TIDLInterfaceDefinition then
+    AttrTypeName:=GetPasIntfName(AttrType);
+  AddLn('function '+FuncName+': '+AttrTypeName+';');
 
   if Data.GetterBody<>'' then exit;
 
   aClassName:=GetName(Attr.Parent);
   Call:='';
 
-  case TypeName of
+  case AttrResolvedTypeName of
   'Boolean': ReadFuncName:='ReadJSPropertyBoolean';
   'ShortInt',
   'Byte',
@@ -782,13 +786,13 @@ begin
   'UnicodeString': ReadFuncName:='ReadJSPropertyUnicodeString';
   'TJOB_JSValue': ReadFuncName:='ReadJSPropertyValue';
   else
-    Call:='ReadJSPropertyObject('''+Attr.Name+''','+GetTypeName(Attr.AttributeType)+')';
+    Call:='ReadJSPropertyObject('''+Attr.Name+''','+GetName(AttrType)+') as '+AttrTypeName;
   end;
 
   if Call='' then
     Call:=ReadFuncName+'('''+Attr.Name+''')';
 
-  Code:='function '+aClassName+'.'+FuncName+': '+TypeName+';'+sLineBreak;
+  Code:='function '+aClassName+'.'+FuncName+': '+AttrTypeName+';'+sLineBreak;
   Code:=Code+'begin'+sLineBreak;
   Code:=Code+'  Result:='+Call+';'+sLineBreak;
   Code:=Code+'end;'+sLineBreak;
@@ -800,8 +804,10 @@ end;
 function TWebIDLToPasWasmJob.WritePrivateSetter(Attr: TIDLAttributeDefinition
   ): boolean;
 var
-  FuncName, TypeName, aClassName, WriteFuncName, Code, Call: String;
+  FuncName, aClassName, WriteFuncName, Code, Call,
+    AttrTypeName, AttrResolvedTypeName: String;
   Data: TPasDataWasmJob;
+  AttrType: TIDLDefinition;
 begin
   if aoReadOnly in Attr.Options then
     exit(false);
@@ -811,15 +817,18 @@ begin
 
   Result:=true;
   FuncName:=SetterPrefix+GetName(Attr);
-  TypeName:=GetTypeName(Attr.AttributeType);
-  AddLn('procedure '+FuncName+'(const aValue: '+TypeName+');');
+  AttrType:=GetResolvedType(Attr.AttributeType,AttrTypeName,AttrResolvedTypeName);
+  if AttrType is TIDLInterfaceDefinition then
+    AttrTypeName:=GetPasIntfName(AttrType);
+
+  AddLn('procedure '+FuncName+'(const aValue: '+AttrTypeName+');');
 
   if Data.SetterBody<>'' then exit;
 
   aClassName:=GetName(Attr.Parent);
   Call:='';
 
-  case TypeName of
+  case AttrResolvedTypeName of
   'Boolean': WriteFuncName:='WriteJSPropertyBoolean';
   'ShortInt',
   'Byte',
@@ -840,7 +849,7 @@ begin
   if Call='' then
     Call:=WriteFuncName+'('''+Attr.Name+''',aValue)';
 
-  Code:='procedure '+aClassName+'.'+FuncName+'(const aValue: '+TypeName+');'+sLineBreak;
+  Code:='procedure '+aClassName+'.'+FuncName+'(const aValue: '+AttrTypeName+');'+sLineBreak;
   Code:=Code+'begin'+sLineBreak;
   Code:=Code+'  '+Call+';'+sLineBreak;
   Code:=Code+'end;'+sLineBreak;
@@ -852,7 +861,8 @@ end;
 function TWebIDLToPasWasmJob.WriteProperty(Attr: TIDLAttributeDefinition
   ): boolean;
 var
-  PropName, TypeName, Code: String;
+  PropName, Code, AttrTypeName, AttrResolvedTypeName: String;
+  AttrType: TIDLDefinition;
 begin
   if Attr.AttributeType=nil then
     begin
@@ -860,8 +870,10 @@ begin
     exit;
     end;
   PropName:=GetName(Attr);
-  TypeName:=GetTypeName(Attr.AttributeType);
-  Code:='property '+PropName+': '+TypeName+' read '+GetterPrefix+PropName;
+  AttrType:=GetResolvedType(Attr.AttributeType,AttrTypeName,AttrResolvedTypeName);
+  if AttrType is TIDLInterfaceDefinition then
+    AttrTypeName:=GetPasIntfName(AttrType);
+  Code:='property '+PropName+': '+AttrTypeName+' read '+GetterPrefix+PropName;
   if not (aoReadOnly in Attr.Options) then
     Code:=Code+' write '+SetterPrefix+PropName;
   AddLn(Code+';');