Forráskód Böngészése

webidl: wasmjob: rename conflicting arg names

mattias 3 éve
szülő
commit
368289d5d8
1 módosított fájl, 29 hozzáadás és 2 törlés
  1. 29 2
      packages/webidl/src/webidltopas.pp

+ 29 - 2
packages/webidl/src/webidltopas.pp

@@ -34,7 +34,7 @@ Type
     SrcFile: string;
     Resolved: TIDLDefinition;
     Constructor Create(APasName: String; D: TIDLBaseObject);
-    Property PasName: String read FPasName;
+    Property PasName: String read FPasName write FPasName;
   end;
   TPasDataClass = class of TPasData;
 
@@ -266,7 +266,7 @@ end;
 function TBaseWebIDLToPas.GetName(ADef: TIDLDefinition): String;
 
 begin
-  If Assigned(ADef) and (TObject(ADef.Data) is TPasData) then
+  If Assigned(ADef) and (ADef.Data is TPasData) then
     Result:=TPasData(ADef.Data).PasName
   else
     Result:=ADef.Name;
@@ -560,6 +560,30 @@ Var
       L.Add(NewName,Def);
   end;
 
+  procedure CheckRenameArgs(Func: TIDLFunctionDefinition);
+  var
+    i: Integer;
+    Arg: TIDLArgumentDefinition;
+    ArgName: String;
+    ConflictDef: TIDLDefinition;
+  begin
+    for i:=0 to Func.Arguments.Count-1 do
+      begin
+      Arg:=Func.Argument[i];
+      ArgName:=GetName(Arg);
+      repeat
+        ConflictDef:=TIDLDefinition(L.Items[ArgName]);
+        if (ConflictDef=Nil) then break;
+        // name conflict -> rename
+        if ArgName[1]<>'a' then
+          ArgName:='a'+ArgName
+        else
+          ArgName:='_'+ArgName;
+        (Arg.Data as TPasData).PasName:=ArgName;
+      until false;
+      end;
+  end;
+
 var
   D: TIDLDefinition;
 begin
@@ -571,6 +595,9 @@ begin
     For D in ML Do
       if (D is TIDLConstDefinition) then
         CheckRename(D);
+    For D in ML Do
+      if D is TIDLFunctionDefinition then
+        CheckRenameArgs(TIDLFunctionDefinition(D));
   finally
     L.Free;
   end;