From 9b1d5ef92a2abfe43fe2df53ca8f054c465f9f19 Mon Sep 17 00:00:00 2001
From: mattias <nc-gaertnma@netcologne.de>
Date: Mon, 25 Jul 2022 18:49:45 +0200
Subject: [PATCH] webidl: nicer error messages, fixed function returning Object

---
 packages/webidl/src/webidltopas.pp     |  6 ++++++
 packages/webidl/src/webidltowasmjob.pp | 18 +++++++++++++++++-
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/packages/webidl/src/webidltopas.pp b/packages/webidl/src/webidltopas.pp
index b14d8ce7d5..e238474c6a 100644
--- a/packages/webidl/src/webidltopas.pp
+++ b/packages/webidl/src/webidltopas.pp
@@ -278,6 +278,8 @@ end;
 
 function TBaseWebIDLToPas.GetPasClassName(const aName: string): string;
 begin
+  if aName='' then
+    raise EConvertError.Create('[20220725184209] empty name');
   Result:=ClassPrefix+aName+ClassSuffix;
 end;
 
@@ -1499,6 +1501,8 @@ begin
   CN:=D.Name;
   if D Is TIDLInterfaceDefinition then
     begin
+    if CN='' then
+      raise EConvertError.Create('[20220725184324] at '+GetDefPos(D));
     if not TIDLInterfaceDefinition(D).IsPartial then
       AddJSIdentifier(D);
     CN:=ClassPrefix+CN+ClassSuffix;
@@ -1508,6 +1512,8 @@ begin
     end
   else if D Is TIDLDictionaryDefinition then
     begin
+    if CN='' then
+      raise EConvertError.Create('[20220725184410] at '+GetDefPos(D));
     if not TIDLDictionaryDefinition(D).IsPartial then
       AddJSIdentifier(D);
     if coDictionaryAsClass in BaseOptions then
diff --git a/packages/webidl/src/webidltowasmjob.pp b/packages/webidl/src/webidltowasmjob.pp
index 45eaf4eb27..0e44e8d2da 100644
--- a/packages/webidl/src/webidltowasmjob.pp
+++ b/packages/webidl/src/webidltowasmjob.pp
@@ -143,6 +143,8 @@ begin
   and (RightStr(Result,length(ClassSuffix))=ClassSuffix)
   then
     Result:=copy(Result,length(ClassPrefix)+1,length(Result)-length(ClassPrefix)-length(ClassSuffix));
+  if Result='' then
+    raise EConvertError.Create('[20220725184518]');
   Result:=PasInterfacePrefix+Result+PasInterfaceSuffix;
 end;
 
@@ -153,6 +155,8 @@ begin
   and (RightStr(Result,length(PasInterfaceSuffix))=PasInterfaceSuffix)
   then
     Result:=copy(Result,length(PasInterfacePrefix)+1,length(Result)-length(PasInterfacePrefix)-length(PasInterfaceSuffix));
+  if Result='' then
+    raise EConvertError.Create('[20220725184440]');
   Result:=ClassPrefix+Result+ClassSuffix;
 end;
 
@@ -244,13 +248,20 @@ begin
     and (LeftStr(Result,length(PasInterfacePrefix))<>PasInterfacePrefix)
     and (RightStr(Result,length(PasInterfaceSuffix))<>PasInterfaceSuffix)
     then
+      begin
+      if Result='' then
+        raise EConvertError.Create('[20220725184536]');
       Result:=PasInterfacePrefix+Result+PasInterfaceSuffix;
+      end;
   end;
 end;
 
 function TWebIDLToPasWasmJob.GetPasIntfName(Intf: TIDLDefinition): string;
 begin
-  Result:=GetPasClassName(GetName(Intf));
+  Result:=GetName(Intf);
+  if Result='' then
+    raise EConvertError.Create('[20220725184653] missing name at '+GetDefPos(Intf));
+  Result:=GetPasClassName(Result);
 end;
 
 function TWebIDLToPasWasmJob.GetInterfaceDefHead(Intf: TIDLInterfaceDefinition
@@ -456,6 +467,7 @@ begin
     'QWord': InvokeName:='InvokeJSMaxIntResult';
     'Single',
     'Double': InvokeName:='InvokeJSDoubleResult';
+    'UTF8String',
     'UnicodeString': InvokeName:='InvokeJSUnicodeStringResult';
     'TJOB_JSValue': InvokeName:='InvokeJSValueResult';
     'void','undefined':
@@ -473,6 +485,10 @@ begin
         InvokeClassName:=ReturnTypeName;
         ReturnTypeName:=GetPasIntfName(ReturnDef);
         end
+      else if ResolvedReturnTypeName=PasInterfacePrefix+'Object'+PasInterfaceSuffix then
+        begin
+        InvokeClassName:=ClassPrefix+'Object'+ClassSuffix;
+        end
       else
         raise EConvertError.Create('[20220725172242] not yet supported: function return type '+ResolvedReturnTypeName+' '+ReturnDef.ClassName+' at '+GetDefPos(aDef));
     end;